C 複製控制 賦值操作符和析構函式

2022-04-12 05:42:25 字數 2361 閱讀 5921

一、賦值操作符

類定義了該型別物件賦值時會發生什麼。與拷貝建構函式一樣,如果類沒有定義自己的賦值操作符,編譯器會合成乙個。

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

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

注意:

(1)當操作符為成員函式時,它的第乙個運算元隱式繫結到this指標。

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

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

2、合成賦值操作符

合成賦值操作符會執行逐個成員賦值:右運算元物件的每個成員賦值為左運算元物件的對應成員。對於陣列,給每個陣列元素賦值。

sales_item& sales_item::sales_item(const sales_item &rhs)

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

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

二、析構函式

析構函式的作用是完成所需資源的**,作為類建構函式的補充。

1、何時呼叫析構函式

撤銷類物件時自動呼叫析構函式:

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

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

sales_item *p = new

sales_item;

注意:當物件的引用或指標超出作用域時,不會執行析構函式。只有刪除指向動態分配物件的指標或實際物件(而不是物件的引用)超出作用域時,才會執行析構函式。

(3)撤銷乙個容器(不管是標準庫還是內建陣列)也會執行容器中元素的析構函式。

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

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

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

注意:

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

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

3、合成析構函式

與拷貝建構函式和賦值操作符不同,編譯器總會為我們合成乙個析構函式。合成析構函式按物件建立時的逆序撤銷每個非static成員,按成員在類中宣告的逆序撤銷成員。對於類型別的每個成員,合成析構函式呼叫該成員的析構函式撤銷物件。

注意:撤銷內建型別成員或復合型別成員沒什麼影響,合成析構函式並不刪除指標成員做指向的物件。

4、編寫析構函式

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

注意:

(1)類可以定義多個建構函式,但只能提供乙個析構函式,應用於類的所有物件。

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

class

sales_item

private

:

string

isbn;

intunits_sold;

double

revenue;

};

撤銷sales_item物件時,首先執行這個什麼都不做的析構函式,然後再執行合成析構函式撤銷類的成員。

複製控制 複製建構函式 賦值操作符 析構函式

複製建構函式 copy constructor 具有單個形參,該形參是對該類型別的引用 常用const修飾 用於 a.根據另乙個同型別的物件顯式或隱式初始化乙個物件。b.複製乙個物件,將它作為實參傳給乙個函式。c.從函式返回時複製乙個物件。d.初始化順序容器中的元素。e.根據元素初始化式列表初始化陣...

建構函式 複製建構函式 析構函式 賦值操作符的總結

建構函式 複製構 造函式 析構函式 賦值操作符這幾個概念是c 中乙個類裡面的幾個基本函式,作為初學者的我對這幾個概念比較生疏,對其用法也有些疑問,下面對這幾個基本的函式進行總結。這裡主要說明他們的含義以及何時需要使用者自己定義 和預設的有啥區別 建構函式 建構函式是特殊的成員函式,只要建立類型別的新...

析構函式 賦值操作符與複製建構函式關係的分析

類設計三法則 如果類需要顯式定義析構函式,則它也需要賦值操作符和複製建構函式 關於這個法則需要注意兩點 1.如果類成員變數中有指向動態分配的記憶體,則一定需要顯式定義析構函式,從而需要定義賦值操作符和複製建構函式 2.如果乙個類需要提供顯式的複製和賦值操作定義,則將這個類的物件作為資料成員的類不需要...