C++ 在类中访问私有成员变量:为什么这样做?
考虑以下代码段:C++ 在类中访问私有成员变量:为什么这样做?,c++,C++,考虑以下代码段: 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;
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.
}
类cor{
int x;
公众:
cor();
文书主任(内部助理){
x=a;
}
int运算符+(cor其他){
返回x+other.x;//允许。'other'访问私有成员
}
void getx(){
cout访问修饰符是特定于类的,而不是特定于对象的1:
请参见标准(我的重点):
11个成员访问控制
类的成员可以是
-private
;也就是说,它的名称只能由声明它的类的成员和朋友使用
在cor
return x+other.x
有效,因为other
也有类型cor
尽管有一些特殊的规则,正如@ChristianHackl评论的那样
因为您在cor类(public或private)的所有方法中为类型cor定义了运算符+,所以其他方法也适用您可以调用private和public成员。在此运算符中,其他变量的类型相同,因此根据此规则,您可以调用other.x。在main函数中,您超出此范围,因此这是无法工作的原因
另一件事(仅供参考)是对两个对象执行+运算,结果返回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;
}
如果稍微修改一下这个源代码
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;
}
这不是一个私有变量的全部要点吗?你应该阅读更多关于类和包封的内容,这些内容是在每本C++书籍甚至在线教程中都包含的基本材料。你不能期望在不阅读大量教学材料的情况下理解编程语言。是的。但是在C中声明的“C”只是另一个对象,比如“其他”。“other”可以访问私有变量,而“c”不能。这让我很困惑。@a你有没有想过为什么有3个访问说明符(private、protected、public)在C++中?在这里进行探索。但是,对于<代码>保护< /C>访问,这不是严格的。标准定义了<代码>保护< /代码> Access(参见11.4)受保护成员访问(Access Access)的几个特殊规则。例如,以下访问将不起作用,因为Access不通过<代码> < <代码> >:代码>类基础。{protected:intx;};派生类:公共基{void f(Base&b){b.x=0;};
。
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[])
^