2012-05-04 19 views

回答

0

不要从另一个方法或另一个构造函数显式调用构造函数。

如果您真的需要使用两阶段初始化,在构造对象之后调用Init()类型的方法。

0

只能通过新建或堆栈中的对象构造来显式调用构造方法。有办法破解它(例如放置新的),但不这样做,只需使用两阶段构建&初始化。

1

我假设你指的是从派生类的初始化列表中调用基类构造函数。假设情况如此,那么首先执行BASE类构造函数(包括其初始化程序列表),然后调用派生类的初始化程序列表。

如果您想知道 - 基类构造函数在派生类执行初始化程序列表之前调用ALWAYS,即使对基类构造函数的调用显式出现在派生类的中间或末尾初始化列表(以及它是否出现在开头)。原因是初始化程序列表中的项目按照它们出现在类头文件的DECLARATION类中的顺序执行,而不是按它们在构造函数定义中的初始化程序列表中出现的顺序执行。而基类类构造函数从未在派生的类声明中声明。 C++要求在派生类构造函数之前调用基类构造函数 - 无论对基类构造函数的调用是否显式出现在派生类的初始化列表中,也不要在初始化程序列表中出现的位置。

2

在C++ 11中,您可以将构造函数委托工作到同一个类中的另一个构造函数,例如, :

#include <iostream> 
struct SomeType { 
    int number; 

    SomeType(int new_number) : number(new_number) {} 
    SomeType() : SomeType(42) {} 
}; 

int main() { 
    SomeType a; 
    std::cout << a.number << std::endl; 
} 

在这种情况下,禁止该代表团之后有一个initaliser列表,例如将前面的示例更改为:

SomeType() : SomeType(42), number(0) {} 

是错误。


如果问题是“给定了继承关系,那么匿名者列表仍然会被调用?”答案是肯定的,例如

#include <iostream> 
struct SomeBase { 
    SomeBase(int) {} 
}; 

struct SomeType : SomeBase { 
    int number; 

    SomeType(int new_number=0) : SomeBase(new_number), number(new_number) {} 
}; 

int main() { 
    SomeType a; 
    std::cout << a.number << std::endl; 
} 

这很好,它的工作原理就是你希望的。


这是不合法的直接调用构造函数从另一个构造函数中,并在C++之前,C++ 11没有构造代表团允许要么,所以像:

#include <iostream> 

struct SomeType { 
    int number; 

    SomeType(int new_number) : number(new_number) {} 
    SomeType() { 
     SomeType::SomeType(0); // Error! 
    } 
}; 

int main() { 
    SomeType a; 
    std::cout << a.number << std::endl; 
} 

是一个错误,不能直接表达。

下(我猜是写的问题时,你脑子里想的是什么)的例子不是然而错误,但不这样做,你可能会希望什么:

#include <iostream> 

struct SomeType { 
    int number; 

    SomeType(int new_number) : number(new_number) {} 
    SomeType() { 
     SomeType(0); 
     number = 42; 
    } 
}; 

int main() { 
    SomeType a; 
    std::cout << a.number << std::endl; 
} 

这里不带参数的构造函数构造SomeType的匿名临时实例。它是最初调用构造函数的一个完全独立的实例。这是完全合法的,但可能不是你想要做的。如果你这样做,如果你不小心,你可能会创建无限递归的风险,如果你最终做了这样的事情,我认为这可能是一个设计问题的好指标!

从维基百科C++11 article

派生
相关问题