可以返回一个引用吗?
Is it ok to return a reference?
比如
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++标准的一部分,可能会有所帮助。
- 返回一个引用C++中另一个类对象的对象的有效方法
- 返回一个C++引用变量 VS 返回一个变量
- 有没有办法重写一个返回指向 istringstream 的指针的函数,而不是返回一个引用?
- 如何使用只有一个引用参数的可变长度参数列表
- 为什么重载 ostream 的运算符<<需要一个引用"&"?
- C++ const-cast 一个引用
- 嵌套绑定到成员,需要一个指针,得到了一个引用.做什么
- r-Rcpp可以公开一个引用同一类的C++类方法
- 有没有办法获取对 MFC 对话框中所有子窗口或控件的引用,因为我有一个引用该控件的 CWnd 对象
- C++一个引用的多个转发:首先复制,然后移动
- 在C++中,我是否可以声明一个引用,以表明没有任何内容会修改它
- 将一个对象传递给一个引用函数,即面试测试
- 需要解释才能理解一个引用的例子
- 一个好的C++编译器会优化一个引用吗
- 我有一个引用,想调用一个需要 boost::shared_ptr 的函数
- 在C++中有一个引用成员有什么问题?
- *return如何隐式返回一个引用
- 为什么我得到一个未对齐指针的警告,而不是一个引用
- 是否可以在不同位置为一个引用分配不同的值
- 编写一个引用类型的函数,用作l值来处理它的r值