我不明白我在这里提供的代码中提到的两行。为什么我需要使用int*
?我如何访问私有变量?我不确定我用这两行做什么。请详细解释。
问题线:
int *p = (int *) &s;
*p=10;
主要代码:
#include <iostream>
using namespace std;
class sample {
private:
int a;
public:
void function () {
a=5;
}
void printA () {
cout<<"value is "<<a<<endl;
}
};
int main () {
sample s;
s.function();
s.printA();
int *p = (int *) &s;
*p=10;
s.printA();
}
答案 0 :(得分:5)
使用(int*)
有一个非常糟糕的主意。您正在使用一个不是int的类作为int。这很糟糕。
你不能访问私人会员,你不应该这样,这就是他们私密的原因。
int *p = (int *) &s;
*p=10;
这意味着,您有一个类型为s
的对象sample
,并且它有一个数据成员int a;
。你写的是有效的,因为a
碰巧出现在课程的开头。
在某些情况下,类的布局是有保证的,您可以在这里阅读:
答案 1 :(得分:2)
首先,请不要这样做。
您正在利用类sample
的内存布局。第一个成员是int
,它位于类的内存空间的开头。
尝试在int
之前添加另一个a
,您会看到a未被更改。
答案 2 :(得分:1)
此代码试图通过在指针转换的帮助下打破类强加的封装来访问类a
中的成员sample
。它是不安全,因为它取决于类成员的内存布局。
假设成员a
将位于sample
对象的起始位置,因此获取对象的地址并将其转换为int*
将使其成为可以访问第一个int
成员。
这是有效的,因为a
确实处于第一个位置,但这不能得到保证,并且由于填充/对齐和继承层次结构的原因而不适用于其他成员。这种代码很危险。
如果需要,您应该拥有私有成员的访问者/变更者,而不是编写这种代码来访问它们。