Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以返回参考?_C++ - Fatal编程技术网

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本身的寿命比存储返回引用的位置要长

这没有什么坏处

邪恶的事情是另一个:你允许任何可以cal
get()
的人(实际上每个人)完全访问
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++中非常常见的事情。