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对象就是就相当于函数的第一个参数。