C++ 构造函数中参数的默认值
Default values of arguments in C++ constructor
我可以像在方法 1 中那样立即指定默认值,还是应该像在方法 2 中那样使用重载构造函数,或者像在方法 3/4 中那样使用初始化列表?
哪种方法是 better/right 方法,为什么(所有方法似乎都有效)?
方法 3 和方法 4 之间有什么区别 - 我应该指定第一个构造函数声明,然后在 class 之外指定下一个定义,还是我可以立即指定定义?
方法一:
#include <iostream>
#include <string>
using namespace std;
const string GLOBAL_VAR = "XXX";
class Object
{
private:
string var;
public:
Object(string inArg = "yyy")
{
this->var = GLOBAL_VAR + inArg + "ZZZ";
}
string show()
{
return this->var;
}
};
int main() {
Object o1, o2("www");
cout << o1.show() << endl;
cout << o2.show() << endl;
system("pause");
}
方法二:
#include <iostream>
#include <string>
using namespace std;
const string GLOBAL_VAR = "XXX";
class Object
{
private:
string var;
public:
Object()
{
this->var = GLOBAL_VAR + "yyyZZZ";
}
Object(string inArg)
{
this->var = GLOBAL_VAR + inArg + "ZZZ";
}
string show()
{
return this->var;
}
};
int main() {
Object o1, o2("www");
cout << o1.show() << endl;
cout << o2.show() << endl;
system("pause");
}
方法三:
#include <iostream>
#include <string>
using namespace std;
const string GLOBAL_VAR = "XXX";
class Object
{
private:
string var;
public:
//declaration:
Object();
Object(string);
string show()
{
return this->var;
}
};
//definition:
Object::Object() : var(GLOBAL_VAR + "yyyZZZ") {}
Object::Object(string inArg) : var(GLOBAL_VAR + inArg + "ZZZ"){}
int main() {
Object o1, o2("www");
cout << o1.show() << endl;
cout << o2.show() << endl;
system("pause");
}
方法四:
#include <iostream>
#include <string>
using namespace std;
const string GLOBAL_VAR = "XXX";
class Object
{
private:
string var;
public:
//declaration and definition in one:
Object() : var(GLOBAL_VAR + "yyyZZZ") {}
Object(string inArg) : var(GLOBAL_VAR + inArg + "ZZZ") {}
string show()
{
return this->var;
}
};
int main() {
Object o1, o2("www");
cout << o1.show() << endl;
cout << o2.show() << endl;
system("pause");
}
我认为这两种方法同样有效。根据每个人的具体情况 class,每种方法都有其优点、优点和缺点。
当需要以几乎相同的方式初始化对象时,使用默认值通常是最佳选择,无论构造函数参数是否为默认值。指定默认值可以避免重复一堆代码。你只有一个构造函数。
另一方面,使用重载构造函数可以以完全不同的方式干净地构造对象,具体取决于是否给定参数。在这种情况下,强制 class 具有单个构造函数通常会导致使用一堆 if
语句对代码进行地毯式轰炸。
此外,不要忘记第三个选项:委托构造函数。在您的示例代码中使用 class:
Object() : Object("")
{
}
这种方法也有其固有的优势。
总的来说,对于哪种方法最好还没有达成共识。最好考虑每个 class 的具体要求,然后选择最适合该 class 的方法。对一个 class 最好的方法可能对另一个 class 不是最好的方法。
我可以像在方法 1 中那样立即指定默认值,还是应该像在方法 2 中那样使用重载构造函数,或者像在方法 3/4 中那样使用初始化列表?
哪种方法是 better/right 方法,为什么(所有方法似乎都有效)?
方法 3 和方法 4 之间有什么区别 - 我应该指定第一个构造函数声明,然后在 class 之外指定下一个定义,还是我可以立即指定定义?
方法一:
#include <iostream>
#include <string>
using namespace std;
const string GLOBAL_VAR = "XXX";
class Object
{
private:
string var;
public:
Object(string inArg = "yyy")
{
this->var = GLOBAL_VAR + inArg + "ZZZ";
}
string show()
{
return this->var;
}
};
int main() {
Object o1, o2("www");
cout << o1.show() << endl;
cout << o2.show() << endl;
system("pause");
}
方法二:
#include <iostream>
#include <string>
using namespace std;
const string GLOBAL_VAR = "XXX";
class Object
{
private:
string var;
public:
Object()
{
this->var = GLOBAL_VAR + "yyyZZZ";
}
Object(string inArg)
{
this->var = GLOBAL_VAR + inArg + "ZZZ";
}
string show()
{
return this->var;
}
};
int main() {
Object o1, o2("www");
cout << o1.show() << endl;
cout << o2.show() << endl;
system("pause");
}
方法三:
#include <iostream>
#include <string>
using namespace std;
const string GLOBAL_VAR = "XXX";
class Object
{
private:
string var;
public:
//declaration:
Object();
Object(string);
string show()
{
return this->var;
}
};
//definition:
Object::Object() : var(GLOBAL_VAR + "yyyZZZ") {}
Object::Object(string inArg) : var(GLOBAL_VAR + inArg + "ZZZ"){}
int main() {
Object o1, o2("www");
cout << o1.show() << endl;
cout << o2.show() << endl;
system("pause");
}
方法四:
#include <iostream>
#include <string>
using namespace std;
const string GLOBAL_VAR = "XXX";
class Object
{
private:
string var;
public:
//declaration and definition in one:
Object() : var(GLOBAL_VAR + "yyyZZZ") {}
Object(string inArg) : var(GLOBAL_VAR + inArg + "ZZZ") {}
string show()
{
return this->var;
}
};
int main() {
Object o1, o2("www");
cout << o1.show() << endl;
cout << o2.show() << endl;
system("pause");
}
我认为这两种方法同样有效。根据每个人的具体情况 class,每种方法都有其优点、优点和缺点。
当需要以几乎相同的方式初始化对象时,使用默认值通常是最佳选择,无论构造函数参数是否为默认值。指定默认值可以避免重复一堆代码。你只有一个构造函数。
另一方面,使用重载构造函数可以以完全不同的方式干净地构造对象,具体取决于是否给定参数。在这种情况下,强制 class 具有单个构造函数通常会导致使用一堆 if
语句对代码进行地毯式轰炸。
此外,不要忘记第三个选项:委托构造函数。在您的示例代码中使用 class:
Object() : Object("")
{
}
这种方法也有其固有的优势。
总的来说,对于哪种方法最好还没有达成共识。最好考虑每个 class 的具体要求,然后选择最适合该 class 的方法。对一个 class 最好的方法可能对另一个 class 不是最好的方法。