当我从公共成员函数返回引用时,为什么我可以公开私有成员?

时间:2011-01-16 17:13:45

标签: c++ function return-type

在代码片段中,我可以访问类范围外的私有成员变量。虽然不应该这样做,为什么在这种情况下允许?通过引用接收返回的私有变量是不好的做法?

#include <iostream>
#include <cstdlib>

class foo
{
    int x;
    public:
        foo(int a):x(a){}
        int methodOne() { return x; }
        int& methodTwo() { return x; }
};

int main()
{
    foo obj(10);
    int& x = obj.methodTwo();
    x = 20;              // With this statement, modifying the state of obj::x

    std::cout << obj.methodOne();
    getchar();
    return 0;
}

关于这种方法,返回类型传达了什么?而且我什么时候应该有这种类型的返回类型?

int& methodTwo() { return x; }

PS:如果主题行含糊不清,我很抱歉。有人可以将其更改为与此处相关的内容。谢谢。

5 个答案:

答案 0 :(得分:19)

private并不意味着“此内存只能由成员函数修改” - 这意味着“直接尝试访问此变量将导致编译错误”。当您公开对象的引用时,您已经有效地公开了该对象。

  

通过引用接收返回的私有变量是不好的做法吗?

不,这取决于你想要什么。 std::vector<t>::operator[]之类的内容如果无法返回非const引用,则很难实现:)如果要返回引用并且不希望客户端能够修改它,只需将其设为const参考。

答案 1 :(得分:3)

返回私有成员作为参考是完全有效的,编写类的程序员有责任仔细选择是否允许这样做。 This link举例说明了这一点。

答案 2 :(得分:2)

此代码:

 int& methodTwo() { return x; }

表示函数将引用返回到整数。就像通过引用函数传递值一样,如果methodTwo的返回值发生变化,methodTwo返回的值也会变化。在这种情况下,类字段x

在您编写的代码中,这意味着您允许私有变量x转义其范围(类字段)并在外部世界中传递。这当然是一种不好的做法(因为x可以以可能破坏类foo的方式进行更改,但这肯定是允许的。

请记住 public / private / protected仅限编译时。一旦您的应用程序被编译,私有字段就位于公共字段旁边,并且没有防止修改的保护。对于像C#和Java这样的托管语言也是如此。

通常应该避免返回引用,因为在调用构造函数/析构函数时,它很难理解。但是,返回引用可能会更快。如果你的方法返回一个巨大的结构类型,那么返回一个对同一结构类型的const引用应该只需要四到八个字节(一个指向该对象的指针)。但是,有更好的方法来优化这类事情。

答案 3 :(得分:0)

像多诺托说的那样,它完全有效。拥有私有成员的想法是禁止其他类/函数访问类的私有成员,而无需您的许可。如果您很乐意创建一个函数来允许其他类/函数访问您的私有成员,那么编译器就没有任何反对意见: - )

通常,拥有私有成员并拥有 get 函数以允许其他类/函数获取函数的值是有用的,但只有类才能更改它。

答案 4 :(得分:-1)

  

我能够访问类范围之外的私有成员变量

如果您引用x中的main(),那么这与x中声明的class foo不同。如果您尝试访问obj.x,那么编译器肯定会抱怨。

  

通过引用接收返回的私有变量是不好的做法?

“接收”对私人会员的引用并没有错。但是,提供私人会员的提法会使其声称私有无用。通过将变量声明为私有成员,您只能将对该成员的访问权限限制为类'methods。

  

关于这种方法,返回类型传达了什么?而且我什么时候应该有这种类型的返回类型?

不确定您指的是哪种方法?!?!?!

相关问题