C++运算符重载
好吧 虽然很晚了 已经1:30分了 看我能熬到什么时候把 该死的心里作业.......
运算符重载呢 实质上就是函数重载 这里 我们不讲那么又臭又长的各种定义 直接上代码 PS:可能我讲的很无头绪 见谅.......
1 #include <iostream> 2 using namespace std; 3 4 class point 5 { 6 public: 7 point(int xx =0 , int yy = 0 ):x(xx),y(yy){}; 8 point operator+( const point& ptr)const 9 { 10 return point( x+ptr.x , y+ptr.y ); 11 } 12 void show() 13 { 14 printf( "x----%d y---%d ",x,y ); 15 } 16 private: 17 int x; 18 int y; 19 }; 20 21 int main() 22 { 23 point p(3,4); 24 point t(5,6); 25 point q; 26 q = p+3; 27 q.show(); 28 29 q = p+t; 30 q.show(); 31 getchar(); 32 }
我们先看第26行: q = p+3; 因为这里的运算符重载方式 我们选择的是 类的非静态成员函数 所以 如果你一不小心 写成了 q = 3+p;那么 恭喜 编译肯定是不会过的
这里 你可能会好奇 这里的point类的 加号 运算符 不应该是2个point类的对象之间的运算吗? 为什么3可以进行计算呢?
嗯 因为呢 很巧合的是 这里point类的构造函数的形参恰好是int型的 更巧的是 我们还给形参默认了初始值 那么C++的编译器就会在进行计算时候 为我们进行隐式转换
所以你可以看成这样一个式子 q = p+(3,0)
当然 可能这不是你想要的 你可能不想要这种隐式转换的情况发生 能解决吗? 当然可以! C++ 为我们提供了 explicit 关键字 它的作用呢 也很好理解 在构造函数前加上即可
这样以后 它会阻止隐式转换的进行 一定要显示进行 下面这段代码会有助于你的更好理解
1 #include <iostream> 2 using namespace std; 3 4 class a 5 { 6 public: 7 a(int xx):x(xx) 8 { 9 cout<<"a"<<endl; 10 } 11 private: 12 int x; 13 }; 14 15 class b 16 { 17 public: 18 explicit b(int yy):y(yy) 19 { 20 cout<<"b"<<endl; 21 } 22 private: 23 int y; 24 }; 25 26 int main() 27 { 28 a A(4); 29 a AA = 5; 30 b B(6); 31 //b BB = 7; 你可以将注释去掉 再运行一下 就能发现了 32 getchar(); 33 return 0; 34 }