C 之建構函式

2021-08-27 07:01:01 字數 2420 閱讀 7768

1.功能:建立(build objects)物件,將一連串的隨意的記憶體位變物件,也分配資源(memory, files, semaphores, sockets等),"ctor" 是建構函式(constructor)典型的縮寫。

2.假定list是個類名,listx和listx()的區別:前者宣告了乙個list物件,後者則是乙個函式,返回list型別。

3.能否在乙個建構函式中呼叫另乙個建構函式?答案是否定的。

假設類fro有兩個建構函式foo::foo(char x)和foo::foo(char x,int y),那麼下面的**

classfoo;

foo::foo(charx)

也可以組合這兩個建構函式,通過預設引數

classfoo;

如果沒有預設引數可用,那麼我可以共享公用**在私有的init函式中,如:

classfoo;

foo::foo(charx)

foo::foo(charx,inty)

voidfoo::init(charx,inty)

不要嘗試把它用在布局new(placemement new)中,有些人認為可以new(this) foo(x, int(x)+7)在

foo::foo(char)中,這是絕對錯誤的。它會影響物件的構建位(constructed bits)。

4.預設建構函式(default constructor )的引數可以使沒有,也可以使預設的引數。如:

classfred; 或

classfred;

5.建立物件陣列時,哪個建構函式將被呼叫:

如果沒有預設建構函式,那麼建立物件陣列將會出錯。如:

classfred;

intmain()

如果用std::vector

,則可以不用預設建構函式。如:

#include

intmain()

也可以現實初始化陣列:也可以用placement new來手工初始化陣列元素

classfred;

intmain()

;...

}一般的我們用vector來替代陣列。

6.建構函式中如何使用初始化列表(initialization lists)和賦值(assignment)

在構造中使用初始化列表比賦值更有效率,後者比前者多了乙個臨時變數,多了這個臨時變數的建立和銷毀的開銷。但是在內建資料型別(int,float等)時,二者差別不大。

另一種情況是在構造中的成員物件會被以預設建構函式完整的構造,會分配一些預設狀態下的記憶體或是檔案,這樣如果在構造中如果使用表示式或複製失敗,是沒辦法來釋放資源或關閉檔案的。

在下面情況下不易使用初始化列表:類有兩個建構函式並且需要初始化這個資料成員按照不同的順序,或是有兩個資料成員自引用,或資料成員需要引用this物件,或者丟擲乙個異常之前要初始化這個this成員等。

7.建構函式可以使用this指標嗎?可以,但是小心使用,甚至於在初始化列表中使用它。

可以使用的情況:建構函式的函式體(或建構函式所呼叫的函式)能可靠地訪問基類中宣告的資料成員和/或建構函式所屬類裡宣告的資料成員。這是因為所有這些資料成員被保證在建構函式函式體開始執行時已經被完整的建立。

建構函式的函式體(或建構函式所呼叫的函式)不能向下呼叫被派生類重定義的虛函式。無論你如何呼叫虛成員函式:顯式使用this指標(如,this->method()),隱式的使用this指標(如,method()),或甚至在this物件上呼叫其他函式來呼叫該虛成員函式,原因:在基類的建構函式執行期間,派生類物件還未產生。

下面的情況有時是可行的:如果傳遞this物件的任何乙個資料成員給另乙個資料成員的初始化程式,你必須確保該資料成員已經被初始化。他的優點是不依賴編譯器,但是你必須知道一些語言規則(例如,基類子物件首先被初始化(如果有多重和/或虛繼承,則查詢這個次序!),然後類中定義的資料成員根據在類中宣告的次序被初始化),如果不知道就不要使用這個this指標。

8.命名的建構函式法(named constructor idiom):

作用就就是區分多個建構函式。

結構:把構造放到private或protected處,提供乙個返回物件的publicstatic方法。每種不同的構造物件的方法都有乙個這樣的靜態方法。例子:

classpoint;

intmain()

解決方法就是使用named constructor idiom

#include//togetsin()

andcos()

classpoint;

inlinepoint::point(floatx,floaty)

:x_(x),y_(y){}

inlinepointpoint::rectangular(floatx,floaty)

inlinepointpoint::polar(floatradius,floatangle)

intmain()

如果point有派生類,構造就放在protected中。

C 建構函式之預設建構函式

參考部落格 以下內容是在上述博主的部落格中提煉出來的 一 預設建構函式的含義是啥 主要就是 預設建構函式在呼叫的時候不需要顯示傳入實參的建構函式 二 預設的建構函式的分類 1 無參建構函式 就是沒有引數的建構函式 class sample 2 帶有形參,並且帶有預設值的建構函式 class samp...

C 建構函式之委託建構函式

委託建構函式 c 11新標準擴充套件了建構函式初始值的功能,使得我們可以定義所謂的委託建構函式。乙個委託建構函式使用它所屬類的其他建構函式執行它自己的初始化過程,或者說它把它自己的一些 或者全部 職責委託給了其他建構函式。和其他建構函式一樣,乙個委託建構函式也有乙個成員初始值的列表和乙個函式體。在委...

C 之建構函式

參考 c 程式設計指南 類是否用 static 來修飾,有兩種,一種是用static修飾,一種則不是。對於前者,如果,類提供了乙個無引數的建構函式,那麼new 例項化物件時候,就會呼叫這個無引數的建構函式 也叫預設建構函式 如果,類提供了乙個有引數的建構函式,但是new時候,依然沒有提供引數,那麼情...