class obj;
//建構函式,析構函式,拷貝建構函式都應該宣告為public型
obj::obj(int data1,int data2,char* name)
在c++中,有一種特殊的成員函式,它的名字和類名相同,沒有返回值,不需要使用者顯式呼叫(使用者也不能呼叫),而是在建立物件時自動執行。這種特殊的成員函式就是建構函式(constructor)
在《c++類成員的訪問許可權以及類的封裝》一節中,我們通過成員函式 setname()、setage()、setscore() 分別為成員變數 name、age、score 賦值,這樣做雖然有效,但顯得有點麻煩。有了建構函式,我們就可以簡化這項工作,在建立物件的同時為成員變數賦值,請看下面的**(示例1)
#include using namespace std;
class student;
//定義建構函式
student::student(char *name, int age, float score)
//定義普通成員函式
void student::show()
該例在 student 類中定義了乙個建構函式student(char *, int, float),它的作用是給三個 private 屬性的成員變數賦值。要想呼叫該建構函式,就得在建立物件的同時傳遞實參,並且實參由( )包圍,和普通的函式呼叫非常類似。
在棧上建立物件時,實參位於物件名後面,例如student stu("小明", 15, 92.5f);在堆上建立物件時,實參位於類名後面,例如new student("李華", 16, 96)。
建構函式必須是 public 屬性的,否則建立物件時無法呼叫。當然,設定為 private、protected 屬性也不會報錯,但是沒有意義。
建構函式沒有返回值,因為沒有變數來接收返回值,即使有也毫無用處,這意味著:
不管是宣告還是定義,函式名前面都不能出現返回值型別,即使是 void 也不允許;
函式體中不能有 return 語句。
和普通成員函式一樣,建構函式是允許過載的。乙個類可以有多個過載的建構函式,建立物件時根據傳遞的實參來判斷呼叫哪乙個建構函式。
建構函式的呼叫是強制性的,一旦在類中定義了建構函式,那麼建立物件時就一定要呼叫,不呼叫是錯誤的。如果有多個過載的建構函式,那麼建立物件時提供的實參必須和其中的乙個建構函式匹配;反過來說,建立物件時只有乙個建構函式會被呼叫。
如果使用者自己沒有定義建構函式,那麼編譯器會自動生成乙個預設的建構函式,只是這個建構函式的函式體是空的,也沒有形參,也不執行任何操作。例如:
student()
{}
建構函式的一項重要功能是對成員變數進行初始化,為了達到這個目的,可以在建構函式的函式體中對成員變數一一賦值,還可以採用初始化列表。
#include using namespace std;
class student;
//採用初始化列表
student::student(char *name, int age, float score): m_name(name), m_age(age), m_score(score)
void student::show()
如本例所示,定義建構函式時並沒有在函式體中對成員變數一一賦值,其函式體為空(當然也可以有其他語句),而是在函式首部與函式體之間新增了乙個冒號:
,後面緊跟m_name(name), m_age(age), m_score(score)
語句,這個語句的意思相當於函式體內部的m_name = name; m_age = age; m_score = score;
語句,也是賦值的意思。 C 建構函式詳解
c 類的建構函式詳解 一 建構函式是幹什麼的 class counter private 資料成員 int m value 該類物件被建立時,編譯系統物件分配記憶體空間,並自動呼叫該建構函式 由建構函式完成成員的初始化工作 eg counter c1 編譯系統為物件c1的每個資料成員 m value...
c 建構函式詳解
c 類的建構函式詳解 一 建構函式是幹什麼的 class counter private 資料成員 int m value 該類物件被建立時,編譯系統物件分配記憶體空間,並自動呼叫該建構函式 由建構函式完成成員的初始化工作 eg counter c1 編譯系統為物件c1的每個資料成員 m value...
C 建構函式詳解
c 建構函式的知識在各種c 教材上已有介紹,不過初學者往往不太注意觀察和總結其中各種建構函式的特點和用法,故在此我根據自己的c 程式設計經驗總結了一下c 中各種建構函式的特點,並附上例子,希望對初學者有所幫助。c 類的建構函式詳解 一 建構函式是幹什麼的 class counter private ...