c++中指针类型转换的解释

Explanation of typecasting of pointer in C++

本文关键字:解释 类型转换 指针 c++      更新时间:2023-10-16

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

使用(int*)是一个非常非常糟糕的主意。你正在使用一个类,它不是整型,而是整型。

你不能访问私有成员,也不应该访问,这就是为什么它们是私有的。

int *p = (int *) &s;  
*p=10;

这意味着,您有一个类型为sample的对象s,并且它有一个数据成员int a;。你所写的是有效的,因为a恰好在课程的开始。

在某些情况下,类的布局是有保证的,你可以在这里阅读:

  • c++中有哪些POD类型?
  • 什么是聚合和pod,它们是如何/为什么特别的?

首先,请不要这样做。

您正在利用类sample的内存布局。第一个成员是int,它驻留在类的内存空间的开始。

尝试在a之前添加另一个int,您会看到a没有改变。

这段代码试图访问sample类中的成员a,方法是在指针强制转换的帮助下打破类强加的封装。是不安全的,因为它取决于类成员的内存布局。

假设成员a将位于sample对象的起始位置,因此获取对象的地址并将其强制转换为int*将使访问第一个int成员成为可能。

这是有效的,因为a确实在第一个位置,但这不能保证,并且由于填充/对齐和继承层次结构的情况下,对其他成员不起作用。这种类型的代码很危险。

如果需要,您应该为私有成员设置访问器/变量,而不是编写这种代码来访问它们。