编程题6_1_重载运算符

合集下载

c 运算符的重载习题答案

c  运算符的重载习题答案

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++七级真题(含答案)

2024年3月GESP编程能力认证C++七级真题(含答案)

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++重载运算符的规则
重载运算符是C++中一项非常强大的特性,允许我们自定义类的行为,使其拥有类似于内置类型的行为。

在 C++ 中,我们可以重载
大部分运算符,包括算术运算符、比较运算符、位运算符等等。

重载运算符的规则包括以下几点:
1. 重载运算符必须是一个函数,函数名为 operator*、operator+ 等等。

其中 *、+ 等符号是要重载的运算符。

2. 重载运算符的参数个数和类型必须固定。

例如,重载 + 运算符时,必须定义一个接受两个参数的函数,其中至少一个参数是自定义类型。

3. 运算符重载函数可以是类的成员函数,也可以是全局函数。

如果是类的成员函数,第一个参数是隐式的 this 指针。

4. 有些运算符可以同时定义成成员函数和全局函数。

例如,重
载 << 运算符通常定义为全局函数,但是也可以定义成类的成员函数。

5. 一些运算符不允许被重载。

例如,?: 运算符、sizeof 运算符、:: 运算符等等。

6. 重载运算符要遵守相应的运算规则。

例如,重载 + 运算符时,需要定义相应的加法规则。

7. 某些运算符可以组合使用。

例如,重载 + 运算符时,可以定义 + 和 += 两种运算符,使其支持类似于内置类型的连续加法。

总的来说,重载运算符是 C++ 中非常强大的一项特性,允许我
们自定义类的行为,使其拥有类似于内置类型的行为。

但是,重载运
算符也需要遵守一定的规则,才能正常使用。

详解C++编程中的单目运算符重载与双目运算符重载

详解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类对象。

补充例题_运算符重载

补充例题_运算符重载

}
赋值前:b = (3+2i)
6.3 典型运算符的重载
13
例6-14:为Student类重载基于深 层复制的赋值运算符 =
//Student.h #include<iostream> #include<sstream> using namespace std; class Student{ char *name; //姓名 char the_class[12]; //班号 public: Student():name(NULL){ the_class[0]=„\0‟; } Student(char *name, char the_class[]); ~Student(){ delete []name; } const char *getName()const{ return name; } const char *getClass()const{ return the_class; } void toUpper(){ strupr(name); } string toString()const; Student& operator =(const Student &st); };
6.3 典型运算符的重载
20
例6-16(续)
DoubleArray::DoubleArray(int max) { min_index = 0; max_index = max; data=new double[max_index+1]; } double & DoubleArray::operator [](int index) { if(index<min_index || index>max_index) { cout<<“Index out of range”; exit(1); } return data[index-min_index]; }

C++试题(一)附答案

C++试题(一)附答案

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';
总而言之,重载[]运算符对容器类型和字符串类型有着不同的运
用方式,它们可以取出容器或者字符串中指定位置的元素。

JAVA考试题库第六章

JAVA考试题库第六章
6-5.下列关于用户创建自己的异常描述中,错误的是(D) A.创建自己的异常应先创建一个异常类 B.为实现抛出异常,须在可能抛出异常的方法中书写 throw 语句 C.捕捉异常的方法是使用 try-catch-finally 语句格式 D.使用异常处理不会使整个系统更加安全和稳定
二 判断题
6-1.异常是一种特殊的运行错误的对象。(对) 6-2.异常处理可以使整个系统更加安全和稳定。(对) 6-3.异常处理是在编译时进行的。(错) 6-4.Java 语言中异常类都是 ng.Throwable 的子类。(对) 6-5.Throwable 类有两个子类:Error 类和 Exception 类。前者由系统保留,后者供应用程序使用。(对) 6-6.异常通常是指 Error 类和 Exception 类。(错) 6-7.Exception 类只有一个子类为 RuntimeException。(错) 6-8.在异常处理中,出现异常和抛出异常是一回事。(错) 6-9.运行时异常是在运行时系统检测并处理的。(错) 6-10.使用 try-catch-finally 语句只能捕获一个异常。(错) 6-11.捕获异常时 try 语句后面通常跟有一个或多个 catch()方法用来处理 try 块内生成的异常事件。(对) 6-12.使用 finally 语句的程序代码为该程序提供一个统一的的出口。(对) 6-13.抛出异常的方法说明中要加关键字 throws,并在该方法中还应添加 throw 语句。(对) 6-14.创建异常类时要给出该异常类的父类。(对) 6-15.如果异常类没有被捕获将会产生不正常的终止。(对) 三 分析程序的输出结果
6-1.Exer6_1.java public class Exer6_1 { public static void main(String args[] )

C++运算符重载题库及答案

C++运算符重载题库及答案

运算符重载一.单项选择题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.设有以下类定义,其中说明了“+”运算符重载函数的原型。

C语言运算符的重载详解

C语言运算符的重载详解

C语⾔运算符的重载详解⽬录写⼀个Add函数为什么不⽤加号作为函数名运算符的重载上⾯问题解决总结写⼀个Add函数我们先讨论下⾯代码,并复习前⾯的内容class Complex{private:double Real, Image;public:Complex() :Real(0), Image(0) {}Complex(double r, double i) :Real(r), Image(i) {}~Complex() {}//Complex Add(const Complex* const this,const Complex &c)Complex Add(const Complex& x)const{Complex y;y.Real = Real + x.Real;y.Image = Image + x.Image;return y;//return Complex(this->Real + x.Real, this->Image + x.Image);}void Print(){cout << Real << "+" << Image << "i" << endl;}};int main(){Complex c1(12, 23);Complex c2(4.5, 5.6);Complex c3;c3 = c1.Add(c2);c3.Print();return 0;}直接return可以使⽤⽆名函数直接代替将亡值对象,相⽐可以省⼀次对象的构建我们再分析如果我们使⽤引⽤返回Add函数const Complex& Add(const Complex& x)const{Complex y;y.Real = Real + x.Real;y.Image = Image + x.Image;return y;//return Complex(this->Real + x.Real, this->Image + x.Image);}若我们以引⽤返回,将亡值对象会创建在Add函数的栈帧中,然后返回将亡值地址,函数return结束该空间会被释放、若没有引⽤,构建⽆名对象也就是将亡值对象会构建在主函数的空间中,这⾥使⽤将亡值对象值给到c3是没有问题的我们查看对象的构造与析构class Complex{private:double Real, Image;public:Complex() :Real(0), Image(0) {}Complex(double r, double i) :Real(r), Image(i){cout << "Create:" << this << endl;}Complex(const Complex& x):Real(x.Real),Image(x.Image){cout << "Copy Create:" << this << endl;}~Complex(){cout << "~Complex:" << this << endl;}//Complex Add(const Complex* const this,const Complex &c)Complex Add(const Complex& x)const{return Complex(this->Real + x.Real, this->Image + x.Image);}void Print(){cout << Real << "+" << Image << "i" << endl;}};int main(){Complex c1(12, 23);Complex c2(4.5, 5.6);Complex c3;c3 = c1.Add(c2);c3.Print();return 0;}⾸先我们使⽤引⽤返回需要加上const修饰,这是因为我们返回将亡值在临时空间具有常性,所以普通引⽤是不能进⾏返回的,需要使⽤常引⽤返回const Complex& Add(const Complex& x)const{return Complex(this->Real + x.Real, this->Image + x.Image);}我们发现对临时对象的构建后马上就进⾏析构,那么是怎么将数据拿出给到c3的?这个在最后我们进⾏分析为什么不⽤加号作为函数名//Complex operator+(const Complex* const this,const Complex &c)Complex operator+(const Complex &c) const{return Complex(this->Real + x.Real, this->Image + x.Image);}这⾥是不可以的,加号是⼀个操作符,不能使⽤操作放作为有效的函数名称;但是在C++中为了使这些操作符号能够当作函数名,那么我们需要在前⾯加上⼀个关键字operator//Complex operator+(const Complex* const this,const Complex &c)Complex operator+(const Complex &c) const{return Complex(this->Real + x.Real, this->Image + x.Image);}也就是告诉编译器,加号是⼀个有效的函数名,这就叫做运算符的重载;随后我们之间使⽤ c3 = c1 + c2 就是可以的int main(){Complex c1(12, 23);Complex c2(4.5, 5.6);Complex c3;c3 = c1 + c2;//编译器编译会是下⾯的情况//c3 = c1.operator+(c2);//c3 = operator+(&c1,c2); 加上this指针}运算符的重载⼀个对象,编译器会给它有6个缺省函数我们再来看下⾯这个问题//我们写⼀个赋值运算符重载void operator=(const Object& obj){this->value = obj.value;}//返回类型为void,这样不可以就不可以连等//obja = objb = objc;//obja = objb.operator=(objc);//obja = operator=(&objb,objc); 返回的⽆类型,不能给obja赋值且赋值函数不可以定义为const修饰Object& operator=(const Object& obj){this->value = obj.value;return *this;}obja = objb = objc;//改写obja = objb.operator=(objc);obja = operator=(&objb,objc);obja.operator=(operator=(&objb,objc));operator=(&obja,operator=(&objb,objc));通过返回对象,就可以实现连等;并且我们可以通过引⽤返回,因为此对象的⽣存期并不受函数的影响,不会产⽣⼀个临时对象作为⼀个过度防⽌⾃赋值若是我们将obja给obja赋值,也就是⾃赋值obja = objaoperator=(&obja,obja);我们就需要进⾏⼀步判断Object& operator=(const Object& obj){if(this != &obj)//防⽌⾃赋值{this->value = obj.value;}return *this;}上⾯问题解决我们通过这段代码来看,与上⾯问题相同Object& operator=(const Object& obj){if (this != &obj){this->value = obj.value;}return *this;}};Object& fun(const Object& obj){int val = obj.Value() + 10;Object obja(val);return obja;}int main(){Object objx(0);Object objy(0);objy = fun(objx);cout << objy.Value() << endl;return 0;}我们在这⾥希望通过引⽤返回,这⾥return的临时对象会构建在fun函数的栈帧中,并且在函数结束栈帧释放,随后调⽤赋值运算符重载,但是数值依旧是正确的我们跟踪这个被析构对象的地址,⾸先我们定位在fun函数的return obja;,随后进⼊析构函数将我们的obja进⾏析构接着运⾏到回到主函数进⾏赋值,接着进⼊赋值运算符重载,可以看到,这⾥的obj地址与已被析构的obja地址相同可以看到这个值依旧存在,依旧可以打印给出,这是因为vs2019的特殊性质造成的;我们每次运⾏程序会发现每次的对象地址都在变化,逻辑地址会随机改变,被析构对象的栈帧不会被接下来的赋值运算符重载扰乱地址空间,所以即使我们引⽤返回的对象已经死亡依旧可以将数值正确返回但是在vc中,我们得到的值会是随机值,这是因为vc中每次运⾏程序地址都不会改变,当我们从fun函数退出进⼊赋值语句中,就会将原本存储数据的地址扰乱,继⽽变成了随机值尽管我们引⽤返回能够将数据正确打印,但是该对象已经死亡,这是不安全的,所以我们⼀定不要以引⽤返回对象VS2019具有⼀个特点:当我们调⽤函数,若函数中没有定义局部变量或局部对象时,该函数基本不对栈帧进⾏清扫总结到此这篇关于C语⾔运算符的重载详解的⽂章就介绍到这了,更多相关C语⾔运算符重载内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

C++面向对象程序设计试题带答案(一)

C++面向对象程序设计试题带答案(一)

C++面向对象程序设计模拟试题一一、单项选择题(本大题共10小题,每小题2分,共201.说明虚函数的关键字是()。

A. inlinevirtual C. define D. static2.在每个C++程序中都必须包含有这样一个函数,该函数的函数名为()。

A. mainB. MAINC. nameD. function 3.cout是某个类的标准对象的引用,该类是()。

A. ostream B. istream C. stdout D. stdin4.如果在类外有函数调用CPoint::func();则函数func()是类CPoint的()。

A. 私有静态成员函数B. 公有非静态成员函数C. 公有静态成员函数 B. 友元函数5. 如果class类中的所有成员在定义时都没有使用关键字public、private或protected,则所有成员缺省定义为()。

A. publicB. protectedC. private D.static6.一个类的所有对象共享的是()。

A. 私有数据成员 B. 公有数据成员 C. 保护数据成员 D. 静态数据成员7.动态联编所支持的多态性称为()。

A. 虚函数 B. 继承C. 编译时多态性D. 运行时多态性8.定义类模板时要使用关键字()。

A. const B. newC. deleteD. template9.对虚基类的定义()。

A. 不需要使用虚函数 B. 必须使用虚函数C. 必须使用privatD. 必须使用public10.类型转换函数()。

A. 不能带有参数 B. 只能带一个参数 C. 只能带2个参数D. 只能带3个参数二、判断正误题(本大题共6小题,每小题2分,共12分)1.虚函数在基类和派生类之间定义,且要求函数原型完全一致。

()2.抽象类可以用来直接创建对象。

()3.内联函数中可以出现递归语句。

()4.模板类与类模板的意义完全相同。

()5.常对象只能调用常成员函数。

计算机二级(C++)6_真题-无答案

计算机二级(C++)6_真题-无答案

计算机二级(C++)6(总分1780,考试时间90分钟)选择题(每小题2分,共70分) 下列各题四个选项中,有一个是正确的,请选择正确答案。

1. C++语言中标点符号中表示一条预处理命令开始的是()。

A. #B. ;D. {2. 与y=(x>0? 1:x<0? -1:0);的功能相同的if语句是()。

A. 字符串a的长度B. 字符串b的长度C. 字符串a和b的长度之差D. 字符串a和b的长度之和3. 有如下程序#include<iostream.h>#define N2#define M N+1 #define NUM 2 * M+1void main( ){int i;for(i=1;i <=NUM;i++)cout <<i } 该程序中的for循环执行的次数是()。

A. 5 B. 6C. 7D. 84. 只能作为成员函数重载的是()。

A. =B. ++C. *D. new5. 下列运算符中全都可以被友元函数重载的是()。

A. 0B. 1C. 2D. 36. 对于模板定义关键字class和typename说法不正确的是()。

A. 程序中的class并不能都替换为typenameB. class和typename都可互相替换C. 程序中的typename都能替换为classD. 程序中的部分class可以替换为typename7. 对于下面的程序ifstreamfin(c:\test.txt);if(fin)cout<<"ok";else cout <<"wrong";对于if语句中的内容可以换为()。

A. classB. privateC. extendsD. public8. 下面程序的运行结果为()。

#include <iostream.h>void swap(int &a,intb){int temp;temp=a++;a=b;b=temp;} void main(){int a=2,b=3;swap(a,b);cout<<a<<"," <<B<<ENDL;}A. x%=(k%=5)B. x%=(k-k%5)C. x%=k-k%5D. (x%=k)-(k%=5)9. 在C++语言中,封装是借助于什么达到的?A. 货币型数据有时可以表示成整型数据B. 货币型数据与浮点型数据完全一样C. 货币型数据是由数字和小数点组成的字符串D. 货币型数据是小数点位置固定的实型数10. 下面程序的输出结果是()。

运算符重载的方法

运算符重载的方法

运算符重载的方法
运算符重载是指在类中重新定义某个运算符,使其能够用于类的实例。

重载运算符可以方便地对类对象进行加、减、乘、除等基本运算,也可以定义自定义运算符,以实现类特定的功能。

运算符重载的方法如下:
1.编写运算符重载函数:将要重载的运算符的符号作为函数名,如“+”、“-”、“*”、“/”等,对于自定义运算符可以自己命名。

2.指定参数个数和类型:重载函数需要参数,这些参数有不同的类型,可以是类的成员变量或其他类型的变量。

3.重载运算符要求:
(1)操作数至少有一个是类的实例,重载函数可以定义为类的成员函数或全局函数。

(2)运算符重载不能改变原有操作数的类型或个数。

(3)运算符重载函数可以返回任何类型的值,甚至可以是类的实例。

4.使用运算符:一旦重载运算符函数定义好之后,就可以像使用普通的运算符一样使用它。

需要注意的是,运算符重载不是万能的,对于某些运算符,如“&&”、“”等,是不能够重载的。

此外,在使用运算符重载时应该避免过于复杂的实现方式,以防止代码难以理解和维护。

运算符重载

运算符重载

{
rpart=rp;
ipart=ip;
}
Complex add( const Complex & com )
{
Complex temp ;
temp .rpart= com .rpart+rpart;
temp .ipart= com .ip+ipart;
return temp ;
}
2020/7/2
பைடு நூலகம்};
★单目运算符重载 :
Complex Complex:: operator {
Complex temp;
( 单) 目无参数 双目一个参数
temp.rpart=-rpart;
temp.ipart)=-ipart;
return temp;
}
Complex c=-a+b;
(a.operator-( )).operator+(b)
};
point point::operator+ (point p1)
{ point p; p.x=x+p1.x; p.y=y+p1.y; return p; }
void main()
{ point p1(10,10),p2(20,20); p1=p1+p2 ;
p1.print(); ++p1; p1.print();
}
//(╳)
运算符成员函数——调用成员函数的对象隐式成为表达式的第一个运算数 外部运算符函数——其第一个参数直接对应表达式的第一个运算数;
x1=x2+x3;
operator+(x2, x3);
2020/7/2
6 6

(完整版)C++程序设计第一章函数编程题

(完整版)C++程序设计第一章函数编程题

6-1 工作备忘录的生成(链表) (10 分)Node *q = head, *s = head;while((q != NULL)&&(q->start < p->start)){ //当前的q节点不是末尾,并且q节点的起始时间早于p节点的起始时间s = q; //s始终在q的前面q = q->next;} //直到当前节点NULL或者q的起始时间晚于p的起始时间if(q == head){ //p应该接在链表的开始位置,即成为新的表头p->next = head;head = p;}else{p->next = q;s->next = p;}return head;}void display(Node *head){Node *p = head, *q;bool conflict; //用于标识是否有冲突while(p != NULL){ //当前p节点不空,是有效任务conflict = false;q = head;while(!conflict && q != p){ //检查p的开始时间是否小于p之前的任务的结束时间if(q->end > p->start){ //p之前的任务的结束时间如果大于p的开始时间则冲突conflict = true;break;}q = q->next;}q = p->next;while(!conflict && q != NULL){ //检查p的结束时间是否大于p之后的任务的开始时间if(p->end > q->start){ //p之后的任务的开始时间如果大于p的结束时间则冲突conflict = true;break;}q = q->next;}if(conflict){ //当前任务与其它的任务时间冲突cout << "*";}cout << p->name << " " << p->start << " " << p->end << endl;p = p->next;}}6-2 函数调用 (10 分)6-3函数指针(理科实验班)(7分)大则返回true{if(s1.score[0] + s1.score[1] < s2.score[0] + s2.score[1]) return true;if(s1.score[0] + s1.score[1] == s2.score[0] + s2.score[1] && s1.num > s2.num) return true;return false;}bool s4(const Student &s1, const Student &s2)//比较s1和s2两位学生的总分大小,如果s2的大则返回true {if(s1.score[0] + s1.score[1] + s1.score[2] + s1.score[3] <s2.score[0] + s2.score[1] + s2.score[2] + s2.score[3])return true;if(s1.score[0] + s1.score[1] + s1.score[2] + s1.score[3] ==s2.score[0] + s2.score[1] + s2.score[2] + s2.score[3] && s1.num > s2.num) return true;return false;}int select(Student s[], int n, bool (*p)(const Student &s1, const Student &s2)) {int maxIndex = 0;for(int i = 1; i < n; i++){if((*p)(s[maxIndex], s[i])) maxIndex = i;}return s[maxIndex].num;}6-4 二维数组(海绵城市) (7 分){//维护一个一维数组,模拟栈的操作,从j开始深搜到一个邻居i且没有搜索过,则将i入栈,如果i==k则搜索成功//维护一个一维数组,有N个元素,用于记录某个楼是否搜索过int stack[N+1] = {0}; //存储从j开始走过的路径,如 j m n t,表示从j开始经过m n走到了tbool visited[N+1] = {false};int top = 0; //top记录数组stack的最后一个元素的位置,//首先j入栈stack[++top] = j;visited[j] = true;while(top > 0) //当前栈不空{int cur = stack[top--]; //得到当前栈顶//把与cur连接的所有未访问过的楼号压入栈for(int i = 0; i < N; i++){if(a[cur][i] == 1 && visited[i] == false){stack[++top] = i;if(i == k) return true; //访问到k则表示从j到k有通路visited[i] = true;}}}return false;}6-5 引用作函数形参交换两个整数 (10 分)设计一个void类型的函数Swap,该函数有两个引用类型的参数,函数功能为实现两个整数交换的操作。

Java语言程序设计(第2版)第1-6章 课后习题答案

Java语言程序设计(第2版)第1-6章 课后习题答案

第1章Java语言概述选择题1-1 在下列概念中,Java语言只保留了(B)A. 运算符重载B. 方法重载C. 指针D. 结构和联合1-2 下列关于Java语言特性的描述中,错误的是(D)A. 支持多线程操作B. Java程序与平台无关C. Java和程序可以直接访问Internet上的对象D. 支持单继承和多继承1-3 下列关于Java Application程序在结构上的特点的中,错误的是(C)A. Java程序是由一个或多个类组成的B. 组成Java程序的若干个类可以放在一个文件中,也可以放在多个文件中C. Java程序的文件名要与某个类名相同D. 组成Java程序的多个类中,有且仅有一个主类1-4 Java程序经过编译后生成的文件的后缀是(C)A. .objB. .exeC. .classD. .java1-5 下列关于运行字节码文件的命令行参数的描述中,正确的是(A)A. 第一个命令行参数(紧跟命令字的参数)被存放在args[0]中B. 第一个命令行参数被存放在args[1]中C. 命令行的命令字被存放在args[0]中D.数组args[]的大小与命令行参数的个数无关判断题1-1JavaC++的语言之前问世的。

(错)1-2Java语言具有较好的安全性和可移植性及与平台无关等特性。

(对)1-3Java语言中取消了联合的概念,保留了结构概念。

(错)1-4Java语言中数据类型占内在字节数与平台无关。

(对)1-5Java语言中可用下标和指针两种方式表示数组元素。

(错)1-6Java语言的源程序不是编译型的,而是编译解释型的。

(对)1-7操作系统中进程和线程两个概念是没有区别的。

(错)1-8Java语言既是面向对象的又是面向网络的高级语言。

(对)1-9Java程序分为两大类:一类是Application程序,另一类是Applet程序。

前者又称Java应用程序,后者又称为Java小应用程序。

(对)1-10Java Application程序是由多个文件组成的,其中可以有也可以没有主文件。

运算符重载详解

运算符重载详解

运算符重载详解1.运算符重载定义:C++中预定义的运算符的操作对象只能是基本数据类型。

但实际上,对于许多⽤户⾃定义类型(例如类),也需要类似的运算操作。

这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够⽤于特定类型执⾏特定的操作。

运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引⼈的特性之⼀。

运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进⾏的操作。

运算符函数的定义与其他函数的定义类似,惟⼀的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。

运算符函数定义的⼀般格式如下:<返回类型说明符> operator <运算符符号>(<参数表>){<函数体>} 2.运算符重载时要遵循以下规则:(1) 除了类属关系运算符"."、成员指针运算符".*"、作⽤域运算符"::"、sizeof运算符和三⽬运算符"?:"以外,C++中的所有运算符都可以重载。

(2) 重载运算符限制在C++语⾔中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。

(3) 运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。

(4) 重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。

(5) 运算符重载不能改变该运算符⽤于内部类型对象的含义。

它只能和⽤户⾃定义类型的对象⼀起使⽤,或者⽤于⽤户⾃定义类型的对象和内部类型的对象混合使⽤时。

(6) 运算符重载是针对新类型数据的实际需要对原有运算符进⾏的适当的改造,重载的功能应当与原有功能相类似,避免没有⽬的地使⽤重载运算符。

(7)重载运算符的函数不能有默认的参数,否则就改变了运算符的参数个数,与前⾯第3点相⽭盾了;(8)重载的运算符只能是⽤户⾃定义类型,否则就不是重载⽽是改变了现有的C++标准数据类型的运算符的规则了,会引会天下⼤乱的;(9)⽤户⾃定义类的运算符⼀般都必须重载后⽅可使⽤,但两个例外,运算符“=”和“&”不必⽤户重载;(10)运算符重载可以通过成员函数的形式,也可是通过友元函数,⾮成员⾮友元的普通函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
名称
编程题6_1_重载运算符:point类运算符重载
编译器选用g++
备注
描述
定义一个表示三维空间坐标点的类,并对下列运算符重载,主函数定义类对象并调用重载的运算符。
(1)输出流运算符<<:按(x,y,z)的格式输出该点坐标(坐标值为整形)
(2)关系运算符>:如果A点到原点(0,0,0)的距离大于B点到原点的距离则A>B的值为真,否则为假。
提示:(1)定义类的构造函数,带默认参数
(2)关于文件包含的特别说明:在VC++6.0下要用#include<iostream.h>包含头文件才支持友元,但是在本系统中,请仍然用:
#include<iostream>
using namespace std;
进行文件包含,否则会出现编译时的告警,尽管运行结果可以正确通过.
return 0;
}
在保存并预览之后,点开:“测试用例”选项卡,再选择下方的“添加”,加入两组测试用例
第一个测试用例,输入部分:
10
10
20Leabharlann 151510输出部分:(10,10,20)
(15,15,10)
p1>p2:1
p2>p1:0
第二个测试用例,输入部分:20
20
10
15
15
20
输出部分:(20,20,10)
d1=x*x+y*y+z*z;
d2=ob.x*ob.x+ob.y*ob.y+ob.z*ob.z;
return d1>d2;
}
ostream &operator<<(ostream &out,const point &ob)
{
out<<"("<<ob.x<<","<<ob.y<<","<<ob.z<<")\n";
{
x=xx;
y=yy;
z=zz;
}
int operator >(const point &ob);
friend ostream &operator<<(ostream &out,const point &ob);
};
int point::operator >(const point &ob)
{
int d1,d2;
(5)其他选项可以自行设定,例如开启时间,结束时间,等等,需要大家逐步熟悉
return out;
}
int main()
{
int a,b,c;
int o,p,q;
cin>>a>>b>>c;
cin>>o>>p>>q;
point p1(a,b,c),p2(o,p,q);
cout<<p1;
cout<<p2;
cout<<"p1>p2:"<<(p1>p2)<<endl;
cout<<"p2>p1:"<<(p2>p1)<<endl;
return 0 ;
}
参考源代码仅供老师参考,不要添加到系统中
★说明:
(1)请各位按上表格式,第一列不变,第二三列为各位根据题目填写
(2)允许的编程语言:选gc++,
(3)名称和描述两项请将文档第二列内容对应贴入系统中
(4)测试用例请各位自己添加,题目的最后已有描述,每个题目也说明了要给几组测试用例
(15,15,20)
p1>p2:1
p2>p1:0
参考源程序代码
#include <iostream>
using namespace std;
//说明:在VC++下用#include<iostream.h>进行文件包含
class point
{
int x,y,z;
public:
point(int xx=0,int yy=0,int zz=0)
(3)主函数定义提示:
int main()
{ int a,b,c;
int o,p,q;//用于两个点的坐标值从键盘输入
……//输入以上6个整数
point p1(a,b,c),p2(o,p,q);//定义两个对象名为p1,p2
……//调用重载的<<运算符输出p1,p2
……//调用重载的>运算符比较p1,p2到原点的距离并按格式输出
相关文档
最新文档