前言
c++類中有幾個特殊的非靜態成員函式,當使用者未定義這些函式時,編譯器將給出缺省實現。c++11前程式設計客棧有四個特殊函式,c++11引入移動語義特性,增加了兩個引數為右值的特殊函式。這六個函式分別是:
1、預設建構函式
預設建構函式程式設計客棧指不需要引數就能初始化的建構函式。包含無參和所有引數有預設值兩種型別的建構函式。
2、複製建構函式
複製建構函式指使用該類的物件作為引數的建構函式。可以有其他引數,但必須提供預設值。
3、複製賦值運算子
過載等號=,將該類的物件賦值給已定義物件。
4、析構函式
沒啥可說的。
5、移動建構函式
c++11新增,該類的右值物件為引數的建構函式,其餘同複製建構函式。
6、移動複製運算子
同複製賦值運算子,唯一不同是引數為右值。
看定義容易迷糊,上**就會很清晰:
#include
#include
class foo
// 複製建構函式
foo(const foo& foo)
// 複製賦值運算子
foo& operator=(const foo& foo)
// 移動建構函式
foo(foo&& foo)
// 移動賦值運算子
foo& operator=(foo&& foo)
};int main()
用g++或者clang編譯,加上-fno-elide-constructors -std=c++0x選項。執行程式輸出如下:
default constructor
copy constructor
copy assignment operator
move constructor
move assignment operator
結果是我們預期的。需要注意的是foo foo3 = foo1的形式會呼叫複製建構函式,不會呼叫複製賦值運算子。原因是foo foo3 = ***宣告和定義乙個新物件,而賦值是作用在已定義物件。移動賦值運算子同理。
c++11新增了=default和=delete函式修飾符,提示編譯器使用預設或者刪除預設的特殊函式。需要注意的是這兩個修飾符只能修飾上述特殊函式,使用者可以用其對特殊函式進行裁剪。乙個例子:
struct test ;
參考
總結本文標題: c++類中的特殊成員函式示例詳解
本文位址:
C 類的特殊成員函式
類的特殊成員函式 特殊成員函式的難點在於它們何時被呼叫,以及可能產生的一些問題。建構函式 每個類都有自己的建構函式,即使乙個建構函式都沒定義,編譯器也會自動生成預設建構函式。建構函式下面有細分的種類 建構函式 每個物件建立時,都會呼叫建構函式。如果物件是封閉類,那麼生成乙個物件時,先呼叫成員物件類的...
c 中的特殊成員函式
如果沒有提供任何建構函式,c 將建立預設建構函式。例如假設定義了乙個k類,但沒有提供任何建構函式,編譯器則提供下面的預設建構函式 k k 也就是說,編譯器將提供乙個沒有引數的建構函式,不接受任何引數,也不執行任何操作的建構函式。這是因為建立物件的時候總會呼叫建構函式。k k 建立乙個物件使用預設構造...
C 特殊成員詳解
目錄 1.const資料成員 const型別變數不可修改 唯讀模式 必須採用初始化引數列表的方式初始化。2.const成員函式 const寫在小括號的後面,常成員函式不能修改資料成員 唯讀 常成員函式與普通函式同時存在時,函式名相同時,普通物件有限呼叫普通函式,普通物件可以呼叫常成員函式。3.con...