有多種方式通過多個構造函數初始化對象。
哪一個使用它取決於個人偏好/編碼指南,用例(可能構造函數不同以共享代碼)和技術限制(例如,編譯器不支持C++ 11功能):
#include <iostream>
//Your current solution (works pre C++11)
class ovrldng_1 {
public:
int var;
ovrldng_1() {
var = 101;
std::cout << "ovrldng_1 var =" << var << std::endl;
}
ovrldng_1(int x) {
var = x;
std::cout << "ovrldng_1 var =" << var << std::endl;
}
};
//Using a function to initialize (works pre C++11)
class ovrldng_2 {
public:
int var;
ovrldng_2() {
init(101);
}
ovrldng_2(int x) {
init(x);
}
void init(int x){
var = x;
std::cout << "ovrldng_2 var =" << var << std::endl;
}
};
//Using a default value (works pre C++11)
class ovrldng_3 {
public:
int var;
ovrldng_3(int x=101) {
var = x;
std::cout << "ovrldng_3 var =" << var << std::endl;
}
};
//Calling one constructor from another (constructor delegation) (C++11 is required)
class ovrldng_4 {
public:
int var;
ovrldng_4(int x) {
var = x;
std::cout << "ovrldng_4 var =" << var << std::endl;
}
ovrldng_4() : ovrldng_4(101){}
};
爲了測試這些可以只創建每一類型的對象(和與每一個定義的構造函數),並檢查該輸出:
int main(int argc, char* argv[])
{
ovrldng_1 a;
ovrldng_1 b(212);
ovrldng_2 c;
ovrldng_2 d(212);
ovrldng_3 e;
ovrldng_3 f(212);
ovrldng_4 g;
ovrldng_4 h(212);
return 0;
}
輸出:
ovrldng_1 var = 101
ovrldng_1 var = 212
ovrldng_2 var = 101
ovrldng_2 var = 212
ovrldng_3 var = 101
ovrldng_3 var = 212
ovrldng_4 var = 101
ovrldng_4 var = 212
附錄 您應該使用初始值設定項列表(請參閱https://isocpp.org/wiki/faq/ctors#init-lists)。 我只是沒有使用它們來使不同的類更容易比較。
一個對象只能構造一次。 – NathanOliver
在C++ 11之前,你不能使用構造函數代理 –