C ++中指针的类型转换说明

时间:2014-06-24 10:51:56

标签: c++ class casting private encapsulation

我不明白我在这里提供的代码中提到的两行。为什么我需要使用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();
}

3 个答案:

答案 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确实处于第一个位置,但这不能得到保证,并且由于填充/对齐和继承层次结构的原因而不适用于其他成员。这种代码很危险。

如果需要,您应该拥有私有成员的访问者/变更者,而不是编写这种代码来访问它们。