C++中的构造函数重载
Constructor Overloading in 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;
}
以及来自的输出
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
}
- 创建一个没有名称的对象,该对象在该表达式之后不会持久存在。因此,它不会影响实例化单参数构造函数的原始对象的
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中遇到的一个高级功能。打字的文字不多,别偷懒。
相关文章:
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- C++将带有重载构造函数的对象添加到另一个对象
- 将重载构造函数传递给类之间的函数
- 使用重载构造函数时出现不完整的类型错误
- 在 if 语句中调用重载构造函数失败
- C++ 具有常量数组和initializer_list的重载构造函数
- C++头/实现文件中的默认和重载构造函数?
- 有没有办法用 2D 数组 (int) 重载构造函数?
- C++重载构造函数问题
- C++:使用结构或枚举重载构造函数之间的区别
- 未调用模板成员的重载构造函数
- 如果我们在c++中重载构造函数,那么默认构造函数是否仍然存在
- 如何为显式重载构造函数启用复制初始化
- 执行重载构造函数的原因和时间
- c++ 在对象组合上使用重载构造函数
- 按参数C++类型专门化重载构造函数
- 具有公共重载构造函数的私有枚举
- 如何处理默认构造函数和重载构造函数之间的歧义
- 变量不会在重载构造函数C++后保持声明状态
- 对重载构造函数 C++ 的不明确调用