【问题标题】:What is the difference between these different object constructions? [duplicate]这些不同的对象构造之间有什么区别? [复制]
【发布时间】:2013-11-12 22:29:03
【问题描述】:
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();
}

我不知道 main() 中的四行之间究竟有什么区别,以及在哪些情况下我可能会使用其中的一个和另一个(除了在堆栈或堆上)。我注意到第四行实际上将“stuff”初始化为 0,而其他行没有。第二行似乎什么都没有,这似乎很奇怪。

问题:每行的权衡/含义是什么(在 main() 中)?是否使用括号让我感到困惑。

【问题讨论】:

  • 不要使用newb 不是对象。通过消除,唯一剩下的选项是a
  • 对于初学者,A b(); 不构造对象。它是function declaration
  • a 是一个局部变量,当它超出范围时(在代码块的末尾)它将被“释放”,bp 对象在其指针消失时仍然存在除非你明确删除它。

标签: c++ constructor


【解决方案1】:
A a;

这是默认初始化。由于没有默认构造函数,每个数据成员都是默认初始化的;所以a.stuff 留下了一个不确定的值。

A b();

声明一个函数。它不会创建对象。

A* ap = new A;

动态分配一个对象,并如上所述默认初始化它。由于您从不删除它,因此内存已泄漏。你不应该使用new,除非你真的需要一个动态的生命周期;当你这样做时,通常应该使用智能指针在正确的时间删除它,避免泄漏。

A* bp = new A();

动态分配一个对象并值初始化它。由于没有默认构造函数,它对每个数据成员进行值初始化;所以bp->stuff 被初始化为零。又是内存泄露了。

如果类有一个默认构造函数,那么默认初始化和值初始化将是相同的;两者都会调用构造函数。

【讨论】:

    【解决方案2】:
    int _tmain(int argc, _TCHAR* argv[])
    {
        A a; // creates a local automatic variable of type A
        A b(); // See Most Vexing Parse
        A* ap = new A; // creates a new object of type A on the heap using the default constructor (which the compiler implements for you since you didn't declare one)
        A* bp = new A(); // creates a new object of type A on the heap using value initialization (effectively the same as above).
    }
    

    Most Vexing Parse

    一般来说,您会在绝大多数时间使用A a;A b(); 不声明对象的实例。动态内存版本(也需要相应的deletes),只应在极少数情况下使用,并应包装在智能指针模板中(例如std::unique_ptrstd::shared_ptr)或作为标准容器的一部分(例如std::vectorstd::list)。您必须在堆上创建一些东西并自己管理它是非常罕见的。

    【讨论】:

      猜你喜欢
      • 2014-04-01
      • 1970-01-01
      • 2012-08-09
      • 2021-04-19
      • 2016-09-07
      • 2015-12-14
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多