先看一个错误的C++例子:
struct MY_CLASS
{
int a;
int b;
MY_CLASS(int _a, int_b)
{
this->a = a;
this->b = b;
}
MY_CLASS()
{
MY_CLASS(0, 0);
}
};
本来期望默认构造函数会初始化类为a=0, b=0, 可实际上却是个随机值。
对于C++来说,实际上MY_CLASS(0, 0);只是构造了一个临时对象,这个临时对象确实也将a, b初始化为0,但是这个临时对象在构造函数大括号结束以后生命期就结束了。MY_CLASS()是采用默认构造函数构造的另外一个对象,这个对象的内容没有初始化为0.
当然对于C++ 11来说,嵌套调用是可行的,比如:
class SomeType
{
int number;
public:
SomeType(int newNumber) : number(newNumber) {}
SomeType() : SomeType(42) {}
}
JAVA则可以直接进行构造函数嵌套调用,但要通过this进行调用,比如:
public class Person {
private String name;
private int age;
public Person() {
this("Bill", 28);
}
public Person(String n) {
this(n, 28);
}
public Person(String n, int a) {
name = n;
age = a;
}
}
本文探讨了C++中构造函数嵌套调用的常见错误,展示了为何直接在构造函数中调用另一个构造函数会导致预期之外的行为,并对比了Java如何正确实现此功能。同时,介绍了C++11如何改进这一机制。

816

被折叠的 条评论
为什么被折叠?



