歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++復制控制:賦值操作符和析構函數

 

一、賦值操作符

 

類定義了該類型對象賦值時會發生什麼。與拷貝構造函數一樣,如果類沒有定義自己的賦值操作符,編譯器會合成一個。

 

1、重載操作符的簡單介紹

 

重載操作符是一些函數,其名字為operator後跟著所定義的操作符的符號,通過定義名為operator=的函數,我們可以對賦值進行定義。操作符函數的形參表必須具有與該操作數數目相同的形參(如果操作符是一個成員,則包括隱式this形參)。賦值是二元操作符,對應的兩個形參,第一個形參為左操作數,第二個形參為右操作數。

 

注意:

 

(1)當操作符為成員函數時,它的第一個操作數隱式綁定到this指針。

 

(2)有些操作符,例如賦值操作符必須定義為成員函數,因此賦值操作符可接受單個形參。

 

(3)賦值操作符返回對右操作數的引用。

 

2、合成賦值操作符

 

合成賦值操作符會執行逐個成員賦值:右操作數對象的每個成員賦值為左操作數對象的對應成員。對於數組,給每個數組元素賦值。

 

Sales_item& Sales_item::Sales_item(const Sales_item &rhs)
{
    isbn = rhs.isbn;
    units_sold = rhs.units_sold;
    revenue = rhs.revenue;
    return *this;                //返回對左操作數的引用
}

 

3、拷貝和賦值常一起使用

 

可以使用拷貝構造函數的類通常也可使用合成賦值操作符。一般而言,如果類需要拷貝構造函數,它也會需要賦值操作符。應將兩者看作一個單元,如果需要其中一個,我們幾乎也肯定需要另一個。

 

二、析構函數

 

析構函數的作用是完成所需資源的回收,作為類構造函數的補充。

 

1、何時調用析構函數

 

撤銷類對象時自動調用析構函數:

 

(1)變量在超出作用域時自動撤銷。例如:變量item遇到右}時。

 

(2)動態分配的對象只有在指向該對象的指針被刪除時才撤銷。例如:指針p。

 

Sales_item *p = new Sales_item;
{
    Sales_item item(*p);
    delete p;
}

 

注意:當對象的引用或指針超出作用域時,不會運行析構函數。只有刪除指向動態分配對象的指針或實際對象(而不是對象的引用)超出作用域時,才會運行析構函數。

 

(3)撤銷一個容器(不管是標准庫還是內置數組)也會運行容器中元素的析構函數。

 

容器中的元素總是按逆序撤銷,首先撤銷下標為size()-1的元素,最後撤銷下標為0的元素。

 

{
    Sales_item *p = new Sales_item[10];
    vector<Sales_item> vec(p, p + 10);
    delete [] p;
}

 

2、何時編寫顯式析構函數

 

許多類不需要顯式析構函數,具有構造函數的類不一定需要定義自己的析構函數,僅在有些工作需要析構函數完成時,才需要析構函數。析構函數通常用於釋放在構造函數或在對象生命期內獲取的資源。

 

注意:

 

(1)如果類需要析構函數,則它也需要賦值操作符和拷貝構造函數,這是一個有用的經驗法則。

 

(2)析構函數並不僅限於用來釋放資源。一般而言,析構函數可以執行任意操作,該操作是類設計者希望在該類對象的使用完畢之後執行的。

 

3、合成析構函數

 

與拷貝構造函數和賦值操作符不同,編譯器總會為我們合成一個析構函數。合成析構函數按對象創建時的逆序撤銷每個非static成員,按成員在類中聲明的逆序撤銷成員。對於類類型的每個成員,合成析構函數調用該成員的析構函數撤銷對象。

 

注意:撤銷內置類型成員或復合類型成員沒什麼影響,合成析構函數並不刪除指針成員做指向的對象。

 

4、編寫析構函數

 

析構函數的名字前加~,沒有返回值,沒有形參(所以不能重載析構函數)。

 

注意:

 

(1)類可以定義多個構造函數,但只能提供一個析構函數,應用於類的所有對象。

 

(2)析構函數區別於拷貝構造函數和賦值操作符,即使定義了自己的析構函數,合成析構函數仍然運行。

 

class Sales_item
{
public:
    ~Sales_item(){}
private:
    string isbn;
    int units_sold;
    double revenue;
};

 

撤銷Sales_item對象時,首先運行這個什麼都不做的析構函數,然後再運行合成析構函數撤銷類的成員。

------------------------------分割線------------------------------

C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm

讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm

讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm

讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm

將C語言梳理一下,分布在以下10個章節中:

  1. Linux-C成長之路(一):Linux下C編程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成長之路(二):基本數據類型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成長之路(三):基本IO函數操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成長之路(四):運算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成長之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成長之路(六):函數要義 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成長之路(七):數組與指針 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成長之路(八):存儲類,動態內存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成長之路(九):復合數據類型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成長之路(十):其他高級議題

Copyright © Linux教程網 All Rights Reserved