构造函数在C++中重载

sda*_*das 29 c++

我的C++重载不起作用,因为我认为它应该:

#include "Node.h"
#include <iostream>

Node::Node()
{
    cout << "1" << endl;
    Node(Game(), 0.0);
}

Node::Node(double v)
{
    cout << "2" << endl;
    Node(Game(),v);
}

Node::Node(Game g, double v)
{
    cout << "3" << endl;
    numVisits = 0;
    value = v;
    game = g;
}
Run Code Online (Sandbox Code Playgroud)

而输出来自:

Node n(16);
cout << n.value << endl;
Run Code Online (Sandbox Code Playgroud)

是0,应该是16.

我做错了什么?

Mu *_*iao 42

Node(Game(),v);在您的构造函数中没有按预期执行.它只是创建一个临时的而不使用它,并没有任何效果.然后当控制流过;时,它会立即破坏那个临时的.

正确的方法是初始化每个构造函数中的成员.您可以在私有init()成员函数中提取它们的公共代码,并在每个构造函数中调用它,如下所示:

class Foo {
    public:
        Foo(char x);
        Foo(char x, int y);
        ...
    private:
        void init(char x, int y);
};

Foo::Foo(char x)
{
    init(x, int(x) + 3);
    ...
}

Foo::Foo(char x, int y)
{
    init(x, y);
    ...
}

void Foo::init(char x, int y)
{
    ...
} 
Run Code Online (Sandbox Code Playgroud)

C++ 11将允许构造函数调用其他对等构造函数(称为委托),但是,大多数编译器还没有支持它.

  • @“_它只是创建一个临时文件而不使用它并且没有任何效果。然后当控制权流过 ;._ 时它立即破坏该临时文件:由于这种行为,我损失了 1 天。现在,我正在使用建议的“private init()”函数,一切正常...... (2认同)

Pra*_*ian 18

您尝试使用的功能称为委托构造函数,它是C++ 0x的一部分.使用该语法,您的第二个构造函数变为

Node::Node(double v)
: Node(Game(),v)
{
    cout << "2" << endl;
}
Run Code Online (Sandbox Code Playgroud)