轉載自:https://zhidao.baidu.com/question/2010930169328038188.html 冒號后面跟的是賦值,這種寫法是C++的特性。 A( int aa, int bb ):a(aa),b(bb) { } 相當於 A( int aa, int bb ) { a=aa; b=bb; }
C++構造函數后面的冒號
構造函數后加冒號是初始化表達式:
有四種情況下應該使用初始化表達式來初始化成員:
1:初始化const成員
2:初始化引用成員
3:當調用基類的構造函數,而它擁有一組參數時
4:當調用成員類的構造函數,而它擁有一組參數時。
在程序中定義變量並初始化的機制中,有兩種形式,一個是我們傳統的初始化的形式,即賦值運算符賦值,還有一種是括號賦值,如:
int a=10;
char b='r';//賦值運算符賦值
int a(10);/
char b('r');//括號賦值
以上定義並初始化的形式是正確的,可以通過編譯,但括號賦值只能在變量定義並初始化中,不能用在變量定義后再賦值,
冒號初始化是給數據成員分配內存空間時就進行初始化,就是說分配一個數據成員只要冒號后有此數據成員的賦值表達式(此表達式必須是括號賦值表達式),那么分配了內存空間后在進入函數體之前給數據成員賦值,就是說初始化這個數據成員此時函數體還未執行。 對於在函數中初始化,是在所有的數據成員被分配內存空間后才進行的。 這樣是有好處的,有的數據成員需要在構造函數調入之后函數體執行之前就進行初始化如引用數據成員,常量數據成員和對象數據成員。
class student {public : student () . . . protected: const int a; int &b; } student ::student (int i,int j) { a=i; b=j; }
在Student類中有兩個數據成員,一個是常量數據成員,一個是引用數據成員,並且在構造函數中初始化了這兩個數據成員,但是這並不能通過編譯,因為常量初始化時必須賦值,它的值是不能再改變的,與常量一樣引用初始化也需要賦值,定義了引用后,它就和引用的目標維系在了一起,也是不能再被賦值的。所以C
++":"后初始化的機制,使引用和常量數據成員變為可能的,Student類的構造函數應為:
student ::student(int i,int j):a(i),b(j)
{
}
轉自:http://blog.csdn.net/kaixinbingju/article/details/9094289
C++中一個構造函數后面加個冒號
比如這個例子:
#include<iostream.h>
class A
{
public:
int x;
A(int a=0){x=a}; }
};
class B1:publicA
{
public;
int y1;
B1(int a=0,int b=0):A(b) //就是這句
{ y1=a; }
};
請問那句后面的 :A(b) 代表什么啊,為什么要跟個B1基類的構造函數?
答:A(b)實際上是做的是用b初始化A的成員x;既x=b; :是初始化列表方式,具體見