有一種特殊的成員函數(shù)传睹,它的名字和類名相同硫麻,沒有返回值瞎疼,不需要用戶顯式調(diào)用(用戶也不能調(diào)用)水援,而是在創(chuàng)建對象時(shí)自動(dòng)執(zhí)行魄鸦。這種特殊的成員函數(shù)就是構(gòu)造函數(shù)(Constructor)宴杀。
作用
在創(chuàng)建對象的同時(shí)為成員變量賦值
注意
不管是聲明還是定義,函數(shù)名前面都不能出現(xiàn)返回值類型拾因,即使是 void 也不允許旺罢;
函數(shù)體中不能有 return 語句。
構(gòu)造函數(shù)的重載
和普通成員函數(shù)一樣绢记,構(gòu)造函數(shù)是允許重載的扁达。一個(gè)類可以有多個(gè)重載的構(gòu)造函數(shù),創(chuàng)建對象時(shí)根據(jù)傳遞的實(shí)參來判斷調(diào)用哪一個(gè)構(gòu)造函數(shù)蠢熄。
構(gòu)造函數(shù)的調(diào)用是強(qiáng)制性的跪解,一旦在類中定義了構(gòu)造函數(shù),那么創(chuàng)建對象時(shí)就一定要調(diào)用签孔,不調(diào)用是錯(cuò)誤的叉讥。如果有多個(gè)重載的構(gòu)造函數(shù)窘行,那么創(chuàng)建對象時(shí)提供的實(shí)參必須和其中的一個(gè)構(gòu)造函數(shù)匹配;反過來說图仓,創(chuàng)建對象時(shí)只有一個(gè)構(gòu)造函數(shù)會(huì)被調(diào)用罐盔。
對示例1中的代碼,如果寫作Student stu或者new Student就是錯(cuò)誤的透绩,因?yàn)轭愔邪藰?gòu)造函數(shù)翘骂,而創(chuàng)建對象時(shí)卻沒有調(diào)用壁熄。
默認(rèn)構(gòu)造函數(shù)
如果用戶自己沒有定義構(gòu)造函數(shù)帚豪,那么編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)的構(gòu)造函數(shù),只是這個(gè)構(gòu)造函數(shù)的函數(shù)體是空的草丧,也沒有形參狸臣,也不執(zhí)行任何操作
一個(gè)類必須有構(gòu)造函數(shù),要么用戶自己定義昌执,要么編譯器自動(dòng)生成烛亦。一旦用戶自己定義了構(gòu)造函數(shù),不管有幾個(gè)懂拾,也不管形參如何煤禽,編譯器都不再自動(dòng)生成。
最后需要注意的一點(diǎn)是岖赋,調(diào)用沒有參數(shù)的構(gòu)造函數(shù)也可以省略括號
C++構(gòu)造函數(shù)初始化列表
#include <iostream>
using namespace std;
class Student{
private:
char *m_name;
int m_age;
float m_score;
public:
Student(char *name, int age, float score);
void show();
};
//采用初始化列表
Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){
//TODO:
}
void Student::show(){
cout<<m_name<<"的年齡是"<<m_age<<"檬果,成績是"<<m_score<<endl;
}
int main(){
Student stu("小明", 15, 92.5f);
stu.show();
Student *pstu = new Student("李華", 16, 96);
pstu -> show();
return 0;
}