将头文件中的变量声明为指针和非指针之间的差异

tel*_*dor 0 c++ variables pointers declaration header-files

将头文件中的变量声明为指针或非指针之间有什么区别?我不确定我是否正确理解这些差异.

例如

class MyClass {

private:
    MyOtherClass* moc; // pointer
    MyOtherClass moc2; // no pointer
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,在将变量声明为指针时,我已经提出了以下优点/缺点.

好处:

  • 延迟实例化(没有立即创建对象)
  • 变量存在于堆上,远远大于堆栈
  • 不仅可以使用默认构造函数

缺点:

  • 必须在析构函数中手动删除(顺便说一句.何时这样的非指针变量被破坏?当程序结束?)

还有什么可说的?

Luc*_*ore 5

拥有一个对象表示所有权.它的构成.指针可以表示所有权,但大多数时候它们意味着聚合.

MyClassmoc2和使用moc.

让你的决定考虑类的设计以及它们如何相互作用,而不是基于指针与对象的争论.每个MyClass对象都有自己的moc2成员,但多个MyClass对象可以moc在它们之间共享.

关于您提出的优点/缺点:

好处:

  • 延迟实例化(没有立即创建对象) - 指针本身被初始化 - 记住你的成员是一个指针而不是一个对象.但我会告诉你,你有时需要这个,虽然它大部分时间都是代码味道.
  • 变量存在于堆上,它比堆栈大得多 - 不一定 - 你也可以拥有一个指向基于堆栈的变量的指针.此外,如果MyClass在堆上分配了一个对象,那么也是如此moc2.
  • 不仅可以使用默认构造函数 - 非问题,您可以在两种情况下使用任何构造函数(请参阅initialization-lists).

缺点:

  • 必须在析构函数中手动删除(顺便说一句.什么时候这样的非指针变量被破坏?当程序结束?) - 只有MyClass拥有成员 - 它可能是指向其他地方创建的某个对象的指针,所以MyClass不负责管理它.