Student类(友元,运算符重载,继承)综合题
- 格式:doc
- 大小:72.00 KB
- 文档页数:10
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类的定义中。
C++1、某学校教职工的工资计算方法为:所有教职工都有基本工资。
教师月工资为基本工资+课时补贴,课时补贴根据职称和课时计算。
例如,每课时教授补贴50元,副教授补贴30元,讲师补贴20元。
管理人员月薪为基本工资+职务工资。
实验室人员月薪为基本工资+工作日补贴,工作日补贴等于日补贴(假设为20元)×月工作日数。
定义教职工抽象类,派生教师类、管理人员类和实验室类,编写程序测试这个类体系。
提示:(1)定义教职工类staff为一个抽象类,里面包含两个纯虚函数input()和output(),在派生类教师类、管理人员类和实验室类分别具体实现这两个纯虚函数。
分析题意,教职工类需要输入姓名职称课时;管理人员类需要输入姓名和职务工资;实验室人员类需要输入姓名和工作日数。
(2)在基类教职工类中应该包含共有的一些数据成员,派生类中定义自己特有的数据成员,请自己思考各自应该定义哪些数据成员以及它们的访问权限。
#include <iostream>#include <string>using namespace std;/* run this program using the console pauser or add your own getch, system("pause") or input loop */class staff{public:staff ( double bSalary){basicSalary=bSalary;}virtual void input() = 0;//纯虚函数virtual void output() = 0;protected:string name;double basicSalary;};class teacher:public staff{public:teacher(double basicSalary=3000):staff(basicSalary){} ;void input(){//输入工资cout<<"请输入教师姓名:";cin>>name; //继承上面定义的基本工资和namecout<<"职称(1.教授2.副教授3.讲师) (请选择1,2,3):";cin>>title;cout<<"课时:";cin>>coursetime;};void output(){double salary;switch(title){case 1:salary=basicSalary+coursetime*50;break;// 教case 2:salary=basicSalary+coursetime*30;break;case 3:salary=basicSalary+coursetime*20;break;}cout<<"教师姓名:"<<name<<"\t本月工资:"<<salary<<endl;};private:int coursetime;//课时int title; //判断教师的类型};class manage:public staff{public:manage(double basicSalary=5000):staff(basicSalary){}void input(){//输入姓名cout<<"请输入管理人员姓名:";cin>>name;//输入职务工资cout<<"职务工资:";cin>>jobSalary;};double salary= jobSalary+basicSalary;void output(){cout<<"管理人员姓名:"<<name<<"\t本月工资:"<< salary<<endl;};private:double jobSalary;};class proff:public staff{public:proff(double basicSalary=6000):staff(basicSalary){} ;void input(){//输入姓名cout<<"请输入研究人员姓名:";cin>>name;//输入职务工资cout<<"工作日:";cin>>jobDay;};double salary= jobDay*20+basicSalary;void output(){cout<<"姓名:"<<name<<"\t本月工资:"<< salary;};private:int jobDay;};int main() {teacher t;t.input();t.output();manage m;m.input();m.output();proff p;p.input();p.output();return 0;}#include <iostream>//头文件包含,标准输入输出流C++有行注释、块注释,没有文件注释using namespace std;//使用命名空间int main(int argc,char *argv[]){//有且只有main函数,它是系统的唯一入口,形参可省略cout<<”hello world”<<endl;return 0;//主函数必须有return ;return有两个功能,一是返回一个数据类型,二是结束当前函数}extern int date;int date = 0;//先声明,后定义,extern只能在函数外部使用,用于声明类、函数和全局变量,一般跨文件才使用声明,同文件可以直接先定义再调用int date = 0;int num = 0;cin>>date>>num;//键盘输入给date、num赋值,以空格或回车隔开(cin会忽略空格回车)字符常量:’a’、’123’等字符变量:char ch = ‘\0’;字符串常量:”a”、”123”等字符串变量:string str = “name”;const关键字:const修饰的变量为只读变量,在定义变量时要初始化,被初始化后不能被赋值。
面向对象程序设计 14春学期《面向对象程序设计》在线作业一,单选题1. 友元重载运算符obj1>obj2被C++编译器解释为()。
A. operator>(obj1,obj2)B. >(obj1,obj2)C. obj1.operator>(obj2)D. obj2.operator>(obj1)?正确答案:A2. 结构化程序设计方法以()为中心进行分析和设计。
A. 结构B. 模块C. 对象D. 类?正确答案:B3. 变量的引用,其含义是指该变量的()。
A. 值B. 类型C. 别名D. 地址?正确答案:C4. 多继承的构造函数顺序可分为如下4步:①所有非虚基类的构造函数按照它们被继承的顺序构造。
②所有虚基类的构造函数按照它们被继承的顺序构造。
③所有子对象的构造函数按照它们声明的顺序构造。
④派生类自己的构造函数体这四个步骤的正确顺序是()。
A. ④③①②B. ②④③①C. ②①③④D. ③④①②?正确答案:C5. 在使用类创建对象时,系统会自动调用该对象的()完成对象中数据成员的初始化等操作。
A. 友元函数B. 虚函数C. 构造函数D. 析构函数?正确答案:C6. 在一个string类对象表示的字符串中查找子串,应该使用string类的()函数。
A. assignB. insertC. swapD. find?正确答案:D7. 类aClass的定义如下: class aClass {public: aClass(){} aClass(int i){value=new int(i);} int *value; } 若要对类中的value赋值,则下面的语句中,正确的是()。
A. aClass my; my.value=10;B. aClass my; *my.value=10;C. aClass my; my.*value=10;D. aClass my(10);?正确答案:D8. 已知“int a=10,*p;int *&r=p; r=&a;*p=20;cout<<a;”,则输出为()。
国家二级C++机试(运算符重载、模板和C++流)模拟试卷6(总分:58.00,做题时间:90分钟)一、选择题(总题数:29,分数:58.00)1.若在表达式y/x中,''/''是作为成员函数重载的运算符,则该表达式还可以表示为( )。
(分数:2.00)A.x.operator/(y)B.operator/(x,y)C.y.operator/(x) √D.operator/(y,x)解析:解析:运算符函数的函数名是由运算符前加关键字operator构成的。
所以当“/”作为运算符重载后,其格式为operator/。
所以其作为成员函数调用时的格式为y.operator/(x)。
2.有类定义如下: class Type{ public: Type(int i=0); Type operator-(int); friend Type operator+(Type,Type); private: int val; };若有对象定义Type c1;则下列语句序列中,错误的是( )。
(分数:2.00)A.Type(3)+c1;B.e1+Type(3);C.3-c1:√D.c1-3;解析:解析:由于在类Type中对“-”进行了重载,所以根据“-”重载的形式定义,c1-3是正确的,而3-c1是错误的表达式。
3.若要对Data类中重载的加法运算符成员函数进行声明,下列选项中正确的是( )。
(分数:2.00)A.Data+(Data);B.Data operator+{Data};√C.Data+operator{Data};D.operator+(Data,Data);解析:解析:“+”是一个二元运算符,因此作为成员函数重载时参数表中只有一个参数,对应于第二个操作数,而第一个操作数是对象本身。
运算符函数的函数名是由运算符前加关键字operator构成的。
4.若要对类BigNumber中重载的类型转换运算符long进行声明,下列选项中正确的是( )。
第三章重载1、请完成下列填空题1)在C++中,只能重载为类的成员函数的运算符是_=_、__[]__、__()__、__->__。
2)利用成员函数对二元运算符重载,其左操作数为___This___,右操作数为___成员函数参数___。
3)单目运算符作为类成员函数重载时___没有___的参数;双目运算符作为___类成员函数___重载时需声明其右操作数,作为___友元函数___重载时需声明全部操作数。
4)设a和b是两个整型变量,a+b表示这两个变量的和:设c和d为浮点型变量,c+d也表示这两个变量的和。
这里的运算符+具有不同的用途,这是__运算符重载___的例子。
5)重载的运算符仍然保持其原来的优先级、___结合性___和___语法结构___。
6)C++中不能重载的运算符有___.___、__*___、___::___、___?:___和___sizof___。
2、编程题1)字符串连接需要两个操作数,即两个要被连接的字符串。
请按照以平方式实现operator +操作:string1=string2+string3答案:#include <iostream.h>#include <string.h>class String{public:String(int size=80){length=size;buf=new char[length+1];*buf='\0';}String(char *s){length=strlen(s);buf=new char[length+1];strcpy(buf,s);}String(const String& str){length=strlen(str.buf);buf=new char[length+1];strcpy(buf,str.buf);}~String(){delete[]buf;}String& operator =(const String& str){length=str.length;strcpy(buf,str.buf);return *this;}void Print(){cout<<buf<<endl;}friend String operator +(const String& str1,const String& str2){String temp(strlen(str1.buf)+strlen(str2.buf)+1);strcpy(temp.buf,str1.buf);strcat(temp.buf,str2.buf);return temp;}private:char *buf;int length;};void main(){String str1,str2("Hello,"),str3("everyone!");str1=str2+str3;str1.Print();}2)给th类:class Three-d{public:Three_d(int I,int j,int k){x=I;y=j;z=k;}.Three_d()){x=0;y=0;z=0;}V oid Get(int &I,int &j,int &k({I=x;j=y;k=z;}private:int x,y,z;};针对给出的类,重载"+"、"++"与"一"运算符(只重载前缀方式即可)。
答案+我名字2020年春季学期课程作业C++程序设计语言第1次C++程序设计语言题号一二合计已做/题量20 / 20 20 / 20 40 / 40得分/分值 / 50 45 / 50 / 100一、单项选择题 (共 20 题、 / 50 分 )1、以下关于函数模板叙述正确的是()。
正确!收藏该题展开该题2、假设已经定义好了类student ,现在要定义类derived ,它是从student 私有派生的,则定义类derived 的正确写法是()。
正确!收藏该题展开该题3、在C++中,继承方式有哪几种()正确!收藏该题展开该题4、面向对象方法的多态性是指()。
正确!收藏该题展开该题5、运算符重载是对已有的运算符赋予多重含义,因此()。
正确!收藏该题展开该题6、有以下语句struct S{ int g;char h;} T;则下面叙述中不正确的是()。
正确!收藏该题展开该题7、下列()的调用方式是引用调用。
正确!收藏该题展开该题8、假定一个字符串的长度为n,则定义存储该字符串的字符数组的长度至少为()。
正确!收藏该题展开该题9、下列定义中,()是定义指向数组的指针p。
正确!收藏该题展开该题10、以下说法中正确的是()。
正确!收藏该题展开该题11、假定一个类AB只含有一个整型数据成员a,当用户不定义任何构造函数时,系统为该类定义的无参构造函数为( ) 。
正确!收藏该题展开该题12、关于内联函数说法错误的是()。
正确!收藏该题展开该题13、假设OneClass 为一个类,则该类的拷贝初始化构造函数的声明语句为()。
正确!收藏该题展开该题14、假定一个类的构造函数为B(int x,int y){a=x--;b=a*y--;},则执行B x(3,5);语句后,和的值分别为( )。
正确!收藏该题展开该题15、在int b[][3]={{1},{3,2},{4,5,6},{0}};b[2][2] 的值是()。
C加加高中试题### C++ 高中试题一、选择题1. 在C++中,以下哪个关键字用于定义类?- A. struct- B. class- C. enum- D. union2. 以下哪个操作符用于实现类的继承?- A. +- B. -- C. *- D. :3. C++中,以下哪个是构造函数的特点?- A. 必须有返回类型- B. 可以有多个参数- C. 与类名相同- D. 以上都是4. C++中,以下哪个是析构函数的特点?- A. 没有参数- B. 没有返回类型- C. 可以有多个重载- D. 以上都是5. C++中,以下哪个关键字用于定义友元函数?- A. friend- B. public- C. private- D. protected二、填空题1. 在C++中,____ 是一种特殊的成员函数,它在对象生命周期结束时被调用。
2. C++中的____关键字用于定义静态成员变量或成员函数。
3. 使用____关键字可以定义一个常量,其值在初始化后不能被改变。
4. C++中,____是一种特殊的构造函数,它允许在创建对象时初始化成员变量。
5. C++中的____关键字允许在类定义中直接初始化成员变量。
三、简答题1. 解释C++中的多态性,并给出一个简单的例子。
2. 描述C++中虚函数的作用,并解释如何实现虚函数。
3. 说明C++中命名空间的作用,并给出一个使用命名空间的示例。
四、编程题1. 编写一个C++程序,定义一个名为`Student`的类,包含姓名、学号和成绩三个私有数据成员,以及相应的公有成员函数实现数据的输入和输出。
2. 定义一个基类`Shape`,包含一个虚函数`area()`,然后派生出两个子类`Circle`和`Rectangle`,分别实现圆形和矩形的面积计算。
3. 编写一个C++程序,实现一个简单的银行账户管理系统,包含账户的存款、取款和显示余额功能。
五、综合题1. 设计一个C++程序,模拟一个简单的图书管理系统。
实验七-运算符重载参考答案实验七多态性—函数与运算符重载7.1 实验目的1.理解掌握成员函数方式运算符重载;2.理解掌握友元函数方式运算符重载;3.理解掌握++、--运算符的重载。
7.2 实验内容7.2.1程序阅读1.理解下面的程序,并运行查看结果,回答程序后面的问题。
#include <iostream>using namespace std;class CComplex{public:CComplex(){real = 0;imag = 0;}CComplex(int x,int y){real = x;imag = y;}int real;int imag;CComplex operator + (CComplex obj1)//---------------------------------------------①{CComplex obj2(real - obj1.real, imag - obj1.imag);return obj2;}};int main(){CComplex obj1(100,30);CComplex obj2(20, 30);CComplex obj;obj = obj1+obj2; //------------------------------------------------------------------②cout << obj.real <<endl;cout << obj.imag << endl;return 0;}问题一:①处的运算符重载,为什么该函数的返回值要设计成CComplex类型?答:因为在函数中return obj2,obj2是CComplex 类型,所以函数返回值要与return返回的类型相同,即设计成CComplex类型。
问题二:②处的运算符重载函数调用就相当于“obj=operator+(obj1,obj2);”,但是为什么CComplex类中的运算符重载函数只设计了一个参数?答:因为成员函数经编译后会产生this指针,this指针会指向调用该函数的obj1对象,该obj1对象就是就相当于函数的第一个参数。
C++随堂测试(继承、多态、重载)一、选择题()1.在C++中,类与类之间的继承关系具有()A)自反性 B)对称性 C)传递性 D)反对称性2.在保护继承的情况下,基类的成员(私有的除外)在派生类中的访问权限()A)受限制 B)保持不变 C)受保护 D)不受保护3.在下列运算符中,不能重载的是( )A.!B. sizeofC. newD. delete4.不能用友元函数重载的是( )。
A.=B.==C.<=D.++5.在哪种派生方式中,派生类可以访问基类中的protected成员()A)public和private B)public、protected和privateC)protected和private D)仅protected6.下列函数中,不能重载运算符的函数是( )。
A.成员函数B.构造函数C.普通函数D.友元函数7.下面叙述错误的是()。
A)基类的protected成员在派生类中仍然是protected的B)基类的protected成员在public派生类中仍然是protected的C)基类的protected成员在private派生类中是private的D)基类的protected成员不能被派生类的对象访问8.如果表达式++i*k时中的”++”和”*”都是重载的友元运算符,则采用运算符函数调用格式,该表达式还可表示为()。
A.operator*(i.operator++(),k)B.operator*(operator++(i),k)C.i.operator++().operator*(k) D.k.operator*(operator++(i))9.下面叙述错误的是()。
A)派生类可以使用private派生B)对基类成员的访问必须是无二义性的C)基类成员的访问能力在派生类中维持不变D)赋值兼容规则也适用于多继承的组合10.下列虚基类的声明中,正确的是:()A)class virtual B: public A B)class B: virtual public AC)class B: public A virtual D)virtual class B: public A11.已知在一个类体中包含如下函数原型:VOLUME operator-(VOLUME)const;下列关于这个函数的叙述中,错误的是()。
《面向对象程序设计》20春期末考核-00001需答案7 51 49 5932一、单选题(共30 道试题,共30 分)1.下面对静态数据成员的描述中,正确的是()。
A.静态数据成员可以在类体内进行初始化B.静态数据成员不可以被该类的对象调用C.静态数据成员不能受private控制符的作用D.静态数据成员可以直接用类名访问答案:D2.下列关于赋值运算符重载的说法中正确的是()。
A.返回值一般是以引用方式返回的对象,而函数体中总是用语句“return *this;”返回this指针所指向的对象B.赋值运算符只能以非成员函数的方式重载C.赋值运算符既可以以成员函数的方式重载,又可以以非成员函数的方式重载D.以上均不正确答案:A3.对于下面定义的类A在函数f()中将对象成员n的值修改为60的语句应该是( ) class A { public: A(int x){n=x;} void SetNum(int n1){n=n1;} private: int n; } int f() { A*ptr=new A(6); }A.A(60)B.SetNum(60)C.ptr->SetNum(60)D.ptr->n=604.下面叙述错误的是( )。
A.派生类可以使用private派生B.对基类成员的访问必须是无二义性的C.基类成员的访问能力在派生类中维持不变D.赋值兼容规则也适用于多继承的组合5.抽象类的作用主要是()。
A.直接用作基类B.直接用作指针C.引用的基类型D.包括以上各项6.下列对重载函数的描述中,( )是错误的。
A.重载函数中不允许使用默认参数B.重载函数中编译时根据参数表进行选择C.不要使用重载函数来描述毫无相干的函数D.构造函数重载将会给初始化带来多种方式7.假定X为一个类,执行X a[3],*p[2];语句时会自动调用该类的构造函数( )次。
A.2B.3C.4D.58.在一个C++源文件中使用了cin和cout,那么在这个源文件中必须包含()文件。
《面向对象程序设计》复习要点及复习题(一)复习要点1.标识符、基本数据类型(字节数)、构造数据类型、运算符的种类、运算符的优先级和结合性、控制台输入和输出2.三种基本控制结构、if…else语句、switch语句、for语句、while语句、do…while语句、跳转语句;函数参数传递、函数重载、内联函数;标识符的作用域和生存期。
3.类的定义和使用、this指针、构造函数和析构函数、组合技术、静态成员、友元、运算符重载4.指针与数组、二级指针、动态内存的分配与释放、深复制与浅复制、递归。
5.派生类的构造与析构、派生类与基类的赋值兼容、多重继承与虚基类。
6.虚函数与动态绑定、纯虚函数与抽象类(二) 复习题一、单项选择题。
1.在switch语句中,为了结束分支,一般应在每个分支的结尾处加上语句(C)。
A. continueB. gotoC. breakD. default2.说明友元函数的关键字是(D)。
A. inlineB. virtualC. staticD. friend3.下面对指向常量的指针描述正确的是(C)。
A. 只能指向常量B. 指向的数据可以被修改C. 可以指向普通变量D. 必须进行初始化4.友元函数没有(A)。
A. this指针B. 返回类型C. 函数名D. 参数5.关于重载,(A)不正确。
A. 类名可以重载B. 函数名可以重载C. 运算符可以重载D. 缺省参数是重载的一种方式6.用new分配n维数组空间,首地址赋予指针p,则p应为指向(C)维数组的指针。
A. 0B. 1C. n-1D. n7.为类X重载前缀自增运算,则函数返回类型应为(C)。
A. XB. X*C. X&D. int8.以下(A)未调用构造函数(X为类名)。
A. X*p;B. X obj;C. X obj(1);D. X obj=2;9.若在类外有函数调用X::func();则函数func是类X的(C)函数。
类和对象与运算符重载-答案选择题1、若有以下说明,在类外使用对象objx成员的正确语句是()。
class X{ int a;void fun1();public:void fun2();};A objx.a=0B objx.fun1();C objx.fun2();D X::fun1();2、若有以下说明,对n的正确访问语句是()。
class Y{ //………;public:static int n;};int Y::n=0;Y objy;A n=1;B Y::n=1;C objy::n=1;D Y->n=1;3、若有以下类Z的说明,函数fstatic的正确定义是()。
class Z{ int a;public:void fstatic(Z &)static;};A void Z::fstatic(Z &objz){objz.a=0;}B void Z::fs tatic(Z &objz){a=objz.a;}C void Z::fstatic(Z &objz){a=0;}D void Z::fstatic(Z &objz){Z::a=0;}4、若有以下类T的说明,函数ffriend的错误定义是()。
class T{ int i;friend void ffriend(T &,int);};A void ffriend(T &objt,int k){objt.i=k;}B void ffriend(T &objt,int k){k=objt.i;}C void T::ffriend(T &objt,int k){K+=objt.i;}D void ffriend(T &objt,int k){objt.i+=k;}5、在类定义的外部,可以被访问的成员有()。
A 所有类成员B 私有或保护类成员C公有的类成员 D 公有或私有的类成员6、关于this指针的说法正确的是()。
习题13答案一、简答题1.什么是运算符重载?实现运算符重载有几种方法?如何实现?答案:C++提供的运算符重载机制能够实现将已有运算符应用到新的数据类型变量上,赋予运算符新的含义。
C++对运算符重载有一些限制,见13.2.1节。
有两种方法可以实现运算符重载,它们是:类的成员函数方式和有友元函数方式。
定义友元的目的是在友元函数中直接访问类的私有成员。
实际上,可以通过类的公有函数接口访问类的私有成员,所以实现运算符重载,可以使用非成员、非友元实现运算符的重载。
但是这种实现方法增加了访问私有数据成员的公有函数的调用时间,不值得提倡。
见13.2.2节。
2.如何实现本类对象与其它类对象之间的相互类型转换?答案:可以使用“类型转换函数”将本类对象转换成其他类对象。
而“类型转换函数”本质上就是运算符的重载。
另外,可以使用“构造函数”将其他类对象转换成本类对象。
3.什么是虚函数?什么是纯虚函数?它们的作用是什么?答案:多态性是面向对象程序设计的重要特性,它与前面讲的封装性和继承性构成面向对象程序设计的三大特性。
这三大特性是互相关联的,封装性是基础,继承性是关键,而多态性是补充。
多态分为静态多态和动态多态。
函数重载和运算符重载属于静态多态。
动态多态是运行时的多态,如某些函数的调用关系在运行阶段才能确定。
为了实现函数调用关系的动态多态,可以将函数定义成虚函数。
将一个成员函数定义成虚函数的方法是,在函数定义的返回值类型前加virtual。
在抽象类中,有时无法实现某一功能(即无法决定某一函数的具体实现),只能将函数定义成纯虚函数。
虚函数具有函数实现的函数体,而纯虚函数没有函数体,即没有函数实现。
对纯虚函数,只能在其派生类中实现该函数的功能。
4.试比较虚函数与虚基类的概念及作用。
答案:虚函数用于实现动态多态。
而虚基类用于实现在多重继承情况下,基类数据成员在派生类中保留一个副本,见12.6节。
二、选择题答案:1. C2. D3. A4. D5. B6. C7. D8. C三、运行结果、完善程序1.运行结果:n=4n=32.答案:先看虚线框中的程序,运行结果为:D::show( ) called. 8若将A行的virtual去掉,则结果为:B::show( ) called. 5对本题,若将虚线框中的fun( )和main( )函数同时修改成右侧实线框中的对应函数,则若A 行有virtural时,结果为:D::show( ) called. 8 ;若A行无virtual时,结果为:B::show( ) called. 5 。
能用友元函数重载的运算符
友元函数是一种特殊的函数,它可以访问类的私有成员。
在C++中,我们可以使用友元函数重载运算符来完成一些特殊的操作。
使用友元函数重载运算符的好处在于可以直接使用运算符来操
作对象,而不需要调用对象的成员函数。
例如,我们可以使用加号运算符直接将两个对象相加,而不需要调用对象的成员函数。
常见的可以用友元函数重载的运算符包括加号、减号、乘号、除号、等于号、小于号、大于号等等。
这些运算符可以被重载为友元函数,以实现特殊的操作。
需要注意的是,友元函数重载运算符时,我们需要将友元函数声明为类的友元函数,以便访问类的私有成员。
同时,我们还需要遵守运算符重载的一些规则,例如运算符的操作数个数、操作数类型等等。
总之,使用友元函数重载运算符可以让我们更方便地操作对象,提高代码的可读性和可维护性。
- 1 -。