在代码片段中,我可以访问类范围外的私有成员变量。虽然不应该这样做,为什么在这种情况下允许?通过引用接收返回的私有变量是不好的做法?
#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:如果主题行含糊不清,我很抱歉。有人可以将其更改为与此处相关的内容。谢谢。
答案 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。
关于这种方法,返回类型传达了什么?而且我什么时候应该有这种类型的返回类型?
不确定您指的是哪种方法?!?!?!