c 中建構函式的相互呼叫

2021-08-21 20:46:15 字數 1324 閱讀 3588

在建構函式中呼叫另乙個建構函式如果一不注意就會有無限遞迴的危險,而且建構函式的引數的不同也決定了呼叫的不同,所以特意總結了一下哪些形式的呼叫時允許的:

首先假設構造函式呼叫時引數都是外部的變數,而不是乙個常量。

說明:推薦此法

int b = 2;

class test

//在初始化列表呼叫test(int a)

test(int a) : p(a) {}

~test() {}

intget()

private:

int p;

};

說明:g++中不能編譯,vs可以

int b = 2;

class test

test(int a) : p(a) {}

~test() {}

intget()

private:

int p;

};

int b = 2;

class test

test(int a) : p(a) {}

~test() {}

intget()

private:

int p;

};

使用new (void*p) type(…),這種語句的意思是不重新分配記憶體,而是直接覆蓋在原記憶體上。就本例而言,定義乙個test型別的變數覆蓋在this位址指向的記憶體上。

上述三種都在對this指向的物件進行操作,如果是想在建構函式中定義乙個同型別的變數,需要使用花括號而不是圓括號傳參:

int b = 2;

class test

; //使用花括號{}

}test(int a) : p(a) {}

~test() {}

intget()

private:

int p;

};

另一種方法是顯式指出型別:

int b = 2;

class test

test(int a) : p(a) {}

~test() {}

intget()

private:

int p;

};

這兩種都不會無限遞迴,但是只是建立了乙個區域性變數,建構函式結束的時候這個區域性變數會被銷毀。

另外需要注意的是,如果把變數b換成常量2,使用test(2)不用造成無限遞迴,會正確執行。

如果編譯器支援c++11,那麼比較推薦的方法是使用初始化列表來呼叫其它建構函式。

C和C 相互呼叫

c和c 相互呼叫 2011 11 01 18 42 29 分類 c c 在專案中融合c和c 有時是不可避免的,在呼叫對方的功能函式的時候,或許會出現這樣那樣的問題。近來在主程式是c語言,而呼叫c 功能函式的時候,c 的 h標頭檔案都能找到,功能函式也都定義了,最重要的是,單獨編譯c 的時候完全沒有問...

C 和C的相互呼叫

在c專案中融合c 和c的 是實際工程中不可避免的,就如一般底層的驅動是用c寫的,而應用層一般會用c c 的編譯器能相容c語言的編譯器,但他優先以c 的方式編譯 extern關鍵字強制讓c 編譯器對 進行c方式編譯注意 cplusplus 是c 編譯器都內建的乙個巨集,可以用來判斷是不是c 編譯器,那...

C 和C的相互呼叫

在實際的工程中,c 和c的相互呼叫時不可避免的。但是有時候用c語言的編譯器編譯成的軟體包,在c 的程式中呼叫會出現錯誤。先看一下乙個例子 add.c include add.h int add int a,int b add.h int add int a,int b 將這兩個檔案用c語言編譯器編譯...