標籤:
下面先看一段代碼:
#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= 注意事項