一、賦值操作符
類定義了該類型對象賦值時會發生什麼。與拷貝構造函數一樣,如果類沒有定義自己的賦值操作符,編譯器會合成一個。
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個章節中: