C++ operator= 注意事項

來源:互聯網
上載者:User

標籤:

下面先看一段代碼:

#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= 注意事項

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.