【问题标题】:Default values of arguments in C++ constructor [closed]C ++构造函数中参数的默认值[关闭]
【发布时间】:2016-07-06 15:11:51
【问题描述】:

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

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

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

方法一:

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

【问题讨论】:

  • 在 C++ 中,您不需要 this-&gt; 符号。直接访问成员变量。
  • 方法 2 和 3 之间确实没有区别。方法 2 和 4 之间的唯一区别是一个使用初始化列表,而另一个不使用。这意味着方法 2、3 和 4 是相同的。至于哪个是“最好的”,那就看你怎么想了,这是主观的,见仁见智。

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


【解决方案1】:

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

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

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

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

Object() : Object("")
{
}

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

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

【讨论】:

  • 根据委托构造函数,哪个更好:Object(string inArg="yyy") : var(inArg) { var = GLOBAL_VAR + var + "ZZZ"; }Object() : Object("yyy") {} Object(string inArg) : var(inArg) { var = GLOBAL_VAR + var + "ZZZ"; }
  • 对于这种特定情况,我认为委托构造函数方法更好,至少对于我使用的编译器而言。但仅适用于这个特定的课程。这个结论只适用于这个特定的类,而不适用于其他类。换句话说:它的价值很小;并且这不应被解释为意味着委托构造函数在其他类中或使用不同的编译器时会更好。需要了解并理解每个类的用法和编译器,才能针对给定的类就该主题得出正确的结论。
猜你喜欢
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2012-06-30
  • 2014-05-08
相关资源
最近更新 更多