Student类(友元,运算符重载,继承)综合题
C++教学 第9章+友元函数与运算符重载

float v1(A &a) { return PI*a.r*a.r*a.h;} //友元函数volum在类体外定义 float v3(A b) //普通函数 { return PI*b.getr()*b.getr()*b.geth();} void main() { A a1(25,40); A a2(25,40); cout<<v1(a1)<<"\n"; //友元函数的调用 cout <<a2.v2( )<<"\n"; cout<<v3(a1); }
对于大多数程序设计语言,运算符的定义由编译器给出,且 这种用法是不允许用户改变的。在C++中,允许用户重新定 义已有的运算符,并按规定要求去完成特定的操作。 使用成员函数或友元函数,通过操作对象成员,从而实现对 象参加运算的目的。
10
运算符重载函数的定义格式如下: (1)运算符重载函数定义为类的成员函数 函数类型 operator 运算符 (参数表) { …… }
15
9.3 一元运算符重载 C++中允许重载的一元运算符有: 自增运算符“++”、自减运算符“--”、 负号运算符“-”、逻辑非运算符“!”等。
16
9.3.1 用成员函数重载一元运算符
用成员函数重载“++”运算符的格式为: (1)++为前缀形式 函数类型 operator++(void) { 函数体 } (2)++为后缀形式 函数类型 operator++(int) { 函数体 } 重载自减运算符“--”的格式与重载“++”运算符类似。
C++语言选择题40道:C++友元函数与友元类.Tex

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++ 2023自考实践

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春学期《面向对象程序设计》在线作业答案

面向对象程序设计 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

国家二级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进行声明,下列选项中正确的是( )。
c++复习题及答案(完整版)

38、C++支持多态性。T
40、返回值类型、参数个数和类型都相同的函数也可以重载。F
41、“引用”作为目标的别名而使用,对引用的改动实际就是对目标的改动。引用不是值,不占存储空间,声明引用时,目标的存储状态不会改变。T
42、使用关键字class定义的类中缺省的访问权限是私有(private)的。T
37、用一个对象去构造同类的另一个新对象需要调用(复制构造函数)。
38、用new为对象动态分配内存,当程序完毕必须用(delete)释放。
39、类的每个普通成员函数都有一个隐含的this指针参数,this指针指向(正在被成员函数操作)的对象。
40、设pt为T类的一个指针,pt=new T[10]操作须调用(10)次构造函数。
A可以重载B其名字与类名相同C可以显式调用构造函数D构造函数是成员函数E构造函数不能是虚函数
3、判断题(正确的请写T,错误的请写F)(20分)
静态成员函数可以直接调用类中说明的非静态成员。(F)
windows应用程序采用基于消息的事件驱动运行机制。(T)
4、找出程序中的错误并改正(10分)
class student()
20、抽象类必须有一个(纯虚)函数,并且不能产生自己的(对象)。
21、C++规定,动态联编通过多态性来实现,实现多态性的同名函数必须(形参表和返回值)相同。
22、面向对象的模型中,最基本的概念是对象和(类)。
23、软件设计模块化的目的是(降低复杂性)。
24、派生类的成员一般分为两部分,一部分是(改造基类的成员),另一部分是自己定义的新成员。
{
private:public:
C++程序设计与应用基础第三章重载习题答案

第三章重载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++程序设计语言

答案+我名字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] 的值是()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
num=n;
name=nam;
sex=s;
birthday.year=bir.year;
birthday.month=bir.month;
birthday.day=bir.day;
score=c;
}
Student::~Student() //析构函数-函数体为空
{
//cout<<"Destructor called."<<endl;
cin>>birthday.month;
cin>>birthday.day;
cin>>score;
}
void Student::sort(Student *p,int N) //按照成绩高低排序函数
{
int i,j;
string temp_num,temp_name;
char temp_sex;
Date temp_bir;
p[i].name=p[j].name;
p[j].name=temp_name;
temp_sex=p[i].sex;
p[i].sex=p[j].sex;
p[j].sex=temp_sex;
temp_bir.year=p[i].birthday.year;
p[i].birthday.year=p[j].birthday.year;
{
string min_num,min_name;
char min_sex;
Date min_bir;
int min_score;
min_num=p->num;
min_name=p->name;
min_sex=p->sex;
min_bir.year=p->birthday.year;
min_bir.month=p->birthday.month;
public:
Date(); //无参构造函数
Date(int,int,int); //有参构造函数
~Date(); //析构函数
//protected: //这里是保护成员//这里是VC6.0的原因
int year; //年
int month; //月
int day; //日
};
class Student //定义Student类-存放学生信息
temp_score=p[i].score;
p[i].score=p[j].score;
p[j].score=temp_score;
temp_thesis=p[i].thesis;
p[i].thesis=p[j].thesis;
p[j].thesis=temp_thesis;
month=1;
day=1;
}
Date::Date(int y,int m,int d) //有参构造函数
{
year=y;
month=m;
day=d;
}
Date::~Date() //析构函数-函数体为空
{
//cout<<"Date Destructor called."<<endl;
}
Student::Student() //无参构造函数,自动赋值
p[j].birthday.year=temp_bir.year;
temp_bir.month=p[i].birthday.month;
p[i].birthday.month=p[j].birthday.month;
p[j].birthday.month=temp_bir.month;
temp_bir.day=p[i].birthday.day;
Doctor::Doctor()
{
thesis="";
sci_value=0;
}
Doctor::Doctor(string t,int c)
{
thesis=t;
sci_value=c;
}
void Doctor::display1()
{
cout<<"thesis:"<<thesis <<endl;
cout<<"sci_value:"<<sci_value <<endl;
};
//以下内容是增加继承后增添的
class Doctor:public Student //定义Doctor类,是Student的派生类
{
public:
Doctor(); //无参构造函数
Doctor(string,int ); //有参构造函数
void display1(); //输出函数
void set(); //输入函数
min_bir.month=p->birthday.month;
min_bir.day=p->birthday.day;
min_score=p->score;
}
p++;
}
cout<<"学生成绩最低者信息:"<<endl;
cout<<"num="<<min_num<<endl;
cout<<"name="<<min_name<<endl;
p[i].birthday.day=p[j].birthday.day;
p[j].birthday.day=temp_bir.day;
temp_score=p[i].score;
p[i].score=p[j].score;
p[j].score=temp_score;
}
}
void Student::min(Student *p,int N) //求最低成绩函数
p[i].birthday.month=p[j].birthday.month;
p[j].birthday.month=temp_bir.month;
temp_bir.day=p[i].birthday.day;
p[i].birthday.day=p[j].birthday.day;
p[j].birthday.day=temp_bir.day;
}
void Doctor::set()
{
cout<<"学生论文等级和科研量化分数:"<<endl;
cin>>thesis;
cin>>sci_value;
}
void Doctor::sort(Doctor *p,int N) //按照科研分值高低排序函数
{
int i,j;
string temp_num,temp_name;
p[j].sex=temp_sex;
temp_bir.year=p[i].birthday.year;
p[i].birthday.year=p[j].birthday.year;
p[j].birthday.year=temp_bir.year;
temp_bir.month=p[i].birthday.month;
//定义Student类,Date类,类定义与成员函数,实现分离。
//将Student类声明为Date的友元类。Student类需要提前声明。
//Student类的成员函数可以访问Date类的私有成员。
//成员函数:构造函数,构造函数重载,析构函数,
//输出函数,求成绩最低者函数,排序函数。
//使用new,delete,动态分配内存。实现班级人数不固定,可以从键盘输入。
min_bir.day=p->birthday.day;
min_score=p->score;
p++;
for(int i=1;i<N;i++)
{
if(p->score<min_score)
{
min_num=p->num;
min_name=p->name;
min_sex=p->sex;
min_bir.year=p->birthday.year;
int temp_score;
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(p[i].score<p[j].score)
{
temp_num=p[i].num;
p[i].num=p[j].num;
p[j].num=temp_num;
temp_name=p[i].name;
{
num="空字符串
sex=' '; //默认为空格
birthday.year=1900; //默认生日:1900-1-1
birthday.month=1;
birthday.day=1;
score=0; //默认成绩为0
}
Student::Student(string n,string nam,char s,Date bir,int c) //有参构造函数,将参数值赋给成员
{
temp_num=p[i].num;
p[i].num=p[j].num;
p[j].num=temp_num;
temp_name=p[i].name;
p[i].name=p[j].name;
p[j].name=temp_name;