2014-10-01 176 views
5

我不知道如果我有我班A*成员,应该不是,我们会自动设置为nullptr,如果我有我的课的这种形式构造:C++的默认构造函数不会初始化指向nullptr的指针?

class MyCLass 
{ 
    A* m_pointer; 

public: 
    MyCLass() 
    { 
    } 
}; 

不要紧,如果我做MyCLass* o = new MyCLass;或我在C++ 11中做MyCLass* o = new MyCLass();

+3

你能说清楚你的问题吗? – juanchopanza 2014-10-01 13:09:28

+2

你不需要明确的指针,只需使用'std :: unique_ptr'。 – 0x499602D2 2014-10-01 13:11:15

+5

@ 0x499602D2是什么让你认为这个类应该是指向对象的独占所有者? – 2014-10-01 13:15:35

回答

14

指针是 “POD类型” ...... a.k.a。 “普通旧数据”。对于何时何地,都是缺省初始化的规则总结如下:

Default initialization of POD types in C++

因此,没有。不管你的类的构造函数是什么,如果它是作为类成员的原始指针。你实际上并没有实例化这个类。因此成员像Foo *std::vector<Foo> *或以*结尾的任何内容都不会初始化为nullptr。

智能指针类不是POD。所以,如果你使用unique_ptr<Foo>shared_ptr<Foo>是创建类的实例,这确实有一个构造函数,使他们有效地为空,如果你不初始化它们。

如果我做MyCLass * o = new MyCLass;或者我MyCLass * o = new MyCLass();在C++ 11中?

每个问题

一个问题,请。

Do the parentheses after the type name make a difference with new?

+0

但是,如果我根本没有定义构造函数,我想它会被编译器生成的默认CTOR初始化为'nullptr',对吧? – Narek 2014-10-01 13:20:06

+0

@Narek在这种情况下,你需要'MyClass m {};'或'MyCLass * m = new MyClass();'以确保数据成员如指针是零初始化的,即你需要*初始化*目的。 – juanchopanza 2014-10-01 13:21:30

+0

@Narek Nope。你可以通过搜索来轻松阅读,比如“默认构造函数的确切做法,以及何时调用?”并找到[这个答案]喜欢(http://stackoverflow.com/questions/2417065/does-the-default-constructor-initialize-built-in-types) – HostileFork 2014-10-01 13:21:43

1

默认构造函数,如果编译器生成或违约,将默认初始化所有成员。任何用户定义的构造函数都会默认初始化初始化程序列表中没有显式初始值设定项的所有成员。

为默认初始化方法“呼吁类的默认构造函数,保留一切未初始化”。