C++友元习题
数据结构-C语言版:三元组例题
![数据结构-C语言版:三元组例题](https://img.taocdn.com/s3/m/b265b260bf1e650e52ea551810a6f524ccbfcbd9.png)
E[1..max]
m
n t (a) tl的存储结构
i jv (b) tl中第k个元素tl.e[k]
算法transpose是用类程序设计语言描述的一种稀疏矩阵转置
算法,即将三元组表tl1转置后放入三元组表tl2中。该算法通过
统计每列的非零元素的个数从而直接确定转置后的每行的第一 个非零元素存储位置。
类程序设计语言描述形式:符号&开头的参数为输入/输出参 数。算法中,“←”为赋值号。
6)执行算法,当
时,所有循环
(4);
一次也不执行。
cpos[col]← cpos[col]+1; 7)上述算法中共有4个for循环,将非零元
}
素的行号、列号交换并放入转置后矩阵的对
}
应位置的操作是在第
个for循环中
}
实现的。
参考答案
(1) tl2.t←tl1.t (2) num[tl1.e[t].j]+1 (3) cpos[1]←1 (4) tl2.e[q].v←tl1.e[p].v; (5) 顺序 (6) 非零元素个数为0(或tl2.t=0) (7) 4
if tl2.t<>0 then
第i行)非零元素的待插入位置//
{ for col←1 to tl1.n do
//col,t,p,q均为整型//
num[col]←0;
for t←1 to tl1.t do
num[tl1.e[t].j]←
(2) ;
(3)//置非零元素待插位置初始值//
for col←2 to tl1.n do
Algorithm transpose(tl1,&tl2) //tl1,tl2为三元组,tl2为转置后的三元组//
第10章C语言程序设计习题答案
![第10章C语言程序设计习题答案](https://img.taocdn.com/s3/m/c7ff1e06844769eae009ed32.png)
cout<<c.GetArea()<<endl;
cout<<c.GetPerimeter()<<endl;
}
9.定义一个坐标类,有横坐标和纵坐标两个属性及输出坐标位置成员函数,重载“+”使其可以对两个坐标类对象进行求和。
#include<iostream.h>
class coordinate
{
public:
cylinder(float r,float h)
{
radius=r;
height=h;
}
float Volume();
private:
float radius;
float height;
};
float cylinder::Volume()
{
return 3.14*radius*radius*height;
⑶、当类的继承方式为私有(private)继承时,基类的公有(public)成员和保护(protected)成员将成为派生类的私有成员,而基类的私有成员不能被派生类访问。
5.定义一个圆柱体类,其属性为圆柱体的底面半径和高,能计算出圆柱体的体积。
#include<iostream.h>
class cylinder
{
private:
int x_axis;
int y_axis;
public:
coordinate(int x=0,int y=0)
{
x_axis=x;
y_axis=y;
}
void PrintCoordinate()
{
cout<<x_axis<<","<<y_axis<<endl;
C++语言选择题40道:C++友元函数与友元类.Tex
![C++语言选择题40道:C++友元函数与友元类.Tex](https://img.taocdn.com/s3/m/3ed29c46c381e53a580216fc700abb68a982ad8e.png)
C++友元函数与友元类选择题1.以下哪项正确描述了友元函数的作用?o A. 它可以访问类的所有私有成员和保护成员。
o B. 它只能访问类的公有成员。
o C. 它是用来替代类的成员函数。
o D. 它提高了类的封装性。
答案: A解析: 友元函数被声明在类中以访问类的私有和保护成员,但不属于类的成员函数,因此不提高封装性。
2.友元函数的声明应出现在类的哪一部分?o A. public部分o B. protected部分o C. private部分o D. 不需要出现在特定部分答案: A解析: 友元函数可以声明在类的public、protected或private部分,但通常为了控制访问权限而放在private部分。
3.以下代码中,display函数是否是A类的友元函数?o B. 不是o C. 只有当display函数被声明在A类中时才是。
o D. 友元函数必须与类定义在同一个文件中。
答案: B解析: display函数没有被声明为A类的友元,因此它不能访问A类的私有成员。
4.如何正确声明友元类?o A. 在类的定义中使用friend关键字。
o B. 使用class关键字在类定义内部声明。
o C. 在类的外部使用friend关键字。
o D. 友元类不需要特殊声明。
答案: A解析: 友元类应在需要被访问的类中使用friend关键字声明。
5.一个友元类的所有成员函数可以访问另一个类的哪些成员?o A. 所有成员,包括私有和保护。
o B. 只能访问公有成员。
o C. 只有在friend声明中指定的成员。
o D. 友元类不能访问另一个类的成员。
答案: A解析: 友元类的所有成员函数可以访问另一个类的所有成员,包括私有和保护成员。
6.在类B中声明A类为友元,以下哪项是正确的?o B. friend class A;o C. friend A B;o D. friend B A;答案: B解析: 正确的声明应为friend class A;在B类的定义中。
4. 友元
![4. 友元](https://img.taocdn.com/s3/m/2f48e886e53a580216fcfe58.png)
#include <iostream.h> class Complex { friend Complex Add( Complex first, Complex second);
// 定义友元函数 friend void Print( Complex com); // 定义友元函数 private: float real; float imag;
例4.1 :设计一个类作为另一个类的友元类 的简单说明性例子。 有 两 个 类 , 分 别 是 类 YourClass 和 类 YourOtherClass 。 定 义 类 YourOtherClass 为 类 YourClass的友元类。在友元类YourOtherClass中 定义一个成员函数,其功能是把类YourClass中 的私有数据成员topSecret的值加1。
public: Complex( float re = 0, float im = 0):real(re), imag(im) {} ~Complex(void) {} }; Complex Add( Complex first, Complex second ) // 加法函数实现
{
return Complex( first.real + second.real,
需要说明的是,面向对象程序设计把 一个对象的私有信息隐藏起来,不准外部程序 随意修改,这种模块封装性和信息隐藏机制是 面向对象方法的主要特征之一,对提高软件的 可靠性、可维护性和可扩充性起了关键的作用。 这种限制有时也使程序设计相对麻烦,并且会 使程序运行效率降低。C++语言增加友元,主 要是出于提高程序运行效率的考虑,这样虽然 可方便编程,提高有些代码的运行效率,但它 破坏了类的封装性和面向对象程序设计的信息 隐藏原则,因此,在实际程序设计时要权衡利 弊,慎重使用。
C++中友元的实例详解
![C++中友元的实例详解](https://img.taocdn.com/s3/m/32b38430bdd126fff705cc1755270722192e591f.png)
C++中友元的实例详解C++中友元的实例详解尽管友元被授予从外部访问类的私有部分的权限,但他们并不与⾯向对象的编程思想相悖;相反他提⾼了公共接⼝的灵活性。
⼀、友元类友元声明可以位于公有、私有活保护部分、其所在位置⽆关紧要我直接贴出⼀个摘⾃< c++ primer plus >的例⼦来演⽰ c++ 友元类其中 Remote 为 Tv的友元类。
Tv.h#ifndef TV_H_#define TV_H_/*⼀个类电视 */class Tv{public:friend class Remote; //Remote类可以访问Tv Privite 的私有部分enum {off,on //开关};enum{MinVal,MaxVal=20 //⾳量};enum {Antena,Cable //使⽤的天线、还是电缆};enum{TV ,DVD //⼯作模式};Tv(int s = off, int mc = 125) :state(s), volume(5), maxchannel(mc),channel(5), mode(Cable), input(TV) {}void onoff() { state = (state == on) ? off : on; }bool ison()const { return state == on; }bool volup(); //增⼤声⾳bool voldown(); //减⼩声⾳void chanup(); //频道 +void chandown();//频道 -void set_mode() { mode = (mode == Antena) ? Cable : Antena; }void set_input() { input = (input == TV) ? DVD : TV; }void settings()const; //显⽰所有设置private:int state; // 开或者关int volume; // ⾳量int maxchannel; //最⼤int channel; //当前频道int mode; // ⼴播还是电缆int input; //Tv 或者 DVD};/*Remote 的定义(遥控器) */class Remote {private :int mode; // 控制 TV 或 DVDpublic:Remote(int m = Tv::TV) :mode(m) {}bool volup(Tv & t) { return t.volup(); }bool voldown(Tv & t) { return t.voldown(); }void onoff(Tv & t) { return t.onoff(); }void chanup(Tv & t) { return t.chanup(); }void chandown(Tv & t) { return t.chandown(); }void set_chan(Tv &t, int c) { t.channel = c; } //访问了Tv的私有成员void set_mode(Tv &t) { t.set_mode(); }void set_input(Tv &t) { t.set_input(); }};#endif // TV_H_Tv.cpp#include "stdafx.h"#include "Tv.h"#include <iostream>bool Tv::volup() {if (volume < MaxVal) {volume++;return true;}else {return false;}}bool Tv::voldown() {if (volume > MinVal) {volume--;return true;}else {return false;}}void Tv::chanup() {if (channel < maxchannel) channel++;else channel = 1;}void Tv::chandown() {if (channel > 1) channel--;else channel = maxchannel;}void Tv::settings() const {using std::cout;using std::endl;cout << "TV is " << (state == off ? "off" : "on") << endl;if (state == on) {cout << "Volume setting =" << volume << endl;cout << "Channel setting = " << channel << endl;cout << "Mode = " << (mode == Antena ? "antenna" : "cable") << endl; cout << "Input = " << (input == TV ? "TV" : "DVD") << endl;}}测试代码:#include "stdafx.h"#include "tv.h"#include <iostream>int main(){using std::cout;Tv s42;cout << "Initial settings for 42 \" Tv: \n";s42.settings();s42.onoff();s42.chanup();cout << " \n Adjusted settings for 42 \" Tv: \n";s42.chanup();cout << "\n Adjusted settings for 42 \" Tv: \n";s42.settings();Remote grey;grey.set_chan(s42, 10);grey.volup(s42);grey.volup(s42);cout << " \n s42 \" settings after using remote: \n";s42.settings();Tv s58(Tv::on);s58.set_mode();grey.set_chan(s58, 58);cout << " \n s58 \" setting: \n";s58.settings();system("pause");return 0;}运⾏结果:Initial settings for 42 " Tv:TV is offAdjusted settings for 42 " Tv:Adjusted settings for 42 " Tv:TV is onVolume setting =5Channel setting = 7Mode = cableInput = TVs42 " settings after using remote:TV is onVolume setting =7Channel setting = 10Mode = cableInput = TVs58 " setting:TV is onVolume setting =5Channel setting = 58Mode = antennaInput = TV请按任意键继续. . .上述代码中将Remote类设置成为了Tv类的友元类,但事实上我们看到:唯⼀访问Tv的成员的⽅法是void set_chan(Tv &t, int c) { t.channel = c; } ,因此它是唯⼀需要友元的⽅法。
C 习题与答案
![C 习题与答案](https://img.taocdn.com/s3/m/4df18244b4daa58da1114a3b.png)
第一章习题一、选择填空1.下列各种高级语言中,()是面向对象的程序设计语言。
A.BASIC;B.PASCAL;C.C++D.Ada2.下列各种高级语言中,()是最早提出了对象的概念。
A.Algol60;B.Simula67;C.Smalltalk;D.C++3.下述面向对象抽象的原理中,()是不对的。
A.数据抽象;B.行为共享;C.进化;D.兼容;4.()不是面向对象系统所包含的要数。
A.重载;B.对象;C.类;D.继承;5.关于C++与C语言的关系的描述中,()是错误的。
A.C语言是C++的一个子集;B.C语言与C++是兼容的;C.C++对C语言进行了一些改进;D.C++和C语言都是面向对象的;6.下面关于对象概念的描述中,()是错误的。
A.对象就是C语言中的结构变量;B.对象代表着正在创建的系统中的一个实体;C.对象是一个状态和操作(或方法)的封装体;D.对象之间的信息传递是通过消息进行的;7.下面关于类概念的描述中,()是错误的。
A.类是抽象数据类型的实现;B.类是具有共同行为的若干对象的统一描述体;C.类是创建对象的样板;D.类就是C语言中的结构类型;8.C++对C语言作了很多改进,下列描述中()使得C语言发生了质变,即从面向过程变成为面向对象。
A.增加了一些新的运算符;B.允许函数重载,并允许设置缺省参数;C.规定函数说明必须用原型;D.引进了类和对象的概念;9.按照标识符的要求,()符号不能组成标识符。
A.连接符;B.下划线;C.大小写字母;D.数字字符;10.下列符号中,()不可作为分隔符。
A.,;B.:;C.?;D.;二、判断下列描述的正确性,对者划√,错者划×。
1.C++引进了引用的概念,对编程带来了很多方便。
Y2.C++允许使用友元,但是友元会破坏封装性。
Y3.C++中使用了新的注释符(//),C语言中注释符(/*…*/)不能在C++中使用。
X4.C++中为了减轻使用者的负担,与C语言相比较C++中减少了一些运算符。
最新内蒙古科技大学面向对象的程序设计实验6-静态成员和友元
![最新内蒙古科技大学面向对象的程序设计实验6-静态成员和友元](https://img.taocdn.com/s3/m/b7031179763231126fdb113b.png)
内蒙古科技大学面向对象的程序设计实验报告一、实验目的1.理解静态成员(静态数据成员、静态成员函数)的作用与使用;2.理解友元(友元函数、友元类)的作用于使用。
二、实验环境编译器:Visual C++ 6.0.操作系统:Windows 7旗舰版三、实验内容二、实验内容2.1练习(一):1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
#include <iostream.h>#include <string.h>class CStudent{public:CStudent(char *n, int a);~CStudent();static void SetAge(int age);private:char *name;int age;static int nTotalObj;};int CStudent::nTotalObj = 0;CStudent::CStudent(char *n, int a):age(a){int nLen = strlen(n);name = new char[nLen+1];strcpy(name,n);name[nLen] = ’\0’;nTotalObj++;}CStudent::~CStudent(){delete[] name;nTotalObj--;}void CStudent::SetAge(int age){this->age = age;}void main(){CStudent stu1("张三",25);CStudent str2("李四",26);cout<<"CStudent::nTotalObj="<<CStudent::nTotalObj<<endl;}问题一:以上程序编译能通过吗,为什么?问题二:成员变量nTotalObj在程序中起什么作用,它是如何实现的?问题三:如果规定该程序的主函数和类CStudent中的成员变量的属性不允许改变,应该如何改正该程序?2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
2016C语言习题全集及答案:第八单元结构体和共用体
![2016C语言习题全集及答案:第八单元结构体和共用体](https://img.taocdn.com/s3/m/84229f3c3069a45177232f60ddccda38376be1c4.png)
第八单元结构体和共用体一、选择题1、说明一个结构体变量时系统分配给它的内存是。
A. 各成员所需要内存量的总和B. 结构体中第一个成员所需内存量C. 成员中占内存量最大者所需的容量D. 结构中最后一个成员所需内存量2、 C 语言结构体类型变量在程序执行期间。
A. 所有成员一直驻留在内存中B. 只有一个成员驻留在内存中C. 部分成员驻留在在内存中D. 没有成员驻留在内存中3、设有以下说明语句struct stu { int a ; float b ; } stutype ;则下面的叙述不正确的是。
A. struct 是结构体类型的关键字B. struct stu 是用户定义的结构体类型C. stutype 是用户定义的结构体类型名D. a 和b 都是结构体成员名4、程序中有下面的说明和定义struct abc { int x;char y;}struct abc s1,s2;则会发生的情况是。
A. 编译出错B. 程序将顺利编译、连接、执行C. 能顺利通过编译、连接、但不能执行D. 能顺利通过编译、但连接出错5、有如下定义struct person { char name[9]; int age;};struct person class[10]={ " Johu", 17,"Paul", 19,"Mary", 18,"Adam",16};根据上述定义,能输出字母M 的语句是。
A. prinft(" %c\n",class[3].name);B. printf(" %c\n",class[3].name[1]);C. prinft(" %c\n",class[2].name[1]);D. printf(" %c\n",class[2].name[0]);6、下面程序的输出是。
C++习题(友元)
![C++习题(友元)](https://img.taocdn.com/s3/m/7ecf3880d4d8d15abe234ecb.png)
2
5. 分析以下程序执行的结果 void print(student &a,teacher &b)
#include<iostream.h> class teacher; class student { char *name; public: student(char *s){name=s;} friend void print(student &,teacher &); }; class teacher { char *name; public: teacher(char *s){name=s;} friend void print(student &,teacher &); };
100
4. 分析以下程序执行的结果
#include<iostream.h> class B; class A { int i; friend B; void disp(){cout<<i<<endl;} }; class B { public: void set(int n) { A a; a.i=n; // i是对象 的私有数据成员,在友元类可以使用 是对象a的私有数据成员 是对象 的私有数据成员, a.disp(); // disp()是对象 的私有成员函数,在友元类可以使用 是对象a的私有成员函数 是对象 的私有成员函数, } }; void main() { B b; b.set(2); }
C++习题(友元)
1.e<iostream.h> class Sample { int n; public: Sample(int i){n=i;} friend int add(Sample &s1,Sample &s2); }; int add(Sample &s1,Sample &s2) { return s1.n+s2.n; } void main() { Sample s1(10),s2(20); cout<<add(s1,s2)<<endl; }
习题二C++练习(含有答案)
![习题二C++练习(含有答案)](https://img.taocdn.com/s3/m/49eeab2459eef8c75fbfb3c3.png)
习题二一、填空题1. 对运算符进行重载时,不能改变结合性,不能改变操作数个数,不能改变优先级。
2. 当++被重载为后置成员函数时需要0 个参数。
3. 当++被重载为前置成员函数时需要 1 个参数。
4. 在C++中,运算符重载函数可以是成员函数,也可以是友元函数,还可以是普通函数。
5. 友元破坏了类的封装性特性。
6. 类的友元能够访问这个类的所有成员。
7. 类的静态数据成员的初始化是在类外进行的。
8. 类的静态成员函数没有this指针。
9. 类的静态成员函数访问该类的非静态成员可以通过参数传递对象来实现。
10. 不能被重载的类成员函数是构造和析构函数。
二、选择题1. 已知类A有一个带double型参数的构造函数,且将运算符“+”重载为该类友元函数,若如下语句:A x(2.5),y(3.6),z(0); z=x+y; 能够正常运行,运算符重载函数operator+ 应在类中声明为( D )。
A. friend A operator+ (double , double) ;B. friend A operator+ ( double , A &);C. friend A operator+ ( A &, double);D. friend A operator+ ( A & , A &);2. 下列关于运算符重载的描述中,正确的是(D )。
A. 运算符重载可以改变操作数的个数B. 运算符重载可以改变优先级C. 运算符重载可以改变结合性D. 运算符重载不可以改变语法结构3. 友元运算符表达式obj1>obj2被C++编译器解释为(A )。
A. operator>(obj1,obj2)B. >(obj1,obj2)C. obj2.operator>(obj1)D. obj1.operator>(obj2)4. 下列关于C++运算符函数的返回类型的描述中,错误的是(C )。
c++友元函数实例两则
![c++友元函数实例两则](https://img.taocdn.com/s3/m/29ce9ace2cc58bd63186bdb6.png)
1. 友元定义:一般来说,仅仅只有类的成员函数能访问类的私有或者保护成员,如果我们声明一个公共的函数作为这个类的友元,这个函数也可以访问类的私有成员。
友元是C++里面用来破坏类的封装的一个机制。
我们可以使用类的友元或者类的友元函数.2.友元函数友元函数是类的非成员函数(普通函数),在类的里面声明,必须在函数前面加上关键词“friend” 。
和普通函数类似,友元函数能够在类的里面或者外面被实现。
友元函数必须通过类的对象名来访问类的数据成员。
友元函数实例1-computing distance between two points源程序:#include <iostream.h>#include <math.h>class Point{public:Point(double xx=0, double yy=0);double GetX() {return X;}double GetY() {return Y;}friend double Dist(Point &a, Point &b);private:double X,Y;};Point::Point(double xx, double yy){X=xx; Y=yy;}double Dist( Point& a, Point& b){double dx=a.X-b.X;double dy=a.Y-b.Y;return sqrt(dx*dx+dy*dy);}void main(){Point p1(3.0, 5.0), p2(4.0, 6.0);double d=Dist(p1, p2);cout<<"The distance is "<<d<<endl;cout<<p1.GetX()<<"\t"<<p1.GetY()<<endl;}运行结果:The distance is 1.414213 53. 友元类如果一个B类是另一个A类的友元,那么B类所有的成员函数能够访问A类的所有成员,反之,亦然。
C++基础-友元专题
![C++基础-友元专题](https://img.taocdn.com/s3/m/ebd7e37501f69e31433294d1.png)
C++基础-友元专题发信站: 南京大学小百合站 (Thu Dec 23 15:46:36 2010)友元友元提供了在不同类的成员函数之间、类的成员函数与一般函数之间进行数据公享的机制。
通过友元关系,一个普通函数或一个类中的成员函数可以访问其他类中的私有和保护成员。
声明为友元的外界对象既可以是不属于任何类的一般函数,也可以是另一个类的成员函数,还可以是整个类(此时该类中的所有成员函数都称为友元函数)。
友元函数在类中说明友元函数的一般格式为:friend <类型><友元函数名>(<参数列表>) ;在<参数列表>中,通常包含一个与该友元函数具有友元关系的类的类型的参数,该参数可以是一般类型、指针类型或引用类型,但通常为引用类型。
友元函数的定义和调用方式与一般函数一样,只是在类中要进行友元声明。
1.友元函数并不是相应类的成员函数,由于它没有隐含的*this指针,所以它不能象成员函数那样直接访问和修改类的成员。
2.友元函数必须在类的定义中说明,其函数体可在类体外定义,也可在类体内定义,在类体外定义时,在函数的前面不要加作用域运算符“::”,也不要加关键字friend,它可以通过参数,或对象访问该类中的所有成员(公有的、私有的和保护的)。
而一般函数只能访问类中的公有成员。
3.友元函数不是类的成员函数,所以不受类中访问权限的限制,可以把它放在类的私有部分、公有部分或保护部分,其作用都是一样的。
4.友元函数不是类的成员函数,所以它的作用域与成员函数不同。
不管在类体外定义还是在类体内定义友元函数,友元函数的作用域都与一般函数的作用域相同。
如例1中的友元函数都具有文件作用域,可在程序中的任何位置调用它。
5.如果类中有指针类型的数据,且用动态方式分配,则在友元函数中该类类型的参数都要是引用类型,否则在运行时会出错。
6.友元函数是一种外部函数访问类中私有成员或保护成员的有效工具,如果使用不当,则是非常危险的。
C++友元函数
![C++友元函数](https://img.taocdn.com/s3/m/515cbdec534de518964bcf84b9d528ea81c72fc4.png)
C++友元函数1、为什么要引⼊友元函数:在实现类之间数据共享时,减少系统开销,提⾼效率c++利⽤friend修饰符,可以让⼀些你设定的函数能够对这些保护数据进⾏操作,避免把类成员全部设置成public,最⼤限度的保护数据成员的安全。
具体来说:为了使其他类的成员函数直接访问该类的私有变量即:允许外⾯的类或函数去访问类的私有变量和保护变量,从⽽使两个类共享同⼀函数(友元函数不是类的成员函数,是普通函数)优点:能够提⾼效率,表达简单、清晰缺点:友元函数破环了封装机制,尽量使⽤成员函数,除⾮不得已的情况下才使⽤友元函数。
2、什么时候使⽤友元函数:1)运算符重载的某些场合需要使⽤友元。
2)两个类要共享数据的时候3、怎么使⽤友元函数:友元函数的参数:因为友元函数没有this指针,则参数要有三种情况:1、要访问⾮static成员时,需要对象做参数;--常⽤(友元函数常含有参数)2、要访问static成员或全局变量时,则不需要对象做参数3、如果做参数的对象是全局对象,则不需要对象做参数友元函数的位置:因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。
友元函数的调⽤:可以直接调⽤友元函数,不需要通过对象或指针友元函数:友元函数是可以直接访问类的私有成员的⾮成员函数。
它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:friend 类型函数名(形式参数);友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的⼀个友元函数。
⼀个函数可以是多个类的友元函数,只需要在各个类中分别声明。
友元函数的调⽤与⼀般函数的调⽤⽅式和原理⼀致。
友元类:友元类的所有成员函数都是另⼀个类的友元函数,都可以访问另⼀个类中的隐藏信息(包括私有成员和保护成员)。
当希望⼀个类可以存取另⼀个类的私有成员时,可以将该类声明为另⼀类的友元类。
《c++程序设计》评估试题 (20)
![《c++程序设计》评估试题 (20)](https://img.taocdn.com/s3/m/d2e21416590216fc700abb68a98271fe910eafc1.png)
“C++程序设计”知识点评估题学习知识点后请完成以下练习题
1)友元的关键字是( )。
(单选)
A.mutable
B.friend
C.extern
D.explicit
2)哪些可以设置为友元( )。
(单选)
A.全局函数
B.成员函数
C.类
D.上面选项可以
3)友元函数的作用是什么,下列那个选择最正确( )。
(单选)
A.访问类的私有成员属性
B.访问对象成员属性
C.访问任意成员属性
D.上面都不对
4)友元函数不是类的成员,其不带this指针,这个说法正确吗( )。
(判断)
A.正确
B.错误
5)关于友元类下列说法正确的有( )。
(多选)
A.友元关系不能被继承
B.友元关系是单向的。
C.友元关系不具有传递性
D.友元关系具有传递性
第 1 页共1 页。
编程题20_友元的使用
![编程题20_友元的使用](https://img.taocdn.com/s3/m/b2ec5f7df242336c1eb95ed7.png)
int main ( )
{
Boy b1("Nike",19),b2("Mike",32);
Girl g("Alice",18);
b1.print ( );
b2.print ( );
g.print ( );
g.VisitBoy (b1);
VisitBoyGirl(b1,g);
{
cout<<<<","<<b.age<<endl;
cout<<<<","<<g.age<<endl;
}
int main( )
{
Boy b1("Nike",19),b2("Mike",32);
Girl g("Alice",18);
b1.print( );
b2.print( );
return 0;
}
提示:
(1)各输出项之间以一个逗号分隔,不留其他空格,每行换行,注意测试用例结果的输出形式
(2)友元类的声明方式(所有编译器下通用): friend class类名;注意,class不要省略
在保存并预览之后,点开:“测试用例”选项卡,再选择下方的“添加”,加入一组测试用例,该用例只有输出无输入
g.print( );
g.VisitBoy (b1);
VisitBoyGirl(b1,g);
return 0;
}
参考源代码仅供老师参考,不要添加到系统中
允许的编程语言:选g++3.3,
C++习题七课后答案
![C++习题七课后答案](https://img.taocdn.com/s3/m/b035707e168884868762d631.png)
习题7解答注:如有错误,请谅解!1、填空题(1)私有成员(2)构造函数(3)private(4)公有成员函数的集合(5)公有成员(6)友元(7)类的静态成员(8)this(9)new(10)非const 成员函数(11)构造(12)const char * const(13)AB(AB& X)(14)—>(15)生存期结束程序运行结束时(16)析构函数2、选择题(1)A (2)B (3)C(4)B(5)B(6)B(7)B(8)A(9)A(10)B(11)C(12)B(13)C(14)D(15)A(16)D(17)D(18)A(19)B(20)D(21)B(22)B(23)C(24)D(25)A(26)B(27)A(28)B(29)C(30)D(31)B(32)B (33)D3、简答题(1)类和数据类型有何关联?答:类相当于一种包含函数的自定义数据类型,它不占内存空间,是一个抽象的“虚”体,使用已定义的类建立对象就像用数据类型定义变量一样。
对象建立后,对象占据内存,变成了一个“实”体。
类与对象的关系就像数据类型与变量的关系一样。
其实,一个变量就是一个简单的不含成员函数的数据对象。
(2)类和对象的内存分配关系如何?答:为节省内存,编译器在创建对象时,只为各对象分配用于保存各对象数据成员初始化的值,并不为各对象的成员函数分配单独的内存空间,而是共享类的成员函数定义,即类中成员函数的定义为该类的所有对象所共享,这是C++编译器创建对象的一种方法,在实际应用中,我们仍要将对象理解为由数据成员和函数成员两部分组成。
(3)什么是浅拷贝?什么是深拷贝?二者有何异同?答:构造函数用于建立对象时给对象赋初值以初始化新建立的对象。
如果有一个现存的对象,在建立新对象时希望利用现存对象作为新对象的初值,即用一个已存在的对象去初始化一个新建立的对象。
C++提供的拷贝构造函数用于在建立新对象时将已存在对象的数据成员值复制给新对象,以初始化新对象。
二级C++-5-2
![二级C++-5-2](https://img.taocdn.com/s3/m/a14d60120b1c59eef8c7b4d7.png)
二级C++-5-2(总分:83.00,做题时间:90分钟)一、{{B}}选择题{{/B}}(总题数:35,分数:55.00)1.下面对于友元函数描述正确的是∙ A.友元函数的实现必须在类的内部定义∙ B.友元函数是类的成员函数∙ C.友元函数破坏了类的封装性和隐藏性∙ D.友元函数不能访问类的私有成员(分数:1.00)A.B.C. √D.解析:解析:友元函数的定义既可以在类内部进行,也可以在类外部进行。
它提高了程序的运行效率,但破坏了类的封装性和隐藏性,使得类的非成员函数可以访问类的私有成员。
2.程序中有如下语句for(int i=0;i<5;i++)cout<<*(p+i)<<",";能够依次输出int型一维数组a的前5个元素。
由此可知,变量P的定义及初始化语句是{{U}} {{/U}}。
∙ A. int*p=a;∙ B. int p=a;∙ C. *p=a;∙ D. p=a;(分数:2.00)A. √B.C.D.解析:[解析] 从循环语句中可以看出,是在0~4的循环中输出数组a中的前,5个元素,输出的值为*(p+i),即为指针p向后移动指向的元素。
所以初始化要将指针p指向数组a,即int*P=a;。
3.关于类和对象不正确的说法是{{U}} {{/U}}。
∙ A. 类是一种类型,它封装了数据和操作∙ B. 对象是类的实例∙ C. 一个类的对象只有一个∙ D. 一个对象必属于某个类(分数:2.00)A.B.C. √D.解析:[解析] 一个类可以声明多个对象。
4.下列关于圆括号运算符的功能说法不正确的是 ______。
∙ A. 可用于强制类型转换∙ B. 可用于类型构造∙ C. 可用于类型声明∙ D. 可用于函数调用(分数:2.00)A.B.C. √D.解析:5.考虑下面的函数原型:void f(int a,int b=7,char c='@');下面的函数调用中,不合法的是{{U}} {{/U}}。
计算机二级《C++》选择题练习及答案
![计算机二级《C++》选择题练习及答案](https://img.taocdn.com/s3/m/9bc4346d7ed5360cba1aa8114431b90d6c8589d3.png)
计算机二级《C++》选择题练习及答案计算机二级《C++》选择题练习及答案2016选择题(1)关于友元的概念错误的是A)友元函数没有this指针B)调用友元函数时必须在它的实参中给出要访问的对象C)一个类的成员函数也可以作为另一个类的友元函数D)只能在类的公有段声明友元(2)关于抽象类下面说法正确的是A)抽象类就是其中有函数定义但没有实现的类B)抽象类是可以被实例化的C)派生类不能成为抽象类D)抽象类的子类必须实现父类中的纯虚函数(3)下面程序的结果是#includeclass test { private:int num;public:test();int getint(){return num;}~test();};test :: test(){ num =0;}test::~test(){ cout<<"Destructor is active"< P>{ test x[3];cout<<"Exiting main"<>Destructor is activeDestructor is activeDestructor is activeB)Exiting mainDestructor is activeDestructor is activeC)Exiting mainDestructor is activeD)Exiting main(4)如果表达式--x+y中,--是作为成员函数重载的`,+是作为成员函数重载的,则该表达式还可为A)y.operator+(x.operator--(0))B)y.operator+(x.operator--())C)y.operator+(operator--(x,0))D)operator+(x.operator--())(5)下列语句不能够用于打开C根目录下文件test.txt的语句是A)ifstream fin; fin.open("C:\\test.txt");B)ifstream fin("C:\\test.txt");C)A)和B)D)ifstream fin; fin("C:\\test.txt");(6)以下哪个基类中的成员函数表示纯虚函数?A)virtual void vf (int)B)void vf (int)=0C)virtual void vf(=0)D)virtual void yf(int){ }(7)下面程序输出的结果是#includevoid main(){ int i;int a[3][3]={1,2,3,4,5,6,7,8,9};for(i=0;i<3;i++)cout << a[i][i] << " ";}A)1 5 9B)7 5 3C)3 5 7D)5 9 1(8)派生类继承基类的方式有A)publicB)privateC)protectedD)以上都对(9)下列程序的运行结果为#includeclass Location {protected:int X, Y;public:void SetX(int myx){X=myx;}void SetY(int myy){Y=myy;}void showxy(){cout << "X=" << X << " " << "Y=" << Y <> private:int H, W;public:void SetH(int myh){H=myh;}void SetW(int myw){W=myw;}void show(){ cout << "X=" << X << " " << "Y=" << " " << Y << " " << "H=" << H << " " << "W=" << W << endl;}};void main(){ Rectangle r1;r1.SetX (3);r1.SetY (5);r1.SetH (4);r1.SetW (6);r1.showxy();r1.show();}A)X=3 Y=5X=3 Y=5 H=4 W=6B)X=3 Y=5X=3 Y=5 H=3 W=6C)X=3 Y=5X=3 Y=4 H=4 W=6D)X=3 Y=5X=3 Y=3 H=4 W=6(10)有以下程序#includevoid ss(char *s,char t){ while(*s){ if(*s==t)*s=t-′a′+′A′;s++;}}void main(){ char str1[100]="abcddfefdbd",c=′d′;ss(str1,c); cout << str1;}程序运行后的输出结果是A)ABCDDEFEDBDB)abcDDfefDbDC)abcAAfefAbAD)Abcddfefdb答案与解析:(1)D解析:C++中的友元可以在一个类中的任何位置声明,不一定必须在公有段,友元没有自己的this指针,调用友元函数时必须在它的实参中给出要访问的对象,并且一个类的成员函数是可以作为另一个类的友元函数的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
01.分析以下程序的执行结果#include<iostream.h>class Sample{int n;public:Sample(int i){n=i;}friend int add(Sample &s1,Sample &s2);};int add(Sample &s1,Sample &s2){return s1.n+s2.n;}void main(){Sample s1(10),s2(20);cout<<add(s1,s2)<<endl;}解:本题说明了友元函数的使用方法。
add()是一个友元函数,它返回两个引用对象的n值之和。
所以输出为:30注意:友元函数不是类的成元函数----------------------------------------------------02.分析以下程序的执行结果#include<iostream.h>class B;class A{int i;public:int set(B&);int get(){return i;}A(int x){i=x;}};class B{int i;public:B(int x){i=x;}friend A;int A::set(B &b) // 由于使用了类B的定义,故本函数的定义应放在类B定义之后{return i=b.i;}void main(){A a(1);B b(2);cout<<a.get()<<",";a.set(b);cout<<a.get()<<endl;}解:本题说明友元类的使用方法。
这里将类A设置为类B的友元类,因此,类A的所有成员函数均为类B 的友元函数。
通过调用a.set(b)将b对象的i值赋给a对象的i值。
所以输出为:1,2-------------------------------------------------03.有一个学生类student,包括学生姓名、成绩,设计一个友元函数,比较两个学生成绩的高低,并求出最高分和最低分的学生。
解:#include<iostream.h>#include<string.h>class student{char name[10];int deg;public:student(char na[],int d){strcpy(name,na);deg=d;}char *getname(){ return name;}friend int compare(student &s1,student &s2){if(s1.deg>s2.deg)return 1;else if(s1.deg==s2.deg)return 0;else return -1;};void main(){student st[]={student("王华",78),student("李明",92),student("张伟",62),student("孙强",88)};int i,min=0,max=0;for(i=1;i<4;i++){if(compare(st[max],st[i])==-1)max=i;else if(compare(st[i],st[min])==1)min=i;}cout<<"输出结果:"<<endl;cout<<" 最高分:"<<st[max].getname()<<endl;cout<<" 最低分:"<<st[min].getname()<<endl;}本程序的执行结果如下:输出结果:最高分者:李明最低分者:张伟-------------------------------------------------------------04.有一个学生类student,包括学生姓名、成绩,设计一个友元函数,输出成绩对应的等级:大于等于90:优;80~90:良;70~79:中;60!69:及格;小于60:不及格。
解:#include<iostream.h>#include<string.h>#include<iomanip.h>class student{char name[10];int deg;char level[7];public:student(char na[],int d){strcpy(name,na);deg=d;}char *getname(){ return name;}friend void trans(student &s)if(s.deg>=90)strcpy(s.level,"优");else if(s.deg>=80)strcpy(s.level,"良");else if(s.deg>=70)strcpy(s.level,"中");else if(s.deg>=60)strcpy(s.level,"及格");elsestrcpy(s.level,"不及格");}void disp(){cout<<setw(10)<<name<<setw(6)<<deg<<setw(8)<<level<<endl;}};void main(){student st[]={student("王华",78),student("李明",92),student("张伟",62),student("孙强",88)};cout<<"输出结果:"<<endl;cout<<setw(10)<<"姓名"<<setw(6)<<"成绩"<<setw(8)<<"等级"<<endl;02.05.设计一个类Sample,它有两个私有成员A[]和n(A中元素个数),将对A[]中数据进行各种排序的函数放入到一个友元类process中。
解:process类不包含任何数据成员,包含的公共成员函数如下:getdata(Sample &s); 用于获取对象s的数据insertsort(Sample &s); 用于进行插入排序shellsort(Sample &s); 用于进行希尔排序bubblesort(Sample &s); 用于进行冒泡排序quicksort(Sample &s); 用于进行快速排序selectsort(Sample &s); 用于进行选择排序disp(Sample &s); 用于输出数据本题程序如下:#include<iostream.h>#define Max 100class Sample{int A[Max];int n;friend class process;public:Sample(){n=0;}class process{void qsort(Sample &s,int l,int h);// 私有成员,由quicksort()成员调用public:void getdata(Sample &s);void insertsort(Sample &s);void shellsort(Sample &s);void bubblesort(Sample &s);void quicksort(Sample &s);void selectsort(Sample &s);void disp(Sample &s);};void process::getdata(Sample &s){int i;cout<<"元素个数:";cin>>s.n;for(i=0;i<s;i++){cout<<"输入第"<<i+1<<"个数据:";cin>>s.A[i];}}void process::insertsort(Sample &s) // 插入排序{int i,j,temp;for(i=1;i<s.n;i++){temp=s.A[i];j=i-1;while(temp<s.A[j]){s.A[j+1]=s.A[j];j--;}s.A[j+1]=temp;}}void process::shellsort(Sample &s) // 希尔排序{int i,j,gap,temp;gap=s.n/2;while(gap>0){for(i=gap;i<s;i++){j=i-gap;while(j>=gap)if(s.A[j]>s.A[j+gap]){temp=s.A[j];s.A[j]=s.A[j+gap];s.A[j+gap]=temp;j=j-gap;}else j=0;}gap=gap/2;}}void process::bubblesort(Sample &s) // 冒泡排序{int i,j,temp;for(i=0;i<s.n;i++)for(j=s.n-1;j>=i+1;j--)if(s.A[j]<s.A[j-1]){temp=s.A[j];s.a[j]=s.A[j-1];s.A[j-1]=temp;}}void process::quicksort(Sample &s) // 快速排序{qsort(s,0,s.n-1);}void process::qsort(Sample &s,int l,int h){int i=l,j=h,temp;if(l<h){ temp=s.A[l];do{while(j>i&&s.A[j]>=temp)j--;if(i<j){s.A[i]=s.A[j];i++;}while(i<j&&s.A[i]<=temp)i++;if(i<j){s.A[j]=s.A[i];j--;}}while(i<j);s.A[i]=temp;qsort(s,l,j-1);qsort(s,j+1,h);}}void process::selectsort(Sample &s) // 选择排序{int i,j,k,temp;for(i=0;i<s.n;i++){k=i;for(j=i+1;j<=s.n-1;j++)if(s.A[j]<s.A[k])k=j;temp=s.A[i];s.A[i]=s.A[k];s.A[k]=temp;}}void process::disp(Sample &s){for(int i=0;i<s.n;i++)cout<<s.A[i]<<" ";cout<<endl;}void main(){int sel;Sample s;process p;p.getdata(s);cout<<"原来序列:";p.disp(s);cout<<"0:插入排序1:希尔排序2:冒泡排序3:快速排序4:选择排序其它退出"<<endl;cout<<"选择排序方法:";cin>>sel;switch(sel){case 0:p.insertsort(s);cout<<"插入排序结果:";03.题1.分析以下程序的执行结果#include<iostream.h>class Sample{int n;public:Sample(){}Sample (int m){n=m;}friend void square(Sample &s){s.n=s.n*s.n;}void disp(){cout<<"n="<<n<<endl;}};void main(){Sample a(10);square(a);a.disp();}解:本题应用友元函数修改对象的数据成员。