C++中将操作符进行重新定义,就是操作符重载。但不是所有的操作符都可以重载,这里列出C++中可以重载的操作符:
new? ? delete? ? new[]? ? delete[]
+ ? – ? * ? / ? % ? ?^? ? & ? | ? ~
! = ? < ? > ? += ? -=? ? *= ? /= ? %=
^= ? &= ? |= ? <<? ? >> ? >>=? ?<<=? ? ==? ? !=
<= ? >=? ? && ? ||? ? ++ ? –? ? ,? ? ->* ? ->
以上操作符有一元操作符,也有二元操作符,但注意不能混用。
比如说重载一元操作符就不能有两个参数。
1 |
void operator!(const A& a, const B& b); //错误参数太多 |
还有重载二元操作符不能给一个参数
1 |
A& operator+(const A& a); //错误参数太少 |
一元操作符重载,只接受一个参数;二元操作符重载,只接受二个参数。
operator操作符重载语法可以看这篇:operator操作符
C++中有两种方式的操作符重载:
1.类中操作符重载
类中写一元操作符取反例子,来说明类中操作符重载:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
//梁笔记 //zouzhongliang.com #include <iostream> using namespace std; class A { private: double x,y; public: A(){ x = 3; y = 4; } ~A(){ } void operator!(){ x = -x; y = -y; } void print(){ cout<<"x值:"<<x<<" "<<"y值:"<<y<<endl; } }; int main() { A a; cout<<"操作符运算前"<<endl; a.print(); !a; cout<<"操作符运算后"<<endl; a.print(); return 0; } |
输出结果:
1 2 3 4 |
操作符运算前 x值:3 y值:4 操作符运算后 x值:-3 y值:-4 |
以上代码有个问题是一元操作符重载为什么没有参数?
1 |
void operator!() |
因为操作符重载是定义在类的内部,操作符函数也是类成员函数,它有一个隐性的this 指针的,而这个隐性的 this 指针其实就是它的一个操作数,这样其实是传了一个参数。
如果对 this 指针不明白的可以看这篇: this 指针
所以在类中定义操作符重载函数时,一元操作符没有输入参数,二元操作符有一个输入参数。
2.全局操作符重载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
//梁笔记 //zouzhongliang.com #include <iostream> using namespace std; class A { private: double x,y; public: A(){ x = 3; y = 4; } ~A(){ } void operator!(){ x = -x; y = -y; } void print(){ cout<<"x值:"<<x<<" "<<"y值:"<<y<<endl; } friend A operator+(const A& a, const A& b); }; A operator+(const A& a, const A& b){ A temp; temp.x = a.x+b.x; temp.y = a.y+b.y; return temp; } int main() { A a; A b; A c = a+b; c.print(); return 0; } |
定义了+二元操作符全局重载,可以看出它的参数是二个,跟上面讲的一样。
A类中又将操作符函数声明成友元函数,这是因为操作符重载函数中有直接访问A类中的私有成员。友元部份不理解可看这篇:友元函数和友元类
You have made your point. fluconazole 100 mg