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;}程序输出结果如下:

分析:派生类定义的赋值操作符函数显示调用基类定义的赋值操作符函数,,先对基类对象部分赋值,再对派生类对象赋值。

一个人去旅行,而且是去故乡的山水间徜徉。

C++ operator= 注意事项

相关文章:

你感兴趣的文章:

标签云: