1.構造函數的優勢
眾所周知,在結構體內部可以定義變量、函數等,但結構體內部的變量有一個特點:無法被初始化。因此我們需要初始化變量時可以通過函數實現。
struct student{
string name;
int score;
void pre(){
name="Tom";
score=4;
}
};
int main(){
student a;
a.pre();
printf("%d\n",a.score);
}
但每定義一個student類型的變量時,我們就需要調用pre函數一次,操作略為繁瑣。因此我們可以采用構造函數。
2.構造函數的寫法
構造函數是一類較為特別的成員函數,它必須先聲明在結構體的內部,其函數名與該結構體類型的名字一樣,如此處結構體類型名為student,則構造函數的名字便為student。另外,構造函數沒有返回值,不需要用戶調用(用戶也無法調用),而是在創建對象時自動執行。
struct student{
string name;
int score;
student(){
name="Tom";
score=6;
}
};
int main(){
student a;
printf("%d\n",a.score);
}
構造函數可以與其他函數一樣傳入參數,根據參數來進行初始化。在調用時必須在定義結構體類型的變量時同時傳入參數,故不能定義為\(student\;a;\)
struct student{
string name;
int score;
student(string s,int val){
name=s;
score=val;
}
};
int main(){
student a("Tom",5);
printf("%d\n",a.score);
}
有時參數可以不是通過我們手工輸入,而是自動為其賦一個值作為參數,如下代碼:
struct student{
string name;
int score;
student(string s,int val=4){
name=s;
score=val;
}
};
int main(){
student a("Tom");
printf("%d\n",a.score);
}
此處構造函數的val已經被我們賦值為4,故在定義時不需傳入val的參數。但如仍要傳入,則最后以我們傳入的參數為准,例:
struct student{
string name;
int score;
student(string s,int val=4){
name=s;
score=val;
}
};
int main(){
student a("Tom",6);
printf("%d\n",a.score); //輸出6
}
3.構造函數的初始化列表
構造函數在給成員變量賦值時,可以不把賦值操作寫在函數體內部,而是把它們放到函數名與函數體之間,具體格式如下:
struct student{
string name;
int score;
student(string s,int val):name(s),score(val){}
};
int main(){
student a("Tom",6);
printf("%d\n",a.score);
}
在函數名之后用冒號引起,不同的成員變量之間用逗號隔開,每個成員變量用括號表示賦值。此種方法較為簡便,被較多人采用。
注:給成員變量賦值時賦值順序與構造函數中成員變量書寫的順序無關,而是與成員變量在結構體內被定義的順序有關
struct student{
string name;
int score1,score2;
student(int val):score2(val),score1(score2){}
};
int main(){
student a(6);
printf("%d %d\n",a.score1,a.score2);
//輸出0 6
}
雖然在構造函數中score2的賦值操作寫在了score1之前,但實際進行中先進行score1的賦值操作,此時score2未被賦值,因此score1得到的值是隨機的。
4.構造函數的種類
構造函數的名稱全部相同,所以區分不同的構造函數只能依靠參數的種類、數目。
struct student{
int val1,val2;
string s;
student(int x){
val1=x;
}
student(int x,int y){
val1=x;
val2=y;
}
student(string s1){
s=s1;
}
};
int main(){
student a(1),b(1,2);
printf("%d\n",a.val1);
printf("%d\n",b.val2);
}
注意:在我們未定義構造函數的時候,系統會自動幫我們定義構造函數,此時的構造函數為空,沒有參數也沒有函數體,不執行任何操作。