c++重载(以运算符重载为主)
重载(OverLoading)是面向对象程序设计多态性的一种体现。所谓重载,是指“同一标识符”在同一作用域的不同场合具有不同的语义,这个标识符可以是函数名或运算符。也就是说,重载可以使多个函数使用同一个函数名,或者同一个运算符代表不同的运算规则。因此,重载包括函数重载和运算符重载,使c++使用重载是为了使程序更加简洁。
函数重载
①普通函数重载
②构造函数重载
③成员函数重载
具体略......
运算符重载
运算符重载规则:
①c++中的运算符除了少数几个以外,全部可以重载,具体规则......
②c++不允许用户自定义新的运算符,只能对c++已有的运算符进行重载。不能重载的有:. * :: sizeof ?: 这五个。
③重载不能改变运算符运算对象(即操作数)的个数。
④重载不能改变运算符的优先级和结合性。
⑤重载运算符必须和用户所定义的自定义对象一起使用,使其参数......
⑥重载运算符的参数不能有默认参数,否则就企图改变运算符参数的个数。
⑦对于类对象的运算符一般必须重载,但有两个例外,运算符 = 和 & 不必用户重载。
例如:......
⑧运算符重载是对......
省略处懒得写了。
运算符重载形式:
①重载为类的成员函数
语法格式: type operator 运算符(形式参数表)
参数表中的参数数目与要重载的运算符有关。如果重载弹幕运算符,则参数表是空的,此时当前对象作为运算符的单操作数;如果重载双目运算符,则参数表中有一个操作数,运算时左操作数是当前对象本身的数据,参数表中的操作数作为右操作数。
例:重载运算符'+',使之能用于两个复数相加:
1 #include<iostream> 2 using namespace std; 3 4 class Complex 5 { 6 public: 7 Complex(){real=0;imag=0;} 8 Complex(double r,double i){real=r;imag=i;} 9 Complex operator +(Complex& c2); 10 void display() 11 { 12 cout<<'('<<real<<','<<imag<<'i'<<')'<<endl; 13 } 14 private: 15 double real; 16 double imag; 17 }; 18 19 int main() 20 { 21 Complex c1(3,4),c2(5,-10),c3; 22 c3=c1+c2; 23 c1.display(); 24 c2.display(); 25 c3.display(); 26 27 return 0; 28 } 29 30 Complex Complex::operator +(Complex& c2) 31 { 32 Complex c; 33 c.real=real+c2.real; 34 c.imag=imag+c2.imag; 35 return c; 36 }
运行结果:
②重载为类的友元函数
语法格式: friend type operator 运算符(形式参数表)
其中,friend是声明友元的关键字,type为函数返回类型;operator是定义运算符重载函数的关键字;“运算符”是要重载的运算符符号;参数表给出该运算符所需要的参数。
例:重载运算符'+',使其实现复数相加,用友元函数实现。
1 #include<iostream> 2 using namespace std; 3 4 class Complex 5 { 6 public: 7 Complex(){real=0;imag=0;} 8 Complex(double r,double i){real=r;imag=i;} 9 friend Complex operator +(Complex& c1,Complex& c2); 10 void display() 11 { 12 cout<<'('<<real<<','<<imag<<'i'<<')'<<endl; 13 } 14 private: 15 double real; 16 double imag; 17 }; 18 19 int main() 20 { 21 Complex c1(3,4),c2(5,-10),c3; 22 c3=c1+c2; 23 c1.display(); 24 c2.display(); 25 c3.display(); 26 27 return 0; 28 } 29 30 Complex operator +(Complex& c1,Complex& c2) 31 { 32 Complex c; 33 c.real=c1.real+c2.real; 34 c.imag=c1.imag+c2.imag; 35 return c; 36 37 //or 38 //return Complex(c1.real+c2.real,c2.imag+c2.imag); 39 }
运行结果和上面重载为类的成员函数相同。
③其他用算符的重载
自加(++)自减(--)运算符重载:为了方便起见,重载为类的成员函数。
赋值(=)(+= 、-=、*=、/=)运算符重载:解决指针悬挂问题。
下标运算符[]:一般采用成员函数的形式重载,主要应用是读取数组的某个元素。
函数调用运算符()的重载:......。
PS:重载运算符[]和()时只能定义为成员函数,而不能用友元函数。
输入输出流运算符:(输出流运算符:<<和输入流运算符:>>)
输入输出流运算符是c++类库提供的......(自行了解)
对“>>”和“<<”重载的函数形式如下:
istream & operator >> (istream&,自定义类&);
ostream & operator << (ostream&,自定义类&);
重载">>"和"<<"的函数作为友元函数,而不能将它们定义为成员函数。
例子略......
v、