建構函式是特殊的成員函式,只要建立類型別的新物件,都要執行建構函式,定義物件指標不會呼叫建構函式。
建立類型別的新物件時,編譯器為物件分配記憶體空間,完成後自動呼叫建構函式初始化物件的資料成員。
建構函式的主要工作是初始化物件的資料成員。
(1)、建構函式與類同名
(2)、建構函式沒有返回型別
(3)、建構函式可以過載,乙個類宣告的建構函式的數量沒有限制
(4)、建構函式由系統自動呼叫,不允許顯示呼叫
(5)、建構函式必須宣告為類的公有成員(否則會編譯出錯,vs提示建構函式不可訪問,g++提示建構函式是私有的)
(6)、建構函式像其他任何函式一樣,可以沒有形參,也可以定義多個形參
(7)、建構函式不能宣告為常成員函式(fun(...)const{}),可以宣告為inline(內聯)函式
只有當乙個類沒有定義建構函式時,編譯器才會自動生成乙個預設建構函式。
這條規則的根據是,如果乙個類在某種情況下需要控制物件初始化,則該類很可能在所有情況下都需要控制。
如果顯式定義了無引數的建構函式,又定義了所有引數都有預設值的建構函式,那麼定義物件時會產生二義性, 導致編譯錯誤。
#include usingnamespace
std;
class
example
// example(
int nu = 0)
private
:
intnum;
};int main(void
)
建構函式可以過載,所以建構函式的行參多種多樣。注意下例中注釋掉的2個函式 和 第二個函式不能形成過載關係。
classexample
example(
int im, int
in)//
example(int im, int in = 0)
//example(int im = 0, int in = 0)
private
:
intm;
intn;
};
預設引數的規則見:
在c++中,下面三種物件需要呼叫拷貝建構函式(有時也稱「複製建構函式」):
1) 乙個物件作為函式引數,以值傳遞的方式傳入函式體;
2) 乙個物件作為函式返回值,以值傳遞的方式從函式返回;
3) 乙個物件用於給另外乙個物件進行初始化;
classx;//
1x obj1,
x obj2(obj1);
//乙個物件用於另乙個物件的初始化
x obj3(obj2); //
乙個物件用於另乙個物件的初始化//2
x func1(...){} //
函式返回物件,linux下可能不掉用拷貝建構函式//3
... func2(x obj...) //
函式有物件引數//4
x func3(x obj) //
呼叫2次拷貝建構函式
①對於凡是包含動態分配成員或包含指標成員的類都應該提供拷貝建構函式;
②在提供拷貝建構函式的同時,還應該考慮過載"="賦值操作符號。
拷貝建構函式必須以引用的形式傳遞(引數為引用值)。其原因如下:
當乙個物件以傳遞值的方式傳乙個函式的時候,拷貝建構函式自動的被呼叫來生成函式中的物件。
如果乙個物件是被傳入自己的拷貝建構函式,它的拷貝建構函式將會被呼叫來拷貝這個物件這樣複製才可以傳入它自己的拷貝建構函式,
這會導致無限迴圈直至棧溢位(stack overflow)。
詳細參照 :
注意:在linux下,函式返回類的物件時,不呼叫拷貝建構函式
#include usingnamespace
std;
class
example
example(
const example& ref)
example& operator=(const example& ref)
void setdata(int n)
void display(void)
private
:
intm;
};example func1(
void
)void
func2(example ex){}
example func3(example ex)
int main(void
)
指定類的資料成員的初始值。在建構函式體現執行前,用初始化列表中指定的值初始化成員。
沒有在初始化列表中初始化的類成員,使用它們的預設建構函式隱式初始化。靜態成員變數不能使用初始化列表初始化,也不能在建構函式中賦值.
必須用到初始化成員列表的四種情況:
1) 初始化乙個引用成員
2) 初始化乙個const成員
3) 基類沒有預設建構函式和無參建構函式
4) 類中有乙個類物件資料成員,並且物件的類沒有預設建構函式和無參建構函式.
#include usingnamespace
std;
class
base
private
:
intnum;
static
int stn;//
cannot initialize static class data via constructor
};int base::stn = 0
;class derived:public base//
④基類(沒有預設建構函式和無參建構函式)
private
:
const
int ival; //
①const資料成員
base bs; //
②類成員物件(沒有預設建構函式和無參建構函式)
base& bsref; //
③引用(物件的引用)
int& iref; //
③引用(普通資料型別引用)
};int
main()
C 建構函式 拷貝建構函式
建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...
C 構造器(建構函式)
定義和作用 構造器是在構建類的 引用時 自動執行的方法。所以,每個類都必須至少要有乙個構造器。在訪問乙個類的時候,編譯器最先執行構造器中的 它與類同名,帶引數的構造器能夠獲取引數,但是與方法不同的是 構造器雖然也是一種 例項型別 即必須通過例項來進行呼叫,也可以稱之為引用型別 但是卻不能返回任何值 ...
C 建構函式
建構函式是一種特殊的成員函式,它主要用於為物件分配儲存空間,對資料成員進行初始化.1 建構函式的名字必須與類同名 2 建構函式沒有返回型別,它可以帶引數,也可以不帶引數 3 建構函式的主要作用是完成對類的初始化工作 4 在建立乙個類的新物件 使用new關鍵字 時,系統回自動呼叫給類的建構函式初始化新...