C 類中乙個構造函式呼叫另乙個建構函式

2021-06-21 11:54:24 字數 1010 閱讀 5863

class a

a(int aa, int bb, int cc);

};

上面類中,已經有乙個建構函式,形參有兩個,我們又過載乙個有3個形參的建構函式,為了減少**量,就想著讓3個引數的構造函式呼叫2個引數的建構函式,然後在執行一些自己的**,這就如同派生類先呼叫基類的同名函式,在執行自己特有的**。這種機制如何實現呢?

做法一:在3個引數中顯示呼叫2個引數的建構函式(這肯定是可以的, 建構函式是類的成員函式),此時要用到placement new技術。

3引數建構函式可以這樣實現:

a::a(int aa, int bb, int cc) 

建構函式有2個執行階段:1)是在初始化列表的初始化階段;2)在建構函式體內的賦值階段。上述方法是在第二個階段。placement new技術的形式是 new(void *p) type(...),表示在p所指的記憶體區域呼叫type建構函式,該過程沒有記憶體請求。上述實現有「投機取巧」之嫌,就是在物件位址處,呼叫2個引數的建構函式重新生成乙個新的物件然後覆蓋該物件。

做法二:在vs2013中發現可以在建構函式初始化列表直接呼叫,類似於呼叫基類建構函式。該方法在g++中不適合。

a::a(int aa, int bb, int cc) :a(aa, bb)

上述說了建構函式有2個執行階段,該方法是在第乙個階段進行的,這種方式有點類似c#裡面的機制,更加方便。該方法有個注意事項是不能在a(aa, bb)後面在接c(cc)了,因為呼叫2個引數的建構函式之後,就相當於該物件已經初始化完成了,不能在初始化列表放入其他成員的初始化形式。只能放在建構函式體中的賦值階段。該方法目前只能用在vs2013中。

做法二有很大的侷限性,不過確實很方便。不知標準文件對於建構函式互相呼叫有怎樣的規定?是否以後其他編譯器會加入該功能?

C 中乙個類成員函式呼叫另乙個類成員的方法

在繼承之外,在c 中乙個類成員函式呼叫另乙個類成員的方法主要有 類的組合,友元類,類的前向宣告,單例模式等,下面主要講講這4種方法的實現 組合通俗來講就是類b有類a的屬性,如宣告乙個person類,再宣告乙個teacher類,person類物件有年齡和姓名成員,而teacher類物件成員也有年齡和姓...

C 中乙個函式作為作為另乙個函式的引數

把函式名作為引數就是函式的位址了.要將函式名作為引數,需要使用函式指標。函式指標的定義格式為 ret type var name arg list 表示返回值為ret type,引數列表為arg list的函式指標var name.如int p int,int 表示返回值為int,引數為兩個int型...

使用this從乙個構造器中呼叫另乙個構造器

在同乙個類中 針對同乙個物件例項 從乙個構造器中呼叫另乙個構造器,c 採取的語法格式是在乙個冒號後面新增this關鍵字,再新增與被呼叫構造器對應的乙個引數列表 code class employee 使用this呼叫另乙個來構造器,注意salary屬性也是賦到值的,是呼叫整一構造器 public e...