建構函式主要有三個作用:1、構建物件;2、初始化物件;3、型別轉換。
當類中的物件被建立時,編譯系統會為變數分配空間,並且系統會呼叫建構函式完成物件的資料成員的初始化工作。
class count
private:
int value;
}
類似於上面的類,建構函式就是為了能夠完成物件的初始化。當然,如果我們沒有在類中像上面一樣顯示定義,那麼編譯器會自動生成乙個預設的預設的建構函式。如果你已經定義,那麼編譯器就不會再生成了。
初始化列表,顧名思義就是為了初始化的,以下面的**為例:
class date
date(int year, int month, int day)
:_year(year), _month(month), _day(day)
private:
int _year;
int _month;
int _day;
};
在這裡,你可以看到建構函式的初始化方法,分別用:和,進行操作,此外你可以看到建構函式的過載的使用。
過載的時候,以下面的為例,在呼叫的時候只需要傳不同的引數就好。
void test()
int main()
但是使用初始化列表需要注意一些方面:
1、初始化的順序必須與類中的成員宣告的次序一致,你在私有中如何定義的,那麼初始化的順序就要和其相同。
2、類中的成員只能被初始化一次。
另外,在初始化方面有個地方需要強調一下:對於加了const限定的變數、引用的變數、只能通過初始化列表來初始化。此外,如果乙個類中包含另乙個類的子物件,並且這個物件是未預設的,那麼也需要用初始化列表初始化。
以下面的**為例:
class date
date(int year, int month, int day)
:a(0), ra(_year)
void setdate(int year, int month, int day)
void printdate()
private:
int _year;
int _month;
int _day;
const int a;
int &ra;
};
對於
乙個類中包含另乙個類的子物件,並且這個物件是未預設的,例子如下:
class time
void printtime()
private:
int _hour;
int _minute;
int _second;
};class date
void setdate(int year, int month, int day)
void printdate()
private:
int _year;
int _month;
int _day;
time t;
};
1、對於無參的建構函式和帶預設值的建構函式,使用時一定要注意避免二義性。
以下面的**為例:
class date
date(int year = 1997, int month = 2, int day = 13)
void setdate(int year, int month, int day)
void printdate()
private:
int _year;
int _month;
int _day;
};void test()
int main()
這裡的d1就會產生二義性,因為編譯器無法判斷你到底是呼叫哪乙個函式。所以需要避免這種情況的產生。
2、就以a類和b類為例,當a類包含b類,a類無建構函式,b類存在預設的建構函式,那麼a類也會生成乙個預設的建構函式。
建構函式 解析建構函式的作用
建構函式 是一種特殊的方法。主要用來在建立物件時初始化物件,即為物件 成員變數 賦初始值,總與new 運算子一起使用在建立物件的語句中。特別的乙個類可以有多個建構函式 可根據其引數個數的不同或引數型別的不同來區分它們 即建構函式的 過載。那麼,為什麼要在建立物件時初始化物件呢?又是如何實現的呢?接下...
拷貝建構函式與析構函式的簡單解析
顧名思義,拷貝建構函式就是對建構函式的再一次拷貝,用乙個由建構函式已經建立出來的物件建立乙個新的物件。所以,拷貝建構函式的引數就只有乙個,是對本類的型別物件的引用 常用const進行修飾 在這裡,可能有人會問為什麼為什麼不是直接呼叫,而是使用引用。如果你直接呼叫,那麼物件會使用建構函式再建立乙個臨時...
php的建構函式解析
1 什麼是構造方法 構造方法是類中的乙個特殊方法。當使用 new 操作符建立乙個類的例項時,構造方法將會自動呼叫,其名稱 必須是 construct 在乙個類中只能宣告乙個構造方法,而是只有在每次建立物件的時候都會去呼叫一次構造 方法,不能主動的呼叫這個方法,所以通常用它執行一些有用的初始化任務。該...