C++ 是否可以返回参考?
我有点像C++ 是否可以返回参考?,c++,C++,我有点像 class X { private: someclass obj; public: someclass& get() { return obj; } }; 我不想公开obj,所以我得到了它的引用,并将其传递给函数。 这是一种好的/正常的做法还是完全邪恶的做法?这不是邪恶。这就是应该如何做的:您可以返回对内部数据成员的引用。如果不需要副本,则不需要通过指针或通过值来完成:引用就是为了实现这一点 如果不希望修改,则
class X
{
private:
someclass obj;
public:
someclass& get()
{
return obj;
}
};
我不想公开obj,所以我得到了它的引用,并将其传递给函数。
这是一种好的/正常的做法还是完全邪恶的做法?这不是邪恶。这就是应该如何做的:您可以返回对内部数据成员的引用。如果不需要副本,则不需要通过指针或通过值来完成:引用就是为了实现这一点 如果不希望修改,则必须返回对内部数据成员的“const”引用:
public:
const someclass & get() const
{
return obj;
}
请注意,然后我在get()方法的末尾添加了const,以指示使用此方法不会修改该类。可以
只考虑制作引用常量,或者至少制作两个代码> Get()/<代码方法(一个为常量,一个用于常量对象).< /P> < P>许多书籍建议不能直接访问变量,并使用GET/SET方法,如:
class SetandGet
{
public:
void Set(int x){
TheVariable = x;
}
int Get(){
return TheVariable;
}
private:
int TheVariable;
}
如果在代码中传递非常量引用,则可以从类外修改
obj
。如果您希望它不能从外部X
更改,则必须返回常量ref
const someclass& get();
注意,在这种情况下,值得在函数名后添加另一个常量
const someclass& get() const;
它告诉编译器对
X
调用get()
不会改变其内部状态。(这不是你的例子) < P>我认为它是邪恶的。当X
的包含实例将被销毁时,code>obj将被销毁,并且您无法强制X::get()
的调用者考虑这一点:
someclass & evil() {
X x;
return x.get();
}
这绝对是邪恶的;-)
通过引用可以安全返回的唯一内容是成员函数中的*this
,或者首先通过引用获取的参数
如果
obj
足够小,则按值返回它,否则实现某种共享其所有权的方式,现在C++的一部分可能有帮助。 你所做的技术上是正确的:你可以引用X的内部部分来改变它。
唯一需要注意的是,X本身的寿命比存储返回引用的位置要长
这没有什么坏处
邪恶的事情是另一个:你允许任何可以calget()
的人(实际上每个人)完全访问obj
。你实际上是在公开对象本身,给人一种它仍然是私人的错觉
如果您接受,每个人都可以修改对象。。。把它公之于众。
如果你想要“某人”可以,保持隐私,让某人成为朋友。
如果您想让任何人以只读方式访问
obj
。。。返回常量函数的常量。请注意:我之所以返回引用,是因为我想修改它。如果您想修改它,并且计划公开一个直接引用,那么您预计保留它的私有性会带来什么好处?修改与替换不同。调用代码不能更改obj
中的引用,只能更改其上的属性。其他代码可能依赖于该引用不改变。如何确保X在需要obj时保持不变?您必须在代码中自己确保X,您仍然可以使用它。你必须小心X寿命使用共享的ptr是更好的解决方案,除非你能证明性能下降是不可接受的。我认为obj应该取决于X寿命。如果你建立了一个代码来获取一个对象的一个成员,然后丢弃这个对象,但是保留一个对其内部成员的引用(不是副本)并使用它,那就是邪恶的。但你能做些什么来实施这一点呢?你所说的对指针来说也是正确的,对于任何一个不受其控制的对象来说,都是一样的。但是如果这是“邪恶的”,那么大多数动态数据结构就不可能存在!除非您对内部变量做了一些奇怪的操作,否则对于返回的引用的生存期没有真正的问题。毕竟,它必须与某些东西联系在一起。@Emilio Garavaglia:指针至少有一点好处,那就是它可以明确地表达出来,但它们仍然让问题悬而未决。显然,如果不使用动态内存,您几乎做不到什么,但是如果您想编写可靠的代码,您应该采用实施正确内存管理的工具和技术。SysDypPTR有帮助,垃圾回收也是如此。为什么要考虑引用<代码> *这个< /代码>特殊情况?假设get()
通过引用返回*此,则X&evil(){X X;return X.get();}
与您的evil函数一样糟糕。同样地,int&evil(){std::vector x(1);return x[0];}
也不好,这是否意味着人们永远不应该使用vector,因为它做了你不赞成的事情?在所有这些情况下,包括你的例子,问题在于写“邪恶”的人,因为他们没有考虑他们所引用的对象的寿命。当然,只要get()。但是如果你的用户这么做,你的用户需要找出他用的是什么语言,因为这是C++中非常常见的事情。