C++运算符重载例程详解

C++运算符重载例程详解
C++运算符重载例程详解

运算符重载就是对一个已有的运算符赋予新的含义,使之实现新功能。下面将通过简单的几个例程阐叙其用法。

例10.1 通过函数来实现复数相加。

#include

using namespace std;

class Complex //定义Complex类

{public:

Complex( ){real=0;imag=0;} //定义构造函数

Complex(double r,double i){real=r;imag=i;} //构造函数重载Complex complex_add(Complex &c2); //声明复数相加函数void display( ); //声明输出函数private:

double real; //实部

double imag; //虚部

};

Complex Complex::complex_add(Complex &c2)

{Complex c;

c.real=real+c2.real;

c.imag=imag+c2.imag;

return c;}

void Complex::display( ) //定义输出函数{cout<<″(″<

int main( )

{Complex c1(3,4),c2(5,-10),c3; //定义3个复数对象c3=https://www.360docs.net/doc/189923394.html,plex_add(c2); //调用复数相加函数cout<<″c1=″; c1.display( ); //输出c1的值cout<<″c2=″; c2.display( ); //输出c2的值

cout<<″c1+c2=″; c3.display( ); //输出c3的值

return 0;

}

例10.2 改写例10.1,重载运算符“+”,使之能用于两个复数相加。#include

using namespace std;

class Complex

{public:

Complex( ){real=0;imag=0;}

Complex(double r,double i){real=r;imag=i;}

Complex operator+(Complex &c2); //声明重载运算符的函数void display( );

private:

double real;

double imag;

};

Complex Complex::operator+(Complex &c2) //定义重载运算符的函数

{ Complex c;

c.real=real+c2.real;

c.imag=imag+c2.imag;

return c;}

void Complex∷display( )

{ cout<<″(″<

int main( )

{ Complex c1(3,4),c2(5,-10),c3;

c3=c1+c2; //运算符+用于复数运算

cout<<″c1=″;c1.display( );

cout<<″c2=″;c2.display( );

cout<<″c1+c2=″;c3.display( );

return 0;

}

例10.3 将运算符“+”重载为适用于复数加法,重载函数不作为成员函数,而放在类外,作为Complex类的友元函数。

#include

using namespace std;

class Complex

{public:

Complex( ){real=0;imag=0;}

Complex(double r,double i){real=r;imag=i;}

friend Complex operator + (Complex &c1,Complex &c2);

//重载函数作为友元函数

void display( );

private:

double real;

double imag;

};

Complex operator + (Complex &c1,Complex &c2)

//定义作为友元函数的重载函数

{return Complex(c1.real+c2.real, c1.imag+c2.imag);}//简洁的写法

void Comple::display( )

{cout<<″(″<

int main( )

{Complex c1(3,4),c2(5,-10),c3;

c3=c1+c2;

cout<<″c1=″; c1.display( );

cout<<″c2=″; c2.display( );

cout<<″c1+c2 =″; c3.display( );

}

例10.4 定义一个字符串类String,用来存放不定长的字符串,重载运

算符“==”,“<”和“>”,用于两个字符串的等于、小于和大于的比较运算。

为了使读者便于理解程序,同时也使读者了解建立程序的步骤,下面分几步来介绍编程过程。

(1) 先建立一个String类:

#include

using namespace std;

class String

{public:

String( ){p=NULL;} //默认构造函数String(char *str); //构造函数

void display( );

private:

char *p; //字符型指针,用于指向字符串};

String∷String(char *str) //定义构造函数{p=str;} //使p指向实参字符串void String∷display( ) //输出p所指向的字符串{cout<

int main( )

{String string1(″Hello″),string2(″Book″);

string1.display( );

cout<

string2.display( );

return 0;

}

(2) 有了这个基础后,再增加其他必要的内容。现在增加对运算符重载的部分。

为便于编写和调试,先重载一个运算符“>”。程序如下:

#include

#include

using namespace std;

class String

{public:

String( ){p=NULL;}

String(char *str);

friend bool operator>(String &string1,String &string2);

//声明运算符函数为友元函数

void display( );

private:

char *p; //字符型指针,用于指向字符串

};

String∷String(char *str)

{p=str;}

void String∷display( ) //输出p所指向的字符串

{cout<

bool operator>(String &string1,String &string2) //定义运算符重载函数{if(strcmp(string1.p,string2.p)>0)

return true;

else return false;

}

int main( )

{String string1(″Hello″),string2(″Book″);

cout<<(string1>string2)<

}

(3) 扩展到对3个运算符重载。

在String类体中声明3个成员函数:

friend bool operator> (String &string1, String &string2);

friend bool operator< (String &string1, String &string2);

friend bool operator==(String &string1, String& string2);

在类外分别定义3个运算符重载函数:

bool operator>(String &string1,String &string2) //对运算符“>”重载{if(strcmp(string1.p,string2.p)>0)

return true;

else

return false;

}

bool operator<(String &string1,String &string2) //对运算符“<”重载{if(strcmp(string1.p,string2.p)<0)

return true;

else

return false;

}

bool operator==(String &string1,String &string2) //对运算符“==”重载{if(strcmp(string1.p,string2.p)==0)

return true;

else

return false;

}

再修改主函数:

int main( )

{String string1(″Hello″),string2(″Book″),string3(″Computer″); cout<<(string1>string2)<

cout<<(string1==string2)<

}

(4) 再进一步修饰完善,使输出结果更直观。下面给出最后的程序。#include

using namespace std;

class String

{public:

String( ){p=NULL;}

String(char *str);

friend bool operator>(String &string1,String &string2);

friend bool operator<(String &string1,String &string2);

friend bool operator==(String &string1,String &string2);

void display( );

private:

char *p;

};

String∷String(char *str)

{p=str;}

void String∷display( ) //输出p所指向的字符串

{cout<

bool operator>(String &string1,String &string2) {if(strcmp(string1.p,string2.p)>0)

return true;

else

return false;

}

bool operator<(String &string1,String &string2) {if(strcmp(string1.p,string2.p)<0)

return true;

else

return false;

}

bool operator==(String &string1,String &string2) {if(strcmp(string1.p,string2.p)==0)

return true;

else

return false;

}

void compare(String &string1,String &string2)

{if(operator>(string1,string2)==1)

{string1.display( );cout<<″>″;string2.display( );}

else

if(operator<(string1,string2)==1)

{string1.display( );cout<<″<″;string2.display( );}

else

if(operator==(string1,string2)==1)

{string1.display( );cout<<″=″;string2.display( );}

cout<

}

int main( )

{String string1(″Hello″),string2(″Book″),string3(″Computer″),string4(″Hello″);

compare(string1,string2);

compare(string2,string3);

compare(string1,string4);

return 0;

}

例10.5 有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走一秒,

满60秒进一分钟,此时秒又从0开始算。要求输出分和秒的值。

#include

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<

//定义输出时间函数

private:

int minute;

int sec;

};

Time Time::operator++( ) //定义运算符重载函数

{

if(++sec>=60)

{ sec=0; //满60秒进1分钟++minute;}

return *this; //返回当前对象值}

int main( )

Time time1(34,0);

for (int i=0;i<61;i++)

{++time1;

time1.display( );}

return 0;

}

例10.6 在例10.5程序的基础上增加对后置自增运算符的重载。修改后的程序如下:

#include

using namespace std;

class Time

{public:

Time( ){minute=0;sec=0;}

Time(int m,int s):minute(m),sec(s){}

Time operator++( ); //声明前置自增运算符“++”重载函数

Time operator++(int); //声明后置自增运算符“++”重载函数

void display( ){cout<

private:

int minute;

int sec;

};

Time Time∷operator++( ) //定义前置自增运算符“++”重载函数{if(++sec>=60)

{sec-=60;

++minute;}

return *this; //返回自加后的当前对象

}

Time Time∷operator++(int) //定义后置自增运算符“++”重载函数{Time temp(*this);

sec++;

if(sec>=60)

{sec-=60;

++minute;}

return temp; //返回的是自加前的对象

}

int main( )

{Time time1(34,59),time2;

cout<<″time1 : ″;

time1.display( );

++time1;

cout<<″++time1: ″;

time1.display( );

time2=time1++; //将自加前的对象的值赋给time2

cout<<″time1++: ″;

time1.display( );

cout<<″time2 :″;

time2.display( ); //输出time2对象的值

}

例10.7 在例10.2的基础上,用重载的“<<”输出复数。

#include

using namespace std;

class Complex

{public:

Complex( ){real=0;imag=0;}

Complex(double r,double i){real=r;imag=i;}

Complex operator + (Complex &c2); //运算符“+”重载为成员函数friend ostream& operator << (ostream&,Complex&);

//运算符“<<”重载为友元函数

private:

double real;

double imag;

};

Complex Complex::operator + (Complex &c2)

//定义运算符“+”重载函数

{return Complex(real+c2.real,imag+c2.imag);}

ostream& operator << (ostream& output,Complex& c)

//定义运算符“<<”重载函数

{output<<″(″<

return output;

}

int main( )

{Complex c1(2,4),c2(6,10),c3;

c3=c1+c2;

cout<

return 0;

}

(在Visual C++ 6.0环境下运行时,需将第一行改为#include ,并删去第2行。)

例10.8 在例10.7的基础上,增加重载流提取运算符“>>”,用“cin>>”输入复数,用“cout<<”输出复数。

#include

using namespace std;

{public:

friend ostream& operator << (ostream&,Complex&);

//声明重载运算符“<<”

friend istream& operator >> (istream&,Complex&);

//声明重载运算符“>>”

private:

double real;

double imag;

};

ostream& operator << (ostream& output,Complex& c)

//定义重载运算符“<<”

{output<<″(″<

return output;

}

istream& operator >> (istream& input,Complex& c)

//定义重载运算符“>>”

{cout<<″input real part and imaginary part of complex number:″; input>>c.real>>c.imag;

return input;

}

int main( )

cin>>c1>>c2;

cout<<″c1=″<

}

运算符重载基础概念练习题

运算符重载基础概念练习题 1、下列运算符中, ()运算符在C++中不能重载。 A = B () C :: D delete 2、下列运算符中, ()运算符在C++中不能重载。 A ?: B [] C new D && 3、下列关于C++运算符函数的返回类型的描述中,错误的是()。 A 可以是类类型 B 可以是int类型 C 可以是void类型 D 可以是float类型 4、下列运算符不能用友元函数重载的是()。 A + B = C * D << 5、在重载运算符函数时,下面()运算符必须重载为类成员函数形式。 A + B - C ++ D -> 6、下列关于运算符重载的描述中,正确的是()。 A 运算符重载可以改变运算符的操作数的个数 B 运算符重载可以改变优先级 C 运算符重载可以改变结合性 D 运算符重载不可以改变语法结构 7、友元运算符obj>obj2被C++编译器解释为()。 A operator>(obj1,obj2) B >(obj1,obj2) C obj2.operator>(obj1) D obj1.oprator>(obj2) 8、在表达式x+y*z中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。下列叙述中正确的是()。 A operator+有两个参数,operator*有两个参数 B operator+有两个参数,operator*有一个参数 C operator+有一个参数,operator*有两个参数 D operator+有一个参数,operator*有一个参数 9、重载赋值操作符时,应声明为()函数。 A 友元 B 虚 C 成员 D 多态 10、在一个类中可以对一个操作符进行()重载。 A 1种 B 2种以下 C 3种以下 D 多种 11、在重载一个运算符时,其参数表中没有任何参数,这表明该运算符是()。

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. sizeof C. new D. delete 3.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中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。下列叙述中正确的是(C )。 A.operator+有两个参数,operator*有两个参数 B.operator+有两个参数,operator*有一个参数 C.operator+有一个参数,operator*有两个参数 D.operator+有一个参数,operator*有一个参数 4.写出下列程序运行结果 4.1#include #using namesoace std;

运算符重载练习题.

运算符重载 一.单项选择题 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<运算符>(<参数1>,<参数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++解释为: (33) A) c.operator++(m); B) m=operator++(m); C) m.operator++(m); D) operator++(m); class fun { public: .. .. .. fun operator +=(fun ); friend fun operator ++(fun &,int); }; 答案:D 7. 在第33题中,当执行语句d+=m; 时,C++编译器对语句作如下解释: (34) A. d=operator+=(m); B. m=operator+=(d); C. d.operator+=(m); D. m.operator+=(d); 答案:C 8. 设有以下类定义,其中说明了“+”运算符重载函数的原型。这是一个友元函数,当类

C中用运算符重载实现矩阵运算

走进3D的世界 -- C++中用运算符重载实现矩阵运算 作者:周军 矩阵(Matrix)无处不在,我们的生活中到处都能找到矩阵的身影,然而此处我不想把这个定义放大,我们只讨论线性代数中的矩阵,我们要用它们来完成我们的3D变换。为什么矩阵可以完成3D变换呢?下面,我们就来介绍矩阵是如何变换坐标的: 设空间中有一坐标(x,y,z),如果我们想把它变换成另一坐标(x,’y’,z’),我们可以进行如下操作: = (x’,y’,z’,1) 这就是矩阵的妙用了。它在复杂处理变换的时候表现得尤为突出。假设我们想要把一个物体先沿z轴旋转角thetaZ,再沿x轴旋转角thetaX,我们可以进行如下操作(pseudo-code): obj*=rotX(thetaX)*rotZ(thetaZ); 注意:矩阵的乘法是不可逆的,而且我们要按变化顺序的逆序进行乘法,具体推导见计算几何相关书籍。 下面,我们进入正题:如何再C++中用重载运算符的方法来进行矩阵运算以完成线性变换呢?我们需要变换坐标,所以很自然地,我们需要一个向量(Vector)类;同时我们要进行

为直观、人性化,我选用了运算符重载这以技巧而不是简单地调用函数,下面请看我的具体实现:

以上便是CVector类的具体实现,我想对C++和线性代数有所了解的读者都能很清楚地理解这段代码,在次不累述。 上述代码的成员函数实在类外定义的,如果读者在实践中为了提高速度可以把这些成员函数定义在类内以起到内联函数的作用,可以省去参数压栈、出栈时的时间。 下面是CMatrix类的具体实现:

是不是也很好理解呢?哈哈,这就是用运算符重载的好处。不过这种方法也确实有它的不足,而且这个不足在游戏编程中是致命的,那就是效率不高,这也正是为什么Microsoft 在DirectX中也使用难看的一般函数调用来完成矩阵运算的原因。影响速度的主要原因是在使用运算符+、-、*、/等时,程序会在每次运算时创建临时对象再将临时对象返回,对于重复多次的矩阵运算来说,这无疑成为了一笔庞大的额外开销(好在现在的计算机的处理速度还算快)。但注意:在使用+=、-=、*=、/=时不会有上述问题,因为在使用这些运算符时程序只需要修改第一个对象不需要创建并返回临时对象。所以在能使用+=、-=、*=、/=时尽量不要使用单一的=、-、*、/运算符。 好了,这两个类我们已经封装好了,下面还有什么呢?是的,忘了向大家交代旋转矩阵了:

运算符重载

运算符重载 例子:复数加,Point 所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能。运算符也可以重载。 运算符重载是对已有的运算符赋予多重含义。 C++中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)(一) C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。 (二)C++允许重载的运算符C++中绝大部分的运算符允许重载. 不能重载的运算符只有5个: (1) 成员访问运算符. ???? (2) 作用域运算符∷ (3) 条件运算符?: (4) 成员指针运算符* ????? (5) 编译预处理命令的开始符号# (三) 重载不能改变运算符运算对象(即操作数)的个数。 (四) 重载不能改变运算符的优先级别。 (五) 重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数,与前面第(3)点矛盾。 (六) 重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。也就是说,参数不能全部是C++的标准类型,以防止用户修改用于标准类型数据的运算符的性质。 (七) 用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必用户重载。 ①赋值运算符(=)可以用于每一个类对象,可以利用它在同类对象之间相互赋值。 ②地址运算符&也不必重载,它能返回类对象在内存中的起始地址。 总之,当C++语言原有的一个运算符被重载之后,它原先所具有的语义并没有消失,只相当于针对一个特定的类定义了一个新的运算符。 C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。 运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下: <返回类型说明符> operator <运算符符号>(<参数表>) {

运算符重载题目

二、运算符重载(运算符重载的基本概念、运算符重载方法、运算符重载规则、特殊运算符重载和类型转换) 单选题10道: 1、假定要对类AB定义加号操作符重载成员函数,实现两个AB类对象的加法,并返回相加结果,则该成员函数的声明语句为( B )。 A. AB operator+(AB& a,AB& b) B. AB operator+(AB& a) C. operator+(AB a) D. AB &operator+( ) 2、关于运算符重载,下面的叙述错误的是()。 A.运算符预定义的操作数个数不能改变 B.重载不能改变运算符的优先级顺序 C.参数的类型没有限制 D.尽量使其与原意保持一致 3、在一个类中可以对一个操作符进行(D )重载。 A. 1种 B. 2种以下 C. 3种以下 D. 多种 4、重载赋值操作符时,应声明为(C )函数。 A. 友元 B. 虚 C. 成员 D. 多态 5、要在类对象使用运算符,以下不必被重载的运算符是( A )。 A. [] B. = C. ++ D. -- 6、下列运算符中,不能重载的是(C ) A.new B.() C.::D.&& 7、在表达式x+y*z中,+ 是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。下列叙述中正确的是( A )。 A)operator+有两个参数,operator*有两个参数 B)operator+有两个参数,operator*有一个参数 C)operator+有一个参数,operator*有两个参数 D)operator+有一个参数,operator*有一个参数 8、友元运算符obj1>obj2被C++编译器解释为()。 A) operator>(obj1,obj2) B) >(obj1,obj2) C) obj1.operator>(obj2) D) obj2.operator>(obj1) 9、已知某个类的友元函数重载了+=和-,a,b,c是该类的对象,则“a+=b-c”被C++编译器解释为()。 A) operator+=(a,operator-(b,c)) B) a.operator+=(b.operator-(c)) C) operator+=(a,b.operator-(c)) D) a.operator+=(operator-(b,c)) 10、下列运算符中,必须使用成员函数进行重载的是()。 A) == B) = C) >> D) ++ 填空题10道: 1、多数运算符既能作为类的成员函数重载,也能作为类的非成员函数重载,但运算符“[]”只能作为类的函数重载。 2、加法运算符“+”和赋值运算符“=”都重载之后,“+=”也被重载了。 3、单目运算符作为类的成员函数重载时形参。 4、利用成员函数对二元运算符重载时,其右操作数为。 5、重载运算符函数的函数名由关键字引出。 6、运算符的重载归根结底是的重载。 7、后缀自增自减运算符定义时带有一个。

Student类(友元,运算符重载,继承)综合题

//定义Student类,Date类,类定义与成员函数,实现分离。 //将Student类声明为Date的友元类。Student类需要提前声明。 //Student类的成员函数可以访问Date类的私有成员。 //成员函数:构造函数,构造函数重载,析构函数, //输出函数,求成绩最低者函数,排序函数。 //使用new,delete,动态分配内存。实现班级人数不固定,可以从键盘输入。 //定义Doctor类(研究生)-公共继承于Student类 //增加私有成员:string thesis(论文评价),int sci_value(科研分值) //增加相应的成员函数 //增加友元函数-运算符重载<<,>> //增加成员函数--按照科研分值高低排序 //student.h---头函数,类的定义 #include #include using namespace std; class Student; //提前声明 class Date //定义Date类-存放出生年月日 { friend class Student; //友元类,Student成员函数可以访问Date类的私有成员public: Date(); //无参构造函数 Date(int,int,int); //有参构造函数 ~Date(); //析构函数 //protected: //这里是保护成员//这里是VC6.0的原因 int year; //年 int month; //月 int day; //日 }; class Student //定义Student类-存放学生信息 { public: Student(); //无参构造函数 Student(string ,string ,char,Date,int); //有参构造函数 ~Student(); //析构函数 void display(); //输出函数 void input(); //输入函数 void min(Student*,int); //求最低成绩函数 void sort(Student*,int); //按照成绩高低排序函数 //protected: //这里是保护成员//这里是VC6.0的原因string num; //学号 string name; //姓名 char sex; //性别

国家二级C++机试(运算符重载、模板和C++流)模拟试卷7

国家二级C++机试(运算符重载、模板和C++流)模拟试卷7 (总分:58.00,做题时间:90分钟) 一、选择题(总题数:29,分数:58.00) 1.下列关于函数模板的描述中,正确的是( )。 (分数:2.00) A.函数模板是一个实例函数 B.使用函数模板定义的函数没有返回类型 C.函数模板的类型参数与函数的参数相同 D.通过使用不同的类型参数,可以从函数模板得到不同的实例函数√ 解析:解析:函数模板是一系列相关函数的模型或样板,这些函数的源代码相同,只是所针对的数据类型不同。数据类型成了函数模板的参数,所以函数模板是一种参数化类型的函数。 2.有如下函数模板定义: template<typename T1,Typename T2> T1 Fun(T2 n){ return n*5.0;} 若要求以int型数据9作为函数实参调用该模板,并返回一个double型数据,则该调用应表示为( )。 (分数:2.00) A.FUN(9) B.FUN<9> C.FUN<double>[9] √ D.FUN<9>(double) 解析:解析:根据函数模板的定义,在选项C的调用中,把double类型传递给T1,int型传递给T2。 3.下列关于模板的描述中,错误的是( )。 (分数:2.00) A.类模板的成员函数都是模板函数 B.函数模板是一种参数化类型的函数 C.满足一定条件时可以省略模板实参 D.模板形参只能由关键字typename声明√ 解析:解析:同一模板的声明和定义中,模板形参的名字不必相同。每个模板类型形参前面必须带上关键字typename/class,每个非类型形参前面必须带上类型名字。 4.已知主函数中通过如下语句序列实现对函数模板swap的调用: int a[10],b[10]; swap(a,b,10);下列对函数模板swap的声明中,会导致上述语句序列发生编译错误的是( )。 (分数:2.00) A.template<typename T> void swap(T a[],T b[],int size); B.template<typename T> void swap(int size,T a[],T b[]);√ C.template<typename T1,typename T2> void swap(T1 a[],T2 b[],int size}; D.template<class T1,class T2> void swap(T1 a[],T2 b[],int size); 解析:解析:由题目中函数swap(a,b,10)调用语句可知,在对函数模板swap的声明语句中,应将第一、二个参数设为数组变量,第三个参数为整型变量。 5.在定义函数模板或类模板时,开头的保留字是( )。 (分数:2.00) A.typename B.template √ C.class D.typedef 解析:解析:定义函数模板或类模板时,开头的保留字是template。 6.若有函数模板mySwap和一些变量定义如下:( )。template<class T>void mySwap(T x,T y);double d1,d2;int i1,i2;下列对mySwap的调用中,错误的是 (分数:2.00) A.mySwap(i1,i2)

实验8--友元函数与运算符重载函数

实验十三 1.实验目的 通过本次实验 (1)理解友元函数与运算符重载函数的概念; (2)学会友元函数的定义与使用方法; (3)掌握运算符重载函数的定义与使用方法; 2.实验要求 (1)编写实验程序 (2)在VC++运行环境中,输入源程序 (3)编译运行源程序 (4)输入测试数据进行程序测试; (5)写出运行结果。 3.实验内容 (1)定义一个复数类,重载“-=”运算符,使这个运算符能直接完成复数的“-=”运算。分别用成员函数与友元函数编写运算符重载函数。在主函数中定义复数对象c1(10,20)、c2(15,30),进行c2-=c1的复数运算,并输出c1、c2的复数值。 参考资料: (1)成员函数 # include class Complex { private: float Real,Image; public: Complex(float r=0,float i=0) { Real=r;Image=i;} void Show(int i) { cout<<"c"< class Complex { private: float Real,Image; public: Complex(float r=0,float i=0) { Real=r;Image=i;} void Show(int i) { cout<<"c"<

C++运算符重载

一、运算符重载的规则 运算符重载规则如下: ①、C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符。 ②、重载之后运算符的优先级和结合性都不会改变。 ③、运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来说,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。 不能重载的运算符只有五个,它们是:成员运算符“.”、指针运算符“*”、作用域运算符“::”、“sizeof”、条件运算符“?:”。 运算符重载形式有两种,重载为类的成员函数和重载为类的友元函数。 运算符重载为类的成员函数的一般语法形式为: 函数类型 operator 运算符(形参表) { 函数体; } 运算符重载为类的友元函数的一般语法形式为: friend 函数类型 operator 运算符(形参表) { 函数体; } 其中,函数类型就是运算结果类型;operator是定义运算符重载函数的关键字;运算符是重载的运算符名称。 当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个;当重载为类的友元函数时,参数个数与原操作数个数相同。原因是重载为类的成员函数时,如果某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要再放在参数表中进行传递,少了的操作数就是该对象本身。而重载为友元函数时,友元函数对某个对象的数据进行操作,就必须通过该对象的名称来进行,因此使用到的参数都要进行传递,操作数的个数就不会有变化。 运算符重载的主要优点就是允许改变使用于系统内部的运算符的操作方式,以适应用户自定义类型的类似运算。 一般说来,单目运算符最好被重载为成员;对双目运算符最好被重载为友元函数,双目运算符重载为友元函数比重载为成员函数更方便此,但是,有的双目运算符还是重载为成员函数为好,例如,赋值运算符。 二、运算符重载为成员函数 对于双目运算符B,如果要重载B为类的成员函数,使之能够实现表达式oprd1 B oprd2,其中oprd1为类A的对象,则应当把B重载为A类的成员函数,该函数只有一个形参,形参的类型是oprd2所属的类型。经过重载后,表达式oprd1 B oprd2 就相当于函数调用 oprd1.operator B(oprd2).

C++运算符重载例程详解

运算符重载就是对一个已有的运算符赋予新的含义,使之实现新功能。下面将通过简单的几个例程阐叙其用法。 例10.1 通过函数来实现复数相加。 #include using namespace std; class Complex //定义Complex类 {public: Complex( ){real=0;imag=0;} //定义构造函数 Complex(double r,double i){real=r;imag=i;} //构造函数重载Complex complex_add(Complex &c2); //声明复数相加函数void display( ); //声明输出函数private: double real; //实部 double imag; //虚部 }; Complex Complex::complex_add(Complex &c2) {Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c;} void Complex::display( ) //定义输出函数{cout<<″(″<

int main( ) {Complex c1(3,4),c2(5,-10),c3; //定义3个复数对象c3=https://www.360docs.net/doc/189923394.html,plex_add(c2); //调用复数相加函数cout<<″c1=″; c1.display( ); //输出c1的值cout<<″c2=″; c2.display( ); //输出c2的值 cout<<″c1+c2=″; c3.display( ); //输出c3的值 return 0; } 例10.2 改写例10.1,重载运算符“+”,使之能用于两个复数相加。#include using namespace std; class Complex {public: Complex( ){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} Complex operator+(Complex &c2); //声明重载运算符的函数void display( ); private: double real; double imag; }; Complex Complex::operator+(Complex &c2) //定义重载运算符的函数

关系运算符重载实例2015

#include //using namespace std; class Date { private: int year; int month; int day; public: Date(){} Date(int y,int m,int d); void display(); friend bool operator >(Date &d1,Date &d2); friend bool operator <(Date &d1,Date &d2); friend bool operator ==(Date &d1,Date &d2); }; Date::Date(int y,int m,int d) { this->year=y; this->month=m; this->day=d; } void Date::display() { cout<year<<"-"<month<<"-"<day; } bool operator >(Date &d1,Date &d2) { if(d1.year>d2.year) return true; else if(d1.year==d2.year) { if(d1.month>d2.month) return true; else if(d1.month==d2.month) { if(d1.day>d2.day) return true; else return false; } else return false; } else

return false; } bool operator <(Date &d1,Date &d2) { if(d1.yeard2) cout<<"大于"; if(d1

第7章 运算符重载-习题

《面向对象程序设计》习题 班级:学号:姓名:名单序号:成绩: 第7章运算符重载和多态性 一、选择题(共30分,每题1分) 1.下列运算符中,()运算符在C++中不能重载。 A.?: B.[] C. new D.++ 2.友元重载运算符obj1>obj2被C++编译器解释为()。 A.operator >(obj1,obj2) B.>(obj1,obj2) C.obj2.operator >(obj1) D.obj1.operator >(obj2) 3.重载赋值操作符时,应声明为()函数。 A.友元B.虚C.成员D.多态 4.在重载一个运算符时,其参数表中没有任何参数,这表明该运算符是()。 A. 作为友元函数重载的1元运算符 B. 作为成员函数重载的1元运算符 C. 作为友元函数重载的2元运算符 D. 作为成员函数重载的2元运算符5.在重载一运算符时,若运算符函数的形参表中没有参数,则不可能的情况是()。 A. 该运算符是一个单目运算符。 B. 该运算符函数有一个隐含的参数this。 C. 该运算符函数是类的成员函数。 D. 该运算符函数是类的友元函数。 6. 关于运输符重载,下列表述中正确的是()。 A.C++已有的任何运算符都可以重载 B.运算符函数的返回类型不能声明为基本数据类型 C.在类型转换符函数的定义中不需要声明返回类型 D.可以通过运算符重载来创建C++中原来没有的运算符 7. C ++流中重载的运算符>>是一个()。 A. 用于输出操作的非成员函数 B. 用于输出操作的成员函数 C. 用于输入操作的非成员函数 D. 用于输入操作的成员函数 8. 若要对Data类中重载的加法运算符成员函数进行声明,下列选项中正确的是()。 A. Data +(Data); B. Data operator+(Data); C. Data +operator(Data); D. operator +(Data, Data); 9. 下列运算符中哪些是不能够被重载的()。 A. .,.*,sizeof,::,?: B. ++,--,new,= = C. new,delete,>=,[ ] D. +,-,=,delete 10. 在名为BigNumber类的类体中对运算符函数double进行如下声明: operator double(BigNumbe); 函数声明中有一个明显的错误,这个错误就是()。 A.参数表中不应该有任何参数 B.缺少对函数返回类型的说明 C.参数声明中缺少参数变量 D.函数声明中缺少函数体 11. 下列关于运算符重载的描述中,正确的是()。

VC6.0中重载操作符友元函数无法访问类的私有成员的解决办法

VC6.0中重载操作符友元函数无法访问类的私有成员的解决办法 VC6.0中重载操作符友元函数无法访问类的私有成员的解决办法: 在C++中,操作符(运算符)可以被重载以改写其实际操作。 同时我们可以定义一个函数为类的友元函数(friend function)以便使得这个函数能够访问类的私有成员,这个定义通常在头文件中完成。 在Visual C++中定义一般的函数为友元函数通常是没有问题的。然而对某些重载操作符的函数,即使我们将它们定义为类的友元函数,VC的编译器仍然会显示出错信息,认为这些友元函数无权访问类的私有成员。我认为这应该是VC6.0编译器与标准C++不兼容的地方。 以下代码就是个例子: // 头文件“Sample.h” #include using namespace std; class Sample{ public: Sample( ); friend ostream &operator<<(ostream &out, const Sample s); friend istream &operator>>(istream &in, Sample & s); private: int x; }; // 实现文件“Sample.cpp” #include “Sample.h” Sample::Sample( ) { x=0; } istream &operator>>(istream &in, Sample & s) { cout<<”Please enter a value”<> s.x ; return in; } ostream &operator<<(ostream &out, const Sample s) { cout << s.x << endl; return out; } 以上代码在gnuc++中编译运行毫无问题。但是在VC++6.0中编译的时候就会出现以下的编

c++运算符重载习题

Task8-1 /* 1. 定义一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算。将运算符函数重载为非成员、非友元的普通函数。编写程序,求两个复数之和*/ #include using namespace std; class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} void display(); double real; double imag; }; void Complex::display() { cout<<"("<

相关主题
相关文档
最新文档