可以返回一个引用吗?

Is it ok to return a reference?

本文关键字:一个 引用 返回      更新时间:2023-10-16

比如

class X
{
    private:
    someclass obj;
    public:
    someclass& get()
    {
        return obj;
    }
};

我不想让obj公开,所以我得到它的引用,并将其传递给函数。这是一个好的/ok的做法还是彻头彻尾的邪恶?

如果你在你的代码中传递一个非const引用,那么obj可以从你的类外部修改。如果您希望不能从X外部更改它,则必须返回const ref

const someclass& get();

注意,在这种情况下,值得在函数名

之后添加另一个const。
const someclass& get() const;

告诉编译器在X上调用get()不会改变其内部状态。(这不是你的例子)

这并不邪恶。应该是这样做的:您可以返回对内部数据成员的引用。如果不需要复制,则不需要通过指针或值来实现:引用就是这样做的。

如果你不希望它被修改,你必须返回一个"const"引用到你的内部数据成员:

public:
const someclass & get() const
{
    return obj;
}

请注意,我随后在get()方法的末尾添加了const,以指示使用该方法不会修改类。

没关系。

考虑使用引用常量,或者至少使用两个get()方法(一个用于普通对象,一个用于常量对象)。

你所做的在技术上是正确的:你得到一个X的内部部分的引用,你用它来改变它。

唯一需要注意的是,X本身的寿命比存储返回引用的位置的寿命长。

这没有什么邪恶的

另一件坏事是:你允许任何可以调用get()的人(几乎所有人)完全访问obj。你实际上是在公开obj本身,给人一种它仍然是私有的错觉。

如果你接受每个人都可以修改obj…把它公之于众。如果你想让"某人"可以,保持隐私,并把某人加为好友。如果您希望任何人以只读方式访问obj…返回一个常量&

许多书籍建议不要直接访问变量,而使用GET/SET方法,如:

class SetandGet
{
public:
    void Set(int x){
        TheVariable = x;
    }
    int Get(){
        return TheVariable;
    }
private:
    int TheVariable;
}

我认为这是邪恶的。当包含X的实例被销毁时,obj将被销毁,并且您没有办法强制X::get()的调用者考虑到这一点:

someclass & evil() {
  X x;
  return x.get();
}

肯定是邪恶的;-)

通过引用返回的唯一安全的东西是成员函数中的*this或首先通过引用获得的实参。

如果obj足够小,按值返回,否则实现某种方式共享其所有权。提振。SharedPtr,现在是c++标准的一部分,可能会有所帮助。