当"int&i"是类的属性时发生了什么
what happened while `int &i` is a property of class
当int &i
是类的属性时发生了什么?构造函数做了什么?堆栈和内存?我写了一个演示来解释这个问题。我在我的电脑上运行它,得到某一次运行的结果:
45 2000572096
演示是:
#include <iostream>
class A{
public:
A(int a, int b):i1(a),i2(b){};
public:
int i1;
int &i2;
};
int main()
{
A a(45,60);
std::cout << a.i1 << " " << a.i2 << std::endl;
return 0;
}
作为引用的类成员变量只能被构造,而不能被赋值。此代码根据构造函数参数int b
构造变量int &i2
。
参数很像局部变量,它们在调用后就不再存在了。
因此,i2现在指的是一个已经不存在的整数。这是未定义的。
这就是为什么你会得到奇怪的输出。
顺便说一句,如果你好奇的话,引用通常被实现为指针,并隐藏地使用运算符的地址。因此,引用内部的指针现在可能指向堆栈上参数int b的位置,但正如我上面所说,它已经不在了,因此如果访问引用,将导致未定义的行为。你可以在网上搜索"返回对局部变量的引用"来了解更多信息。
这是未定义的行为,因为i2
引用的是一个局部变量(b
),该变量在构造函数完成后被销毁。
相关文章:
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- 'vertexPosition_modelspace'属性到底是什么
- 指示 Qi 变换属性失败的适当方法是什么?
- 将提升属性树 (ptree) 序列化为向量的最快方法是什么
- C 中的属性列表中应该使用什么
- 对于属性上的 NOTIFY 信号,如果我给它一个参数有什么区别?
- C 11中成员函数的值类别属性是什么?
- 如何从C 中的HDF5文件中读取属性名称和数据集名称,在这里我不知道HDF5文件中存在什么属性
- 使用 CDT 从头文件中获取属性定义的节点元素是什么
- PE 中的"Isolated Image"属性是什么?
- 在C++中,继承超类的正确方法是什么,以便它们的子类在超级类和子类中没有重复的属性?
- 保存邮件正文的 MAPI 属性是什么
- 要设置动画的QPropertyAnimation中支持什么属性
- COM属性方法和常规接口方法之间的区别是什么
- 标准说实现在发现未知属性时应该做什么
- Qt:我什么时候可以从qtcreator访问动态属性
- BOOST中的属性映射是什么
- 当"int&i"是类的属性时发生了什么
- 使用glVertexAttribPointer时,应该为gl_Normal属性使用什么索引
- pthreads 之间共享和不共享的属性是什么