可以返回引用吗?

时间:2011-09-16 09:47:02

标签: c++

我有类似

的东西
class X
{
    private:
    someclass obj;

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

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

6 个答案:

答案 0 :(得分:7)

如果您在代码中传递非const引用,则可以从类外部修改obj。如果您希望无法从外部X更改它,则必须返回const ref,

const someclass& get();

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

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

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

答案 1 :(得分:6)

这不是邪恶的。它应该如何完成:您可以返回对内部数据成员的引用。如果你不想要副本,你不需要通过指针或值来做:引用是为了做到这一点。

如果您不希望修改它,则必须向内部数据成员返回“const”引用:

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

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

答案 2 :(得分:5)

没关系。

只考虑使引用保持不变,或至少制作两个get()方法(一个用于普通方法,一个用于常量对象)。

答案 3 :(得分:2)

您所做的是技术上正确的:您可以参考用于更改它的X的内部部分。

唯一需要注意的是X本身的寿命比存储返回参考的地方长。

这没有任何邪恶

邪恶的事情是另一个:你允许obj完全访问任何能够get()(几乎每个人)的人。你发挥公共obj本身就是一种效果,让人觉得它仍然是私密的。

如果你接受每个人都可以修改obj ...只需将其公开。 如果您想要“某人”可以,请将其保密,将某人设为朋友。 如果您希望任何人以只读方式访问obj,请返回一个const&从const函数开始。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

我认为这很邪恶。如果obj的包含实例将被销毁,并且您无法强制X的调用者将此考虑在内,则X::get()将被销毁:

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

肯定是邪恶的; - )

通过引用返回的唯一安全事项是成员函数中的*this或者首先通过引用获取的参数。

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