C++ operator= 注意事项
下面先看一段代码:
#include <iostream> using namespace std; class Point{ public: Point(float x=0.0,float y=0.0):_x(x),_y(y){} Point& operator=(const Point& rhs); void printData(){ cout<<"_x="<<_x<<endl; cout<<"_y="<<_y<<endl; } protected: float _x,_y; }; inline Point& Point::operator=(const Point& p){ cout<<"Point::operator="<<endl; _x=p._x; _y=p._y; return *this; } class Point3d:public virtual Point{ public: Point3d(float x=0.0,float y=0.0,float z=0.0):Point(x,y),_z(z){} Point3d& operator=(const Point3d& p){ if(this==&p) return *this; cout<<"Point3d::operator="<<endl; _z=p._z; return *this; } void printData(){ Point::printData(); cout<<"_z="<<_z<<endl; } protected: float _z; }; int main(){ Point3d a(1,2,3),b(4,5,6); a=b; a.printData(); return 0; }
程序输出结果如下:
分析:派生类定义了赋值操作符,但是并不会隐式的调用基类的赋值操作符,这和构造函数和拷贝构造函数不同。
在看看下面这段代码:
#include <iostream> using namespace std; class Point{ public: Point(float x=0.0,float y=0.0):_x(x),_y(y){} Point& operator=(const Point& rhs); void printData(){ cout<<"_x="<<_x<<endl; cout<<"_y="<<_y<<endl; } protected: float _x,_y; }; inline Point& Point::operator=(const Point& p){ cout<<"Point::operator="<<endl; _x=p._x; _y=p._y; return *this; } class Point3d:public virtual Point{ public: Point3d(float x=0.0,float y=0.0,float z=0.0):Point(x,y),_z(z){} void printData(){ Point::printData(); cout<<"_z="<<_z<<endl; } protected: float _z; }; int main(){ Point3d a(1,2,3),b(4,5,6); a=b; a.printData(); return 0; }
程序输出结果如下:
分析:派生类没有定义自己的赋值操作符,编译器为派生类合成一个赋值操作符函数(合成的赋值操作符函数,会插入调用基类赋值操作符函数的代码),合成的赋值操作符函数会隐式的调用基类的赋值操作符函数。
再看最后一段代码:
#include <iostream> using namespace std; class Point{ public: Point(float x=0.0,float y=0.0):_x(x),_y(y){} Point& operator=(const Point& rhs); void printData(){ cout<<"_x="<<_x<<endl; cout<<"_y="<<_y<<endl; } protected: float _x,_y; }; inline Point& Point::operator=(const Point& p){ cout<<"Point::operator="<<endl; _x=p._x; _y=p._y; return *this; } class Point3d:public virtual Point{ public: Point3d(float x=0.0,float y=0.0,float z=0.0):Point(x,y),_z(z){} Point3d& operator=(const Point3d& p){ if(this==&p) return *this; Point::operator=(p); cout<<"Point3d::operator="<<endl; _z=p._z; return *this; } void printData(){ Point::printData(); cout<<"_z="<<_z<<endl; } protected: float _z; }; int main(){ Point3d a(1,2,3),b(4,5,6); a=b; a.printData(); return 0; }
程序输出结果如下:
分析:派生类定义的赋值操作符函数显示调用基类定义的赋值操作符函数,先对基类对象部分赋值,再对派生类对象赋值。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。