编程题6_1_重载运算符
- 格式:doc
- 大小:44.50 KB
- 文档页数:6
1.概念填空题1.1运算符重载是对已有的运算符赋予多重含义,使同一个运算符在作用于不同类型对象时导致不同的行为。
运算符重载的实质是函数重载,是类的多态性特征。
1.2可以定义一种特殊的类型转换函数,将类的对象转换成基本数据类型的数据。
但是这种类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。
类类型转换函数既没有参数,也不显式给出返回类型。
类类型函数中必须有return 表达式的语句返回函数值。
一个类可以定义多个类类型转换函数。
1.3运算符重载时其函数名由operator运算符构成。
成员函数重载双目运算符时,左操作数是对象,右操作数是函数参数。
2.简答题2.2简述运算符重载的规则。
2.2简述重载单目运算符++、--,前置和后置时的差别。
2.3 C++中重运算符是否都可以重载?是否都可以重载成类的成员函数?是否都可以重载成类的友元函数?2.4 构造函数作为类型转换函数的条件是什么。
3.选择题3.1在下列运算符中,不能重载的是(B)A.!B. sizeofC. newD. delete3.2 不能用友员函数重载的是(A)。
A.=B.==C.<=D.++3.3下列函数中,不能重载运算符的函数是(B)。
A.成员函数B.构造函数C.普通函数D.友员函数3.4如果表达式++i*k时中的”++”和”*”都是重载的友元运算符,则采用运算符函数调用格式,该表达式还可表示为(B)。
A.operator*(i.operator++(),k) B.operator*(operator++(i),k)C.i.operator++().operator*(k) D.k.operator*(operator++(i))3.5已知在一个类体中包含如下函数原型:VOLUME operator-(VOLUME)const;下列关于这个函数的叙述中,错误的是(B )。
A.这是运算符-的重载运算符函数B.这个函数所重载的运算符是一个一元运算符C.这是一个成员函数D.这个函数不改变数据成员的值3.6在表达式x+y*z中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。
2024年3月GESP编程能力认证C++七级真题(含答案)一、单选题(每题2分,共30分)。
1.下列关于排序的说法,正确的是()。
A. 冒泡排序是最快的排序算法之一。
B. 快速排序通常是不稳定的。
C. 最差情况,N个元素做归并排序的时间复杂度为O(N)。
D. 以上均不正确。
2.下面的程序属于哪种算法()。
int pos[8];void queen(int n){for(int i =0;i < 8;i++){pos[n]=i;bool attacked =false;for(int j =0;j < n;j++)if(pos[n]==pos[j]|| pos[n]+n ==pos[j]+j || pos[n]- n ==pos[j] - j){attacked =true;break;}if(attacked)continue;if(n ==7){return;}else{queen(n +1);}}}A. 贪心算法B. 动态规划C. 深度优先搜索D. 广度优先搜索3.下面有关C++类的说法,错误的是()。
A. C++类对象销毁时,会执行析构函数。
B. C++类可以通过定义构造函数实现自动类型转换。
C. C++类可以通过重载[]运算符实现通过给定下标访问数组成员的元素。
D. C++类可以包含任意类型的成员变量。
4.一个连通的简单无向图,共有28条边,则该图至少有()个顶点。
A. 6B. 7C. 8D. 95.以下哪个方案不能合理解决或缓解哈希表冲突()。
A. 在每个哈希表项处,使用单链表管理该表项的冲突元素。
B. 建立额外的单链表,用来管理所有发生冲突的元素。
C. 使用不同的哈希函数再建立一个哈希表,用来管理所有发生冲突的元素。
D. 用新元素覆盖发生冲突的哈希表项。
6.已知一颗二叉树的中序遍历序列为{C F B A E D G},后序遍历序列为{F C B EG D A},则下列说法中正确的是()。
重载运算符的顺序是由编程语言的语法规则和编程者的设计决定的。
在C++中,重载运算符的一般格式为:cpp复制代码
返回类型operator@(参数表) {
重载函数体;
}
对于重载运算符的顺序,C++并没有规定特定的顺序。
你可以根据需要,按照你的编程逻辑和设计要求,来决定先重载哪个运算符,后重载哪个运算符。
然而,有一些规则是需要注意的:
1.不允许定义新的运算符。
2.不能改变该运算符操作数(对象)的个数。
3.不能改变该运算符的优先级别和结合性。
4.应该符合实际需要,重载的功能应该与运算符原有的功能相似,避免没有目的的使用重载运算符。
此外,运算符重载可以是成员函数,也可以是友元函数。
如果运算符重载为友元函数,需要在相应的类中声明为该类的友元函数。
因此,重载运算符的顺序并没有固定的规则,而是由编程者的设计需求和编程逻辑决定的。
同时,还需要注意遵守上述的运算符重载规则。
c++重载运算符的规则
重载运算符是C++中一项非常强大的特性,允许我们自定义类的行为,使其拥有类似于内置类型的行为。
在 C++ 中,我们可以重载
大部分运算符,包括算术运算符、比较运算符、位运算符等等。
重载运算符的规则包括以下几点:
1. 重载运算符必须是一个函数,函数名为 operator*、operator+ 等等。
其中 *、+ 等符号是要重载的运算符。
2. 重载运算符的参数个数和类型必须固定。
例如,重载 + 运算符时,必须定义一个接受两个参数的函数,其中至少一个参数是自定义类型。
3. 运算符重载函数可以是类的成员函数,也可以是全局函数。
如果是类的成员函数,第一个参数是隐式的 this 指针。
4. 有些运算符可以同时定义成成员函数和全局函数。
例如,重
载 << 运算符通常定义为全局函数,但是也可以定义成类的成员函数。
5. 一些运算符不允许被重载。
例如,?: 运算符、sizeof 运算符、:: 运算符等等。
6. 重载运算符要遵守相应的运算规则。
例如,重载 + 运算符时,需要定义相应的加法规则。
7. 某些运算符可以组合使用。
例如,重载 + 运算符时,可以定义 + 和 += 两种运算符,使其支持类似于内置类型的连续加法。
总的来说,重载运算符是 C++ 中非常强大的一项特性,允许我
们自定义类的行为,使其拥有类似于内置类型的行为。
但是,重载运
算符也需要遵守一定的规则,才能正常使用。
详解C++编程中的单⽬运算符重载与双⽬运算符重载C++单⽬运算符重载单⽬运算符只有⼀个操作数,如!a,-b,&c,*p,还有最常⽤的++i和--i等。
重载单⽬运算符的⽅法与重载双⽬运算符的⽅法是类似的。
但由于单⽬运算符只有⼀个操作数,因此运算符重载函数只有⼀个参数,如果运算符重载函数作为成员函数,则还可省略此参数。
下⾯以⾃增运算符”++“为例,介绍单⽬运算符的重载。
[例] 有⼀个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次⾛⼀秒,满60秒进⼀分钟,此时秒⼜从0开始算。
要求输出分和秒的值。
#include <iostream>using namespace std;class Time{public:Time( ){minute=0;sec=0;} //默认构造函数Time(int m,int s):minute(m),sec(s){ } //构造函数重载Time operator++( ); //声明运算符重载函数void display( ){cout<<minute<<":"<<sec<<endl;} //定义输出时间函数private:int minute;int sec;};Time Time::operator++( ) //定义运算符重载函数{if(++sec>=60){sec-=60; //满60秒进1分钟++minute;}return *this; //返回当前对象值}int main( ){Time time1(34,0);for (int i=0;i<61;i++){++time1;time1.display( );}return 0;}运⾏情况如下:34:134:2┆34:5935:035:1 (共输出61⾏)可以看到:在程序中对运算符“++”进⾏了重载,使它能⽤于Time类对象。
C++试题(一)附答案一、单项选择题(共20题,每题1分,共20分)1、下列关于C++标识符的命名不合法的是A. PadB. name_1C. A#bcD. _a122、若有以下类型标识符定义:()int x=2; char w='a'; float y=23.45f; double z=45.6712;则表达式w*x+y-z的结果类型是A. floatB. charC. intD. double3、若有int x=10,y=20,z=30; 则执行下面语句后,x的值是if(x>y)z=x;x=y;y=z;A. 10B. 20C. 30D. 04、循环语句whlie(int i=0 )i--;的循环次数是A. 0B. 1C. 5D. 无限5、一个函数无返回值时,应选择的说明符是A. staticB. externC. voidD. 无说明符6、对重载函数形参的描述中,错误的是A. 参数的个数可能不同B. 参数的类型可能不同C. 参数的顺序可能不同D. 参数的个数、类型、顺序都相同,只是函数的返回值类型不同7、以下能正确定义数组并正确赋初值的语句是A. int N=5,b[N][N];B. int a[2]={{1},{3},{4},{5}};C. int c[2][]={{1,2},{3,4}};D. int d[3][2]={{1,2},{3,4}};8、下列给字符数组进行的初始化中,不正确的是A. char s1[]="abcd";B. char s2[3]={'x','y','\0'};C. char s3[]={'a','x','y','\0'};D. char s4[6]={"xyz","mnp"};9、通常的拷贝构造函数的参数是A.某个对象名 B.某个对象成员名C.某个对象的引用 D.某个对象的指针名10、关于构造函数特点的描述中,错误的是A. 定义构造函数必须指出类型B. 构造函数的名字与该类的类名相同C. 一个类中可定义0至多个构造函数D. 构造函数是一种成员函数11、下面程序的运行结果为#includeint add(int a,int b);void main(){extern int x,y;cout<<add(x,y)<<endl;< p="">}int x=20,y=5;int add(int a,int b){int s=a+b;return s;}A.20 B.5 C.25 D.编译会提示出错信息12、关于常成员的描述中,错误的是A. 常成员包含常数据成员和常成员函数两种B. 常数据成员必须是公有的C. 常数据成员要使用构造函数成员初始化列表进行初始化D. 常对象只能调用它的常成员函数,不能调用其它的成员函数13、关于友元函数的描述中,错误的是A. 友元函数不是成员函数B. 友元函数只能访问类中私有成员C. 友元函数破坏隐藏性,尽量少用D. 友元函数说明在类体内,使用关键字friend14、如果有int x,*p; float y,*q;则下面操作正确的是A.p=x B.p=qC.p=&x D.p=&y15、若有函数说明void fA(int m, int n); 和指针变量的定义 void (*p)(int,int);并且有p= fA 则下列操作不正确的是A.(*p)(3,4); B.p(3,4);C.fA(3,4); D.*p++;16、若数组名作实参而指针变量作形参,函数调用时实参传给形A. 数组的长度B. 数组第一个元素的值C. 数组所有元素的值D. 数组第一个元素的地址17、对于动态分配内存空间描述正确的是A.使用new运算符分配的内存空间的长度必需是常量B.delete运算符可以释放动态的存储空间和静态的存储空间C.由new分配的内存空间是不连续的D.delete运算符只能释放由new分配的动态存储空间18、能够释放对象所占资源的是()A.析构函数 B.数据成员C.构造函数 D.静态成员函数19、虚函数的定义是在基类中进行的,定义时需要冠以关键字A.static B.frendC.virtual D.public20、在C++中串流类是在头文件strstrea.h中定义的,下列不属于串流类的是)A.strstream B.ostrstreamC.ofstream D.istrstream二、填空题(共9题16空,每空1分,共16分)1、函数重载时,编译系统会根据____ 或____ 来区分。
重载[]运算符
1. 重载[]运算符
[]运算符又叫下标运算符,表示取出容器或者字符串中指定位置的元素,它可以对容器类型和字符串类型重载,因此下面用以表示取出容器的方式也可以用于取出字符串。
(1)重载容器类型
对容器类型进行重载,常用方式如下:
(a) 以常规下标方式:
vector<int> ivec;
ivec[0] = 10;
(b) 以迭代器方式:
vector<int> ivec;
*ivec.begin() = 10;
(2)重载字符串类型
对字符串类型进行重载,其用法和容器类型的正好相反,即: (a) 以迭代器方式:
string str('hello');
*str.begin() = 'H';
(b) 以常规下标方式:
string str('hello');
str[0] = 'H';
总而言之,重载[]运算符对容器类型和字符串类型有着不同的运
用方式,它们可以取出容器或者字符串中指定位置的元素。
运算符重载一.单项选择题1.下列运算符中,运算符在C++中不能重载。
A.?:B.+C.D.<=解:C++中不能被重载的运算符有:·,一,::,?:。
本题答案为A。
2.下列运算符中,运算符在C++中不能重载。
A.&&B.[]C.::D.new解:c++中不能被重载的运算符有:·,·+,::,?:。
本题答案为c。
3.下列关于运算符重载的描述中,是正确的。
A.运算符重载可以改变操作数的个数B.运算符重载可以改变优先级C.运算符重载可以改变结合性D.运算符重载不可以改变语法结构解:运算符重载不能改变操作数的个数、运算符的优先级、运算符的结合性和运算程的语法结构。
本题答案为D。
4.友元运算符objl>obj2被C++编译器解释为。
A.operator>(objl,obj2) B.>(obj1,obj2)C.obj2.operator:>(obj1) D.objl.operator>(obj2)解:重载为友元函数的运算符的调用形式如下:operator<运算符>(<参数,<参数2>)等价于:<参数1><运算符><参数2>本题答案为A。
5.现需要对list类对象使用的逻辑运算符“==”重载,以下函数声明是正确的。
A、list&list::operator==(const list&a) ;B、list list::operator==(const list&a) ;C、bool&list::operator==(const list&a);D、bool list::operator==(const list&a);6.以下类中分别说明了“+=”和“++”运算符重载函数的原型。
如果主函数中有定义:fun m,c,d;,那么,执行语句c=m++;时,编译器把m++解释为:(3)A)c.o p e r a t o r++(m);B)m=o p e r a t o r++(m);C)m.o p e r a t o r++(m);D)o p e r a t o r++(m);class fun{public:....f u n o p e r a t o r+=(f u n);f r i e n d f u n o p e r a t o r++(f u n&,i n t);};答案:D7.在第33题中,当执行语句d+=m;时,C++编译器对语句作如下解释:(34)A.d=operator+=(m);B.m=operator+=(d);C. d.operator+=(m);D.m.operator+=(d);答案:C8.设有以下类定义,其中说明了“+”运算符重载函数的原型。