C++对运算符进行重载学习笔记
1. 一个类的成员函数是暗含着 this 指针的,eg;
1 #include<iostream> 2 using namespace std; 3 4 class A{ 5 public: 6 A(){ x = 0;} 7 double get_add(A &c); 8 private: 9 double x; 10 }; 11 12 double A::get_add(A &c){ 13 A d; 14 return d.x = x+c.x; //注意这里的 x+c.x;这个单独的 x 相当于 this->x 或者 (*this).x; 15 }
2. 将运算符重载函数作为类的友元函数和作为类的成员函数的区别:
如果将运算符重载函数作为类的成员函数,它可以通过 this 指针自由地访问本类的数据成员,因此可以少写一个函数的参数。但是,必须要求运算表达式(如c1+c2)左侧第一个参数是一个类的对 象,而且欲运算符函数的类型相同。
在进行运算符重载的时候,考虑到各方面的因素和程序员的习惯,以下仅供参考:
(1) C++规定,赋值运算符=、下标运算符[ ] 、函数调用运算符() 、成员运算符 ->必须作为成员函数。
(2)流插入<< 和 流提取运算符 >> 、类型转寒运算符不能定义为类的成员函数,只能作为友元函数。
(3)一般将单目运算符和复合运算符(+= , -= , /= ,*= , &=, !=,`= ,%= ,>>= ,<<=)重载为成员函数。
(4)一般将双目运算符重载为友元函数。
运算符重载的声明方式:
1.重载单目运算符:
1.1 成员函数:
类中声明: Complex Complex::operator+(Complex &c2); //一个参数,另一个是暗含的this指针。
类外定义: Complex Complex::operator+(Complex &c2){};
1.2 友元函数:
类中声明:friend Complex operator+(Complex &C1,Complex &c2); //注意有两个参数了
类外定义:Complex operator+(Complex &C1,Complex &c2){};
2.重载双目运算符 “==” “>” “<”
类中声明:friend bool operator==(Complex &c1,Complex &c2);
类外定义:bool operator==(Complex &c1,Complex &c2){};
大于和小于的情况只需要把“==”替换一下就行。
3. 重载单目运算符 "++" "--":
由于单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数,则还可以省略此参数。
C++约定:在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数。
贴个代码吧,练练手。
1 #include<iostream> 2 using namespace std; 3 4 class Time{ 5 public: 6 Time(){minute = 0;sec = 0;} 7 Time(int m,int s):minute(m),sec(s){} 8 Time operator++(); 9 Time operator++(int); 10 void display(){cout<<minute<<":"<<sec<<endl;} 11 private: 12 int minute; 13 int sec; 14 }; 15 16 Time Time::operator++() //定义前置自增运算符"++"重载函数 17 { 18 if(++sec>=60) 19 { 20 sec -= 60; 21 ++minute; 22 } 23 return *this; //返回自增加后的当前对象; 24 } 25 26 Time Time::operator++(int) //定义后置自增运算符"++"重载函数 27 { 28 Time temp(*this); //创建临时对象temp; 29 sec++; 30 if(sec>=60) 31 { 32 sec -= 60; 33 ++minute; 34 } 35 return temp; //返回的是自增前的对象; 36 } 37 38 int main() 39 { 40 Time time1(34,59),time2; 41 cout<<"time:"; 42 time1.display(); 43 ++time1; 44 cout<<"++time1:"; 45 time1.display(); 46 time2 = time1++; 47 cout<<"time++"; 48 time1.display(); 49 cout<<"time2:"; 50 time2.display(); 51 return 0; 52 } 53 /* 54 运行结果: 55 time:34:59 56 ++time1:35:0 57 time++35:1 58 time2:35:0 59 */
程序分析:重载后置资政运算符时,多了一个int型的参数,增加这个参数只是为了与前置自增运算符重载函数有所区别,此外没有任何作用,在定义函数时也不必使用此参数,因此可省写参数名,只须在括号中写int即可。
4. 重载流插入运算符和流提取运算符:
形式:
istream & operator>>(istream &,自定义类 &);
ostream & operator<<(ostream &,自定义类 &);