複製構造函數與析構函數
知識
07-10
複製構造函數:
複製構造函數是一種特殊的構造函數,其形參為本類的對象引用,作用是用一個已存在的對象去初始化同類型的新對象
如果沒有為類聲明拷貝初始化構造函數,則編譯器自己生成一個隱含的複製構造函數,這個構造函數會用作為初始值的對象的每個數據成員的值,初始化將要建立的對象的對應數據成員,在很多情況下已經很完美了,所以不用自己聲明複製構造函數
析構函數:
相當於是「反·構造函數」,完成對象被刪除前的一些清理工作
除了不能有返回類型,不能return以外,還不能有參數傳遞
在對象的生存期結束的時刻系統自動調用它,然後再釋放此對象所屬的空間
如果程序中未聲明析構函數,編譯器將自動產生一個默認的析構函數,其函數體為空
樣例:(代碼中有注釋)
- #include<iostream>
- #include<algorithm>
- using namespace std;
- class Point
- {
- public:
- Point(int x, int y); //構造函數
- Point(const Point &b); //複製構造函數,使用const是為了避免在初始化新對象過程中把原有的對象給改了
- ~Point(); //析構函數
- void Show();
- private:
- int *x, *y;
- };
- Point::Point(int a, int b)
- {
- x = new int;
- y = new int;
- *x = a, *y = b;
- }
- Point::Point(const Point &b)
- {
- cout<<"調用複製構造函數,為指針x和y申請內存"<<endl;
- x = new int;
- y = new int;
- *x = *b.x, *y = *b.y;
- }
- Point::~Point(void)
- {
- cout<<"調用析構函數,釋放內存"<<endl;
- delete x;
- delete y;
- }
- void Point::Show()
- {
- cout<<"("<<*x<<", "<<*y<<")"<<endl;
- }
- void Display(Point a) //形實結合時,即用實參去初始化實參時,也會發生一次複製構造
- {
- a.Show();
- // 注意如果函數的返回值是類的對象,函數執行完成返回主調函數時,將使用return語句中的對象初始化一個臨時無名對象,傳遞給主調函數,此時也會發生複製構造
- }
- int main(void)
- {
- Point p(3, 5);
- Point q(p);
- Display(p), Display(q);
- return 0;
- }
- /*
- 調用複製構造函數,為指針x和y申請內存
- 調用複製構造函數,為指針x和y申請內存
- (3, 5)
- 調用析構函數,釋放內存
- 調用複製構造函數,為指針x和y申請內存
- (3, 5)
- 調用析構函數,釋放內存
- 調用析構函數,釋放內存
- 調用析構函數,釋放內存
- */
※ubuntu怎麼使用命令搜索軟體源中的軟體
※程序員如何快速搭建個性化主頁
TAG:程序員小新人學習 |