C ++构造函数中参数的默认值

时间:2016-03-19 23:31:11

标签: c++ constructor default-value initialization-list

我可以像方法1一样指定默认值,还是应该使用方法2中的重载构造函数或者像METHOD 3/4中的初始化列表一样?

哪种方法更好/更正确,为什么(所有方法似乎都有效)?

方法3和4之间的区别是什么 - 我应该指定第一个构造函数声明,然后在类外部进行下一个定义,还是可以立即指定定义?

方法1:

#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");
}

方法2:

#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");
}

方法3:

#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");
}

方法4:

#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");
}

1 个答案:

答案 0 :(得分:1)

我认为这两种方法同样有效。根据每个班级的具体情况,每种方法都有其优点,优点和缺点。

当对象需要以相同的方式初始化时,使用默认值通常是最佳选择,无论构造函数参数是否默认。指定默认值可防止复制一堆代码。你只有一个构造函数。

另一方面,使用重载的构造函数可以以完全不同的方式干净地构造对象,具体取决于是否给出参数。在这种情况下,强制类具有单个构造函数通常会导致使用一堆if语句对代码进行地毯编码。

另外,不要忘记第三个选项:委托构造函数。使用示例代码中的类:

Object() : Object("")
{
}

这种方法也有其固有的优势。

总的来说,对于哪种方法最好是没有达成共识的。最好考虑每个班级的个人要求,并选择最适合该班级的方法。对于一个班级来说,最好的方法可能不是另一个班级的最佳方式。