C++程序设计教程 第9讲:运算符重载
C++程序设计教程 第9讲: 运算符重载/5
§8.2运算符重载 如何理解运算符的重载? 1。运算符本身是一种函数 加法是一种运算 如 a+ b 赋值也是一种运算 函数形式 int add(int aint b)[ return (a+b);) 调用方式:c=add(a,b); 再如 int a, b, zi 如果add(inta,intb) a t b t ci 没有返回值,则不能实现连 如用函数表示应该是: add(add(a,b)c)i
§8.2 运算符重载 如何理解运算符的重载? 1。运算符本身是一种函数。 如: c = a + b; 函数形式: int add(int a,int b) { return (a+b); } 调用方式: c = add(a,b); 加法是一种运算 赋值也是一种运算 再如: int a, b, c, z; z = a + b + c; 如用函数表示应该是: z = add(add(a,b),c); 如果 add(int a,int b) 没有返回值,则不能实现连 加!!
§8.2运算符重载 从函数角度来看,“重载”是函数名称相同而入口参数数 据类型不同的。 因此,cout<<a<<b;中的<运算符 和int=a<<2;中的<的运算符 同样的运算符但调用对象不同,就可称为重载。 对加法而言 int ia =1 ib =2: o int ic ia t ib; o float fa =1. 5f f =2. 5f: 。f1 oat fo=fa+fb; 这两者中的+如果看作函数的话,就是被重载了
§8.2 运算符重载 2。从函数角度来看,“重载”是函数名称相同而入口参数数 据类型不同的。 因此,cout << a << b; 中的 << 运算符 和 int c = a << 2; 中的 << 的运算符 同样的运算符但调用对象不同,就可称为重载。 对加法而言: int ia = 1, ib = 2; int ic = ia + ib; float fa = 1.5f, fb = 2.5f; float fc = fa + fb; 这两者中的 + 如果看作函数的话,就是被重载了
8.2.1运算符重载的规则 C++允许重载现有的大多数运算符,而且只重 载已经有的运算符; 运算符的重载是通过编写函数来实现的,重载 之后的运算符的优先级和结合性都不会改变; 运算符重载是针对新的数据类型(类),对运 算符进行定义。除了=和&,对象的运算符 必须重载,=和&也可重载; [注意] 合理使用运算符的重载,使调用者容易理解 赋值运算符(=)只是逐个拷贝类的数据成员, 这在很多情况下很危险
8.2.1 运算符重载的规则 1. C++允许重载现有的大多数运算符,而且只重 载已经有的运算符; 2. 运算符的重载是通过编写函数来实现的,重载 之后的运算符的优先级和结合性都不会改变; 3. 运算符重载是针对新的数据类型(类),对运 算符进行定义。除了 = 和 &,对象的运算符 必须重载,= 和 & 也可重载; [注意] 1. 合理使用运算符的重载,使调用者容易理解; 2. 赋值运算符( = ) 只是逐个拷贝类的数据成员, 这在很多情况下很危险
运算符重载例8-1 class comp1ex//复数类声明 I public //构造函数 complex(double r=0.0, double i=0.0) real=r; imag=ii y void display()//显示复数的值 I cout < ("< real <<m<< imag <<)"<<endl private: double reali double imag
运算符重载 例8-1 class complex //复数类声明 { public: //构造函数 complex(double r=0.0,double i=0.0) { real=r; imag=i; } void display() //显示复数的值 { cout << “(” << real << “,” << imag << “)” << endl; } private: double real; double imag; };
例8-1:加运算符+ class comp1ex//复数类声明 public: /构造函数 complex(double r=0.o, double i=0.0) real=ri imag=ii 1 complex operator t (complex c2)i //+重载为成员函数 void display o)i private: double real; double imagi
例8-1:加运算符 + class complex //复数类声明 { public: //构造函数 complex(double r=0.0,double i=0.0) { real=r; imag=i; } complex operator + (complex c2); //+重载为成员函数 void display(); private: double real; double imag; };
例8-1:运算符+ complexcomplex:: operator (+(complex c2) /重载运算符+的实现 I complex ci 对运算符+进行重载 c. real c2 real real c imag c2 imag t imag; return complex(c real,c imag)i int main o //主函数 调用重载函数+ complex cl(5, 4) c3=c1+c2; //使用重载运算符完成复数加法 cout<<"c3=c1+c2="; c3display o
例8-1:运算符 + complex complex::operator + (complex c2) //重载运算符 + 的实现 { complex c; c.real = c2.real + real; c.imag = c2.imag + imag; return complex(c.real,c.imag); } 对运算符+进行重载 int main() //主函数 { complex c1(5,4),c2(2,10),c3; c3 = c1 + c2; //使用重载运算符完成复数加法 cout << "c3=c1+c2="; c3.display(); } 调用重载函数 +
3运算符重载的限制 1)不能改变运算符的优先级; 2)不能改变运算符的结合性; 3)不能改变运算符操作数的个数; 4)不能建立新的运算符; 5)运算符函数的参数至少有一个必须是类的对 象或是对类的对象的引用; 6)在重载运算符()、[]、→>或者=时,运算符重 载函数必须是类的成员;其它可以是友元; 7)不能改变内部类型的运算。 8)运算符+被重载,并不等于+=也自动被重载
§ 运算符重载的限制 1) 不能改变运算符的优先级; 2) 不能改变运算符的结合性; 3) 不能改变运算符操作数的个数; 4) 不能建立新的运算符; 5) 运算符函数的参数至少有一个必须是类的对 象或是对类的对象的引用; 6) 在重载运算符()、[]、->或者=时,运算符重 载函数必须是类的成员;其它可以是友元; 7) 不能改变内部类型的运算。 8) 运算符+被重载,并不等于+=也自动被重载
可以被重载的运算符(双目 算术运算 +(加),-(减),*(乘),/(除),%(取余) 位运算 >(右移),丨(或),&(与),(异或) 赋值运算 (赋值)+=、 /= 关系和逻辑运算 ==(相等),!=(不相等),>(大于),=(大于等于) (小于等于) (逻辑或),&&(逻辑与) 分量运算->(数据成员),->*(指针型函数成员 其他运算,(关联语句)>(输入流)
可以被重载的运算符(双目) 算术运算 +(加),-(减),*(乘),/(除),%(取余) 位运算 >(右移),|(或),&(与),^(异或) 赋值运算 =(赋值)+=、-=、 /=、*=、|=、&=、 ^= 关系和逻辑运算 ==(相等),!=(不相等),>(大于),= (大于等于),(数据成员),->*(指针型函数成员) 其他运算 ,(关联语句) >(输入流)
可以被重载的运算符(单目) 自增减及符号运算 ++(自加),-(自减),+(正号),-(负 号) 逻辑运算 !(逻辑非)、~(补) 赋值运算 &(取地址)、☆(按指针取值) 其他运算 ()(类型转换)、[](数组下标)、new(创 建)、 delete(删除)
可以被重载的运算符(单目) 自增减及符号运算 ++(自加),--(自减),+(正号),-(负 号) 逻辑运算 !(逻辑非)、~(补) 赋值运算 &(取地址)、*(按指针取值) 其他运算 () (类型转换)、[](数组下标)、new (创 建)、delete (删除)