class A
{
public:
int get(void){return stuff;}
void set(int s){stuff = s;}
private:
int stuff;
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
A b();
A* ap = new A;
A* bp = new A();
}
Run Code Online (Sandbox Code Playgroud)
我不知道main()中的四行之间的区别是什么,以及我可能使用哪一种与另一种(除了在堆栈或堆上)之间的区别.我注意到第四行实际上将"stuff"初始化为0,而其他行则没有.第二行似乎根本不是什么,这看起来很奇怪.
问题:每条线的权衡/含义是什么(在main()中)?是否使用parens对我来说很困惑.
A a;
Run Code Online (Sandbox Code Playgroud)
这是默认初始化.由于没有默认构造函数,因此每个数据成员都是默认初始化的; 因此a.stuff留下了不确定的价值.
A b();
Run Code Online (Sandbox Code Playgroud)
那声明了一个功能.它不会创建对象.
A* ap = new A;
Run Code Online (Sandbox Code Playgroud)
这会动态分配一个对象,并按上述方式对其进行默认初始化.由于你永远不会删除它,内存泄露.你不应该使用,new除非你真的需要一个动态的生命周期; 当你这样做时,通常应该使用智能指针在适当的时候删除它,避免泄漏.
A* bp = new A();
Run Code Online (Sandbox Code Playgroud)
这会动态分配一个对象并对其进行值初始化.由于没有默认构造函数,因此它会初始化每个数据成员; 所以bp->stuff初始化为零.再次,内存泄露.
如果类具有默认构造函数,那么默认值和值初始化将是相同的; 两者都会调用构造函数.