[英]object construction : default parameter vs delegation
考虑下面的代码,我试图引入默认构造函数以及class A
的参数化构造函数。 这种方式是在最近的c ++改进中引入的。
class A {
private:
unsigned int count;
public:
A(int new_c) : count(new_c) {}
A() : A(10) {}
};
vs在参数化构造函数上设置默认参数并完全忽略默认构造函数的旧方法。
class A {
private:
unsigned int count;
public:
A(int new_c = 5) : count(new_c) {}
};
除了遵循现代惯例之外,使用第一种方法比第二种方法有什么优势吗?
功能上没有区别。 知道甚至有另一个选项可用于非静态成员初始化(从C ++ 11开始):
class A {
private:
unsigned int count = 10;
public:
A() = default;
A(int new_c) : count(new_c) {}
};
在你的例子中没有任何优势(我甚至在这样的例子中更明确地选择第二个选项)
委托构造函数添加,以便在默认值不足时轻松工作。
例如
struct Point3d
{
Point3d(int x, int y, int z);
Point3d(Point2d p) : Point3d(p.x, p.y, 0) {}
}
在较大类的情况下,优势将更加明显,其中可以是少数构造函数。 以新的方式,您将能够编写一个构造函数,然后将其设置为其他构造函数。 这不容易出错。
class A {
private:
unsigned int count;
int other;
float otherfloat;
public:
A( unsigned int count, int other, float otherfloat ) : count( count), other( other ), otherfloat( otherfloat ) {}
A(int new_c) : A(new_c, 0, 0.0 ) {}
A() : A(10) {}
};
虽然从技术上讲没有区别,但是创建转发构造函数背后的想法是不同的。 想象一下以下课程:
class sample {
complexType member;
bool createdWithInt;
public:
sample() : member(5), createdWithInt(false) {
/* code ... */
}
sample(int param) : sample() {
createdWithInt = true;
/* other code */
}
};
因此,使用默认参数很难实现此类:其行为不依赖于参数的值,而是取决于存在。
有人可能尝试使用辅助函数void creator()
来实现它,该函数从构造函数执行code ...
而不带参数。 然而,这意味着重复初始化列表(或者如果从creator()
内部初始化则丢弃RAII原则)。
注意: createdWithInt
可以从初始化列表初始化,如果添加了另一个构造函数,则需要bool并且两个当前构造函数都转发到该构造函数。 为了举例,这已被省略。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.