C 建構函式的理解

2021-10-14 07:35:49 字數 2101 閱讀 6003

類的建構函式是類的一種特殊的成員函式,它會在每次建立類的新物件時執行。

特殊在哪些地方呢?

1、建構函式的名稱與類的名稱是完全相同的。

2、並且不會返回任何型別,也不會返回 void。

乙個典型的建構函式如下:

#include using namespace std;

class line;

// 成員函式定義,包括建構函式

line::line(void)

void line::setlength( double len )

double line::getlength( void )

// 程式的主函式

int main( )

};

乙個類可以有多個一般建構函式,前提是引數的個數或者型別不同(基於c++的過載函式原理),建立物件時根據傳入的引數不同呼叫不同的建構函式

class complex 

complex(double real)

};

複製構造函式引數為類物件本身的引用,用於根據乙個已存在的物件複製出乙個新的該類的物件,一般在函式中會將已存在物件的資料成員的值複製乙份到新建立的物件中

若沒有顯示的寫複製建構函式,則系統會預設建立乙個複製建構函式,但當類中有指標成員時,由系統預設建立該複製建構函式會存在風險,具體原因請查詢有關 「淺拷貝」 、「深拷貝」的文章論述

class complex 

};

類的構造可以用過載賦值運算子來實現,即"="。

注意,這個類似複製建構函式,將=右邊的本類物件的值複製給等號左邊的物件,它不屬於建構函式,等號左右兩邊的物件必須已經被建立

若沒有顯示的寫=運算子過載,則系統也會建立乙個預設的=運算子過載,只做一些基本的拷貝工作

class complex 

// 複製等號右邊的成員到左邊的物件中

this->m_real = rhs.m_real;

this->m_imag = rhs.m_imag;

// 把等號左邊的物件再次傳出

// 目的是為了支援連等 eg: a=b=c 系統首先執行 b=c

// 然後執行 a= ( b=c的返回值,這裡應該是複製c值後的b物件)

return *this;

}};

首先,我們先需要分清初始化和賦值的概念,初始化就是在新建立物件的同時給予初值,而賦值是在兩個已經存在的物件之間進行操作。在構造方式上,這兩種是不同的。

建構函式支援初始化列表,它負責為新建立的物件的乙個或者幾個資料成員賦初值,初始化列表的語法是這樣的:

class test

private:

int x;

};

上面的語法等同於如下語法:

class test

private:

int x;

};

假設有乙個類 c,具有多個字段 x、y、z 等需要進行初始化,同理地,您可以使用上面的語法,只需要在不同的字段使用逗號進行分隔,如下所示:

c::c( double a, double b, double c): x(a), y(b), z(c)

初始化的列表的乙個優勢是時間效率和空間效率比賦值要高,同時在const型別成員的構造時,普通的賦值建構函式是非法的。當我們建立乙個const物件時,直到建構函式完成初始化過程,物件才能真正取得其常量屬性。

所以我們可以用這種方式為const成員變數寫值。

class test

void add(test ob)

string str;

};test ob1("downey");

int main()

這樣又是什麼結果呢?

error: no matching function for call to ***  //左值引用不匹配,所以這裡找不到匹配的方法。
ref:

c 之建構函式詳解C 建構函式的理解

相對於c語言來說,c 有乙個比較好的特性就是建構函式,即類通過乙個或者幾個特殊的成員函式來控制其物件的初始化過程。建構函式的任務,就是初始化物件的資料成員,無論何時只要類的物件被建立,就會執行建構函式。建構函式的名字必須和類名相同,與其他函式不一樣的是,建構函式沒有返回值,而且其必須是公有成員,因為...

C 建構函式理解

正確理解qt中建構函式 widget widget qwidget parent qwidget parent ui new ui widget include using namespace std class base base int val m num val 1 private int m...

對C 預設建構函式的理解

在文章開始之前,首先指出對於c 新手的兩個常見的誤解 一 任何class如果沒有定義default constructor,就會被合成出乙個來。二 編譯器合成出來的default constructor會明確設定 class內每乙個data member的預設值 首先我們來討論第乙個誤解。編譯器並不...