-  1  —运算符重载的要求C ++预定义运算符只能用于基本数据类型的运算:整数,实数,字符,逻辑等,而不能用于对象运算。
但是我们有时需要在对象之间使用运算符,因此这时我们必须重载运算符,以便可以将运算符用于对象之间的运算。
例如,在数学中,可以在+,-等上直接操作两个复数。
但是,在C ++中,不允许在复数对象上直接使用+或-。
有时希望操作员也可以操作对象。
这样,代码更加简洁易懂。
例如:complex_a和complex_b是两个复数对象。
要找到两个复数的和,我们希望可以将其直接写为:complex_a + complex_b此时,我们需要重载+运算符。
— 2 —运算符重载的形式运算符重载的本质是函数重载,可以将其作为普通函数或成员函数进行重载。
运算符重载的基本形式如下:返回值类型运算符运算符(形式参数列表) ...}这是实现复数对象的+和运算符重载的示例:class Complex //复数类{public://构造函数,如果未传递任何参数,则将实部和虚部初始化为默认为0。
复杂(double r = 0.0,double i = 0.0):m_real(r),m_imag(i){} //重载数运算符号,属于成员函数Complexoperator-(const Complex& c){ //返回一个临时对象return Complex(m_real-c.m_real,m_imag-c.m_imag);} //打印复数void PrintComplex(){cout& lt;& lt; m_real& lt;& lt; “,” & lt;& lt; m_imag& lt;& lt; endl;}& nbsp; & nbsp; & nbsp; & nbsp; //将以+重载的普通函数定义为朋友函数& nbsp; & nbsp; //目的是使friend函数访问对象的私有成员。
& nbsp;朋友Complex运算符+(const Complex& amp; a,const complex& amp; b); & nbsp; & nbsp; private:double m_real; & nbsp; //实数部分double m_imag的值; & nbsp; //虚部的值}; //重载+运算符,属于普通函数,而不是对象的成员函数Complex运算符+(const Complex& amp; a,const Complex& b ){//返回一个临时对象return Complex(a.m_real + b.m_real,a.m_imag + b.m_imag);)int main()(Complex a(2,2); Complex b(1,1);复杂c; c = a + b; //等同于c =运算符+(a,b)c.PrintComplex(); c = ab; //等同于c = a.operator-(b)c.PrintComplex(); return 0;}输出结果:3,31,1从上面的示例中,我们可以知道作为成员函数的重载与普通函数之间的区别:当重载为成员函数时,参数数为运算符数减一。
例如:c = ab;等效于c = a。
当operator-(b)作为正态函数重载时,参数的数量即为运算符的数量,例如:c = a + b;& nbsp ;等效于c =运算符+(a,b)在上面的代码中,我定义了ov的普通函数erloaded +运算符作为Complex复数类中的朋友函数,其目的是为了使朋友函数能够访问对象的私有成员,否则它将编译并报告错误。
-  3& nbsp;-加法和减法运算符的返回值和参数列表还有一个值得思考的问题:为什么重载和+运算符的返回类型使用的是Complex对象而不是Complex&放吗?为什么运算符函数重载符号和+符号const复杂的参数列表? c经常引用类型而不是Complex c? //重载运算符,属于成员函数Complex Complex :: operator-(const Complex& c){//返回一个临时对象return Complex(m_real-c.m_real,m_imag-c.m_imag);}首先,让我先谈谈为什么参数表是const Complex& amp; amp;。
c经常引用类型。
首先,如果参数表是公共对象,形式为Complex c,则在输入参数时,将调用默认的赋值(复制)构造函数,从而产生临时对象,这会增加成本,因此请使用引用方法,并同时,为了防止所引用的对象被修改,将其定义为const Complex& amp; amp; amp; amp; amp; amp; amp; amp; amp; quot;。
c常量引用类型。
让我说说为什么返回值是一个普通的Complex对象,因为执行-和+运算符的函数后,需要将一个新对象返回到左值。