c ++类定义。属性作为指针?这是正确的方法吗?

时间:2012-11-13 04:22:04

标签: c++ class pointers reference

  

可能重复:
  C++ - when should I use a pointer member in a class

我已经使用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();
};

5 个答案:

答案 0 :(得分:3)

我通常喜欢在对象很大时使用指针,并在它很小时使用堆栈对象。指针允许一些事情,例如惰性初始化和前向声明,而堆栈对象减少了创建自己的复制构造函数所需的可能性,并且不得不担心在析构函数中显式地销毁对象。 (虽然,您可以使用共享指针类型对象为您执行此操作)此外,堆栈对象通常访问速度更快,但在大多数情况下,这不应该是选择一个而不是另一个的原因申请可以忽略不计。

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

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

答案 1 :(得分:1)

  1. 不要使用指针,除非你绝对需要它们
  2. 因为在不经常使用时容易出错
  3. 更好的是,如果您不打算让所有人对您的const &
  4. 进行更改,请返回Investment

答案 2 :(得分:1)

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

Investment* investment;
// or
Investment investment;

每个人都有利弊。

不使用指针:

  • 省去了担心创建和删除投资对象的麻烦 - 尽管如果有用,您可以在初始化列表中明确选择投资构造函数。
  • 表示投资对象在主机对象中分配,这可以节省堆分配和释放。这可能会提高内存效率并且表现更好。

使用指针:

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

这在很大程度上取决于该计划。有时最好避免直接暴露数据成员,而是在包含对象中提供更高级别的逻辑功能,以便对投资进行一些工作:这样您就可以在投资对象周围维护额外的不变量 - 即您可以控制,协调和监控何时以及如何使用它。其他时候暴露它可能更实际。

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

答案 3 :(得分:0)

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

    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
        }
    

答案 4 :(得分:0)

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