c++中指针类型转换的解释
Explanation of typecasting of pointer in C++
我不理解我在这里提供的代码中下面提到的两行。为什么我需要使用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
确实在第一个位置,但这不能保证,并且由于填充/对齐和继承层次结构的情况下,对其他成员不起作用。这种类型的代码很危险。
如果需要,您应该为私有成员设置访问器/变量,而不是编写这种代码来访问它们。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将Windows产品类型转换为名称?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 事件系统:使用类型转换或联合进行继承
- c++中指针类型转换的解释
- 重新解释类型转换和静态类型转换的概念