C++中的构造函数重载

Constructor Overloading in C++

本文关键字:重载 构造函数 C++      更新时间:2023-10-16

我的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;
}

以及来自的输出

Node n(16);
cout << n.value << endl;

是0,而它应该是16。

我做错了什么?

构造函数中的

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)
{
    ...
} 

C++11将允许构造函数调用其他对等构造函数(称为委托(,然而,大多数编译器还不支持这一点。

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

Node::Node(double v)
: Node(Game(),v)
{
    cout << "2" << endl;
}
Node::Node(double v)
{
    cout << "2" << endl;
    Node(Game(),v);            // 1      
}
  1. 创建一个没有名称的对象,该对象在该表达式之后不会持久存在。因此,它不会影响实例化单参数构造函数的原始对象的value。您还需要了解这个临时对象与原始构造对象完全不同

但是,您可以通过常量引用(即(来延长此临时对象的使用寿命

Node::Node(double v)
{
    cout << "2" << endl;
    const Node& extendTemporay = Node(Game(),v); 
    value = extendTemporary.value ;  // Just trivial example;
                                     // You can simply do it by value = v;               
}

您可以这样做,其中init((是一个私有方法:

#include "Node.h"
#include <iostream>
Node::Node()
{
    cout << "1" << endl;
    init(Game(), 0.0);
}
Node::Node(double v)
{
    cout << "2" << endl;
    init(Game(),v);
}
Node::Node(Game g, double v)
{
    cout << "3" << endl;
    init(g,v)
}
void Node::init(Game g, double v)
{
    numVisits = 0;
    value = v;
    game = g;
}

简而言之:

#include <iostream>
#include "Node.h"
Node::Node()
    : game(Game()), value(0.), numVisits(0)
{
    std::cout << "1" << std::endl;
}
Node::Node(double v)
    : game(Game()), value(v), numVisits(0)
{
    std::cout << "2" << std::endl;
}
Node::Node(Game g, double v)
    : game(g), value(v), numVisits(0)
{
    std::cout << "3" << std::endl;
}

正如大家所说,不能从构造函数调用构造函数重载。委派是我们将在C++11中遇到的一个高级功能。打字的文字不多,别偷懒。