请考虑以下代码段:
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.
}
为什么私人&#39;成员访问在主要内部和内部定义内部区别对待?不是&#39; c&#39;在main()中声明与&#39;其他&#39;相同。被接受作为论点?为什么这些表现不一样?
答案 0 :(得分:3)
访问修饰符是特定于类的,而不是特定于对象的 1 :
参见标准(强调我的):
11会员访问控制
班级的成员可以是
-
的成员和朋友使用。long
;也就是说,它的名称只能由声明它的类...
private
cor
有效,因为return x+other.x
也有类型other
。
答案 1 :(得分:1)
其他工作原因是您为类型cor定义了operator +,在类cor(public或private)的所有方法中,您可以调用私有和公共成员。在此运算符中,其他变量属于同一类型,因此根据此规则,您可以调用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[])
^