![](/img/trans.png)
[英]const reference public member to private class member - why does it work?
[英]Accessing private member variables within a class: Why does this work?
考虑以下代码片段:
class cor {
int x;
public:
cor();
cor(int a) {
x = a;
}
int operator +(cor other) {
return x + other.x; // Allowed. 'other' accessing a private member
}
void getx() {
cout << x;
}
};
int main() {
cor a(5);
cor b(10);
cor c = a+b;
cout << c.x; // ERROR. 'x' is a private member.
}
为什么在主类和类定义中对“私有”成员访问进行不同的处理? 在main()中声明的'c'是否与作为参数接受的'other'相同? 为什么这些行为有所不同?
访问修饰符是特定于类的,而不是特定于对象的1 :
参见标准(强调我的):
11会员访问控制
班级成员可以是
—
private
; 也就是说,它的名称只能由声明它的类的成员和朋友使用。....
在cor
return x+other.x
是有效的,因为other
也具有类型cor
。
其他工作,因为您为cor类型定义了operator +,因此在cor类的所有方法(公共或私有)中,都可以调用私有成员和公共成员。 在此运算符中,其他变量具有相同的类型,因此根据此规则,您可以调用other.x。 在主要功能中,您不在此范围内,因此这是行不通的原因。
另一件事(仅供参考)是您对两个对象执行+运算,结果返回int,然后调用隐式构造函数
using namespace std;
class cor {
int x;
public:
cor();
cor(int a)
{
cout << "Constructor " << a << endl;
x = a;
}
int operator +(cor other)
{
return x+other.x; // Allowed. 'other' accessing a private member
}
void getx()
{
cout<<x;
}
};
int main(int argc, char *argv[])
{
cor a(5);
cor b(10);
cor c = a+b;
// cout<<c.x; // ERROR. 'x' is a private member.
return 0;
}
结果:
Constructor 5
Constructor 10
Constructor 15
如果稍微修改一下这个来源
using namespace std;
class cor {
int x;
public:
cor();
explicit cor(int a)
{
cout << "Constructor " << a << endl;
x = a;
}
int operator +(cor other)
{
return x+other.x; // Allowed. 'other' accessing a private member
}
void getx()
{
cout<<x;
}
};
int main(int argc, char *argv[])
{
cor a(5);
cor b(10);
cor c = a+b;
// cout<<c.x; // ERROR. 'x' is a private member.
return 0;
}
你会得到
main.cpp: In function 'int main(int, char**)':
main.cpp:37:14: error: conversion from 'int' to non-scalar type 'cor' requested
cor c = a+b;
^
main.cpp: At global scope:
main.cpp:33:5: warning: unused parameter 'argc' [-Wunused-parameter]
int main(int argc, char *argv[])
^
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.