c premier 複製控制與過載操作符

2021-06-08 16:24:01 字數 2499 閱讀 4430

複製建構函式是一種特殊的建構函式,它接受該類型別的引用作為其形參。當定義乙個新物件並用乙個同型別的物件對它進行初始化時,將顯式使用複製建構函式,當將該型別的物件傳遞給函式或從函式返回該型別的物件時,將隱式使用複製建構函式。

析構函式是建構函式的互補,當物件超出作用域或動態分配的物件被刪除時,將自動應用析構函式。

賦值操作符是在左物件已存在的情況下,使用右運算元對左物件進行賦值。

複製建構函式、析構函式和賦值操作符總稱為複製控制。

複製建構函式和賦值操作符不一樣,複製建構函式是在物件不存在的時候,利用形參建立乙個物件;賦值操作符使用的場景是存在乙個左物件,對左物件的成員用右運算元進行重新賦值。

#include #include "query.h"

using namespace std;

int main()

另外,賦值建構函式常常需要先確定左右運算元不是同乙個物件(&rhs != this )

如果類不允許複製,可以將複製建構函式宣告為private的,然而,這樣做的時候類的友元和成員仍可以進行複製,如果想要連友元和成員中的複製也禁止,可以宣告乙個private複製建構函式但不對其定義。不允許複製的類物件只能作為引用傳遞給函式或者從函式返回,它們也不可以用作容器的元素。

過載操作符其實也是一種函式,它可以是類的成員函式,也可以是非成員函式。當作為成員函式時,第乙個運算元是this。作為非成員函式時,由於某些操作符會用到類的私有成員(如operator<<),因此可以將其宣告為友元。過載操作符必須具有乙個類型別運算元。

選擇做為成員函式還是非成員函式,有一些指導原則:

1. 賦值(=)、下標()、呼叫(())和成員訪問(->)必須定義為成員,將這些操作符定義為非成員函式將在編譯時標記為錯誤。

2. 像賦值一樣,復合賦值操作符通常應定義為類的成員。

3. 改變物件或與給定型別緊密聯絡的其他一些操作符,如自增、自減和引引用,通常應定義為成員。

4. 對類的操作符,如算術操作符、相等操作符、關係操作符和位操作符,最好定義為非成員函式。(io操作符必須為非成員函式)

定義下標操作符比較複雜的地方在於,它在用作賦值的左右運算元時都應該能表現正常。下標操作符出現在左邊,必須生成左值,可以指定引用作為返回型別而得到左值。只要下標操作符返回引用,就可用作賦值的任意一方。

可以對const和非const物件使用下標。應用於const物件時,返回值應為const,因此不能用作賦值的目標。

定義下標操作符時,一般要定義兩個版本,乙個為非const成員並返回引用,乙個為const成員並返回const引用。

class foo;

int& foo::operator( const size_t index )

const int& foo::operator( const size_t index ) const

解引用操作符跟下標操作符一樣,必須定義兩個版本,乙個為const的,乙個為非const的。

箭頭操作符比較特殊,它表現起來是乙個二元操作符,->後面指向乙個成員識別符號,我們不大可能將成員識別符號作為函式的形參進行呼叫,因此,在解析箭頭操作符時,一般分三步。舉個例子,point->action()(實際上等價於(point->action)())

(1)如果point是乙個指標,指向具有名為action的成員物件的類物件,則編譯器將**編譯為呼叫該物件的action成員。

(2)否則,如果action是定義了operator->操作符的類的乙個物件的成員,則point->action與point.operator->()->action相同,即執行point的operator->(),然後使用該結果重複這三步。

(3)否則,**出錯。

自增與自減引用主要必須考慮字首形式和字尾形式。

這兩章中對我來說最重要,也是最陌生的概念,即為函式物件(functional object)。函式物件,就是在某種方式上表現得像函式的物件,典型地,它是指乙個類的例項,這個類定義了呼叫操作符operator()。與函式物件相關的概念是函式介面卡,就是之前在stl一章留下的空白。不過我感覺我還沒有完全學透函式物件的用法,它在標準庫中的使用我也沒有完全弄明白,有些函式介面也根本看不出來是要用乙個函式還是乙個函式物件,又好像看到網上有人說到可以通過模板使得它即能接受函式指標,又能接受函式物件,也許看完第16章的模板,我會有乙個更好的理解吧,到時候再專門講一講函式物件。

轉換操作符是一種特殊的類成員函式,它定義將類型別值轉變了其他型別值的轉換。如下:

class smallint

//轉換操作符,從smallint到int型別的轉換

operator int() const

private:

std::size_t val;

};

基本上就是這樣了,這兩章講述了複製控制的三個函式,還有一些過載操作符應該注意的事情,包括應該定義為成員還是非成員函式、幾種操作符的過載,下標操作符、解引用操作符、箭頭操作符、自增自減、呼叫操作符(與函式物件相關)、轉換操作符,最後還提到了轉換與過載的關係,以及可能出現的二義性。

複製控制 複製建構函式

只有單個形參,而且該引數是對本類型別物件的引用。主要用於 1 根據另乙個同型別的物件顯示或隱式的初始化乙個物件 string a abc 呼叫複製建構函式將a初始化為abc string aa string 呼叫string 的建構函式,建立乙個新的物件,再呼叫 複製建構函式初始化aa string...

複製控制 複製建構函式

只有單個形參,而且該引數是對本類型別物件的引用。主要用於 1 根據另乙個同型別的物件顯示或隱式的初始化乙個物件 string a abc 呼叫複製建構函式將a初始化為abc string aa string 呼叫string 的建構函式,建立乙個新的物件,再呼叫 複製建構函式初始化aa string...

C Primer 複製控制

複製建構函式 當定義乙個新物件並用乙個同型別的物件對它進行初始化時,將顯式使用複製建構函式 a a a 當將該型別的物件傳遞給函式或從函式返回該型別的物件時,將隱式使用複製建構函式 顯式使用和隱式使用的區別?析構函式 當物件超出作用域或動態分配的物件被刪除時,將自動應用析構函式。複製建構函式,賦值操...