c++类定义.属性作为指针?这是正确的方式

c++ class defining. attributes as pointers? which is the correct way?

本文关键字:方式 指针 定义 属性 c++      更新时间:2023-10-16

可能的重复:
C++-何时应该在类中使用指针成员

我已经使用c++多年了,但我仍然有一些问题没有回答。。我正在定义一个c++类,但我对这个有一些疑问

问题1:我应该使用指针存储投资还是不使用?

Investment* investment;
// or
Investment investment;

问题2:为什么?

问题3:如果我使用Investment investment;,我应该以这种方式返回引用Investment & getInvestment();吗?

我知道我的代码是这样工作的,但我想知道这样做的有效方法。。

代码如下:

class Urgency
{
private:
Investment* investment;
public:
Urgency(Investment* investment);
~Urgency(void);
Investment* getInvestment();
};

我通常更喜欢在对象较大时使用指针,而在对象较小时使用堆栈对象。指针允许一些事情,如惰性初始化和前向声明,而堆栈对象减少了创建自己的复制构造函数所需的可能的引擎盖,并且不必担心在析构函数中显式破坏对象。(不过,您可以使用共享指针类型的对象来为您做到这一点)此外,堆栈对象通常访问速度更快,但在大多数情况下,这不应该成为选择其中一个而不是另一个的原因,因为大多数应用程序中的差异可以忽略不计。

参考您的代码,您通常会返回一个const Investment &,以便不允许直接修改Investment对象。如上所述,如果使用原始指针,则应创建一个复制构造函数和一个析构函数,以正确管理对象上的内存。对于指针对象,您通常会再次返回const Investment *,以消除外部调用程序直接修改对象的能力。

当您返回常量正确的Investment对象时,请注意函数是如何在Investment类中声明的。如果您只有Investment::getNumShares(),那么将无法使用常量引用或常量指针访问函数。要解决此问题,请将所有不修改对象的成员函数标记为常量,如Investment::getNumShares() const

  1. 除非绝对需要,否则不要使用指针
  2. 因为如果不小心使用,它们很容易出错
  3. 更好的是,如果您不打算让每个人在您的Investment中进行更改,请返回const &

问题1/2:我应该使用指针存储投资还是不使用?/为什么?

Investment* investment;
// or
Investment investment;

各有利弊。

不使用指针:

  • 省去了创建和删除投资对象的麻烦-尽管如果有用,您可以在初始化列表中显式选择投资构造函数
  • 意味着Investment对象是在主机对象中分配的,这可以保存堆分配和释放。这可能会提高内存效率,并且性能更好

使用指针:

  • 允许您使用惰性初始化:您可以推迟创建Investment对象,直到包含对象真正需要它,然后可能在不再需要时再次删除它。这种对寿命的手动控制可用于微调内存使用情况。当指针没有指向实际投资时,在指针中存储NULL/0是帮助跟踪这一情况的常见做法
  • 意味着您可以将投资对象的所有权授予对象外部的代码。。。他们可以继续使用它,并在适当的时候删除它
  • 这意味着您必须小心地创建一个复制构造函数,并小心地处理构造函数中的异常。智能指针可能有助于解决这些问题
  • 意味着您可以分配从Investment派生的类的实例,并通过同一指针使用它。这允许您选择适合运行时需求的自定义实现,甚至可以根据需求的不同而改变实现。这种灵活性是面向对象编程和运行时多态性的基石
  • 意味着包含对象的头只需要看到Investment类的前向声明(无论是通过#include还是在同一文件中)。这意味着可以对Investment对象进行更改,而无需强制重新编译只使用包含对象的代码(只需要重新链接包含修改后的Investment实现的对象)。该概念与指向实现的指针或pImpl习语相同,尽管Investment不一定是包含类实现的专用部分,并且可以在程序的其他地方直接独立使用

问题3:如果我使用投资投资;我应该以这种方式返回参考资料吗Investment&getInvestment();?

这在很大程度上取决于程序。有时,最好避免直接公开数据成员,而是在包含对象中提供一个更高级别的逻辑函数,对Investment进行一些工作:这样,您就可以在Investment对象周围维护额外的不变量,即您可以控制、协调和监控它的使用时间和方式。其他时候,曝光它可能更实用

只有当您能够确定您实际上要返回一个Investment对象时,返回引用才是合适的:在指针版本中,如果实现还没有Investment对象,则可能需要创建/new。或者,返回指针意味着您可以向客户端代码返回NULL/0,以表明您还没有投资对象,但您必须确保您的类和客户端代码了解谁将拥有持续的所有权(即对投资对象delete的权利/义务),并且在另一方的deleted it之后,任何一方都不会试图使用投资。

  • 通过使用指针,您可以选择何时分配内存删除它,而正常声明具有自动存储功能。要回答这个问题,实际上取决于你正在编写的程序类型和个人喜好。

    class Foo
    {
    Foo* Obj; //choose when to allocate this object, dynamically allocated
    Foo Obj2; //automatic, runs through the life of the object.
    }
    
  • 您可以,但分配地址的另一种解决方案是使用带参数的void函数,该函数设置对象的引用。

    void GetVar(int *Address_Holder)
    {
    //assign address
    }
    

如果要控制何时将内存分配给对象以及何时删除对象,请使用指针。如果您有一个巨大的对象,那么使用指针作为向函数传递指针将比传递对象本身更快(或者u可以通过引用传递)。在任何其他情况下,使用对象而不是指针都是可取的,因为使用指针非常容易出错。