我已经使用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();
};
答案 0 :(得分:3)
我通常喜欢在对象很大时使用指针,并在它很小时使用堆栈对象。指针允许一些事情,例如惰性初始化和前向声明,而堆栈对象减少了创建自己的复制构造函数所需的可能性,并且不得不担心在析构函数中显式地销毁对象。 (虽然,您可以使用共享指针类型对象为您执行此操作)此外,堆栈对象通常访问速度更快,但在大多数情况下,这不应该是选择一个而不是另一个的原因申请可以忽略不计。
在参考您的代码时,您通常会返回const Investment &
,以便不允许直接修改Investment对象。如上所述,如果使用原始指针,则应创建一个复制构造函数和析构函数,以正确管理对象上的内存。使用指针对象,您通常会再次返回const Investment *
,以移除外部调用者直接修改对象的能力。
注意返回const正确的投资对象时如何在Investment类中声明函数。如果您只是Investment::getNumShares()
,则无法使用const引用或const指针访问该函数。要解决此问题,请将不修改对象的所有成员函数标记为常量,例如Investment::getNumShares() const
答案 1 :(得分:1)
const &
Investment
醇>
答案 2 :(得分:1)
问题1/2:我应该使用指针存储投资还是不存在? /为什么?
Investment* investment;
// or
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)
如果要控制何时为对象分配内存以及何时删除它,请使用指针。如果你有大尺寸的对象,那么使用指针作为传递指向函数的指针将比传递对象本身更快(或者你可以通过引用传递)。在任何其他情况下,建议使用对象而不是指针,因为使用指针非常容易出错。