是否可以将对非指针成员变量的引用作为指针返回?

Ran*_*ran 4 c++ pointers memory-management reference smart-pointers

我最近遇到了一些看起来像这样的C++代码:

class SomeObject
{
private:
    // NOT a pointer
    BigObject foobar;

public:
    BigObject * getFoobar() const
    {
        return &foobar;
    }
};
Run Code Online (Sandbox Code Playgroud)

我问程序员为什么他不只是把foobar作为指针,他说这样他就不用担心分配/释放内存了.我问他是否考虑使用一些智能指针,他说这也很有用.

这是不好的做法吗?这似乎非常hackish.

Mik*_*our 6

这是完全合理的,而不是任何"hackish"; 虽然返回引用以指示对象肯定存在可能被认为更好.指针可能为null,并可能导致一些人认为他们应该在使用后删除它.

对象必须存在于某个地方,并且作为对象的成员存在通常与其他任何地方存在一样好.通过从拥有它的对象中单独动态分配它来添加额外级别的间接使得代码效率降低,并增加了确保正确释放它的负担.

当然,如果成员函数const返回非const引用或指向成员的指针,则该成员函数不能.这是使其成为成员的另一个优点:const限定符SomeObject也适用于其成员,但不适用于它只有指针的任何对象.

唯一的危险是当某人仍有指针或引用它时,该对象可能会被销毁; 但是,无论你如何管理,这种危险仍然存在.如果对象生命周期太复杂而无法管理,智能指针可以在这里提供帮助.