我想知道我的课程中是否有A*
成员,如果我有这种形式的班级构造函数,我们不应该自动设置为nullptr
:
class MyCLass
{
A* m_pointer;
public:
MyCLass()
{
}
};
如果我在C ++ 11中MyCLass* o = new MyCLass;
或MyCLass* o = new MyCLass();
这么重要吗?
答案 0 :(得分:15)
指针是" POD类型" ... a.k.a。 "普通旧数据"。默认初始化的时间和地点的规则总结如下:
Default initialization of POD types in C++
所以没有。如果一个类的构造函数是一个原始指针作为类的成员,那么它对你的构造函数是什么并不重要。你实际上并没有实例化这个类。因此,Foo *
或std::vector<Foo> *
或以*结尾的任何内容都不会初始化为nullptr。
智能指针类不是POD。因此,如果您使用创建类实例的unique_ptr<Foo>
或shared_ptr<Foo>
,那么如果您没有初始化它们,那么它会有一个构造函数使它们实际为null。
如果我做MyCLass * o = new MyCLass,这是否重要;或者我做MyCLass * o = new MyCLass();在C ++ 11中?
请问每个问题一个问题。
Do the parentheses after the type name make a difference with new?
答案 1 :(得分:1)
默认构造函数,如果是编译器生成的或默认的,将默认初始化所有成员。任何用户定义的构造函数都会默认初始化初始化列表中没有显式初始值设定项的所有成员。
默认初始化意味着“调用类的默认构造函数,让其他所有内容保持未初始化”。