访问类中的私有成员变量:为什么这样做
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和类定义中被区别对待?main((中声明的"c"是否与被接受为参数的"other"相同?为什么这些行为不同?
访问修饰符是特定于类的,而不是特定于对象的1:
见标准(强调矿(:
11会员访问控制
一个类的成员可以是
--
private
;也就是说,它的名称只能由声明它的类的成员和朋友使用。
cor
内
return x+other.x
是有效的,因为other
也具有类型cor
。
- 不过,正如@ChristianHackl评论的那样,有一些特殊规则
其他工作是因为您为类型cor定义了运算符+,在类cor的所有方法(public或private(中,您可以调用private和public成员。在这个运算符中,其他变量是相同类型的,所以根据这个规则,你可以调用其他.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[])
^
相关文章:
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么C++有不同的变量初始化方式?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 为什么未命名的结构内联变量在每个翻译单元中没有相同的地址?
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 为什么thread_local变量在这里从未初始化?
- 为什么内存屏障依赖于变量?
- 为什么我的变量存在于其范围之外
- 为什么我们再次从结构对象创建结构变量?
- 字符串与字符* 作为类成员变量.为什么要使用字符*
- 如何读取文件内容并将其保存到字符串类型变量?为什么有空白空间
- 将char * *变量赋值给char * const *变量——为什么允许这样做?
- 在类中传递私有变量——为什么不允许这样做
- 引用临时变量 - 为什么编译器没有检测到它?
- 访问类中的私有成员变量:为什么这样做
- 全局变量-C++为什么这种方式很危险
- ' ios_base '的标志都是静态const整型变量.为什么可以用' ios_base::setf() '来