通过引用传递的行为及其范围
Behaviour of pass by reference and its scope
在下面的代码中,变量a
通过引用传递给构造函数,由参数x
接收。然后x
作为对属性的引用传递。然后使用值 3 初始化该属性。程序在运行时输出值 3。
我的问题
程序不应该崩溃或显示 2 吗,因为在调用构造函数之后 x 应该超出范围并被释放,其地址应该被释放。尝试写入它应该会违反内存访问。然而,在这种情况下,x仍然在程序控制中,保存着'a'的地址
。这是有效的 c++ 行为还是我错过了什么?
#include <iostream>
#include <conio.h>
using namespace std;
class myclass {
public:
int& attribute;
myclass(int& x):attribute(x) {
}
void func() {
attribute = 3;
}
};
int main() {
int a = 2;
myclass obj(a);
obj.func();
std::cout << a;
_getch();
}
不,这个程序很好。attribute
是对a
的引用。x
已经超出范围的事实既不在这里也不在那里。
如果您将代码更改为
myclass(int x):attribute(x)
那将是一个问题。
程序逐行
的行为变量"a"初始化为值 2
int a = 2;
使用变量初始化obj
a
myclass obj(a);
首先x
成为对a
的引用,然后attribute
成为对x
的引用。因此,attribute
成为对a
的引用,它目前的值为 2。
myclass(int& x):attribute(x) {}
obj
的呼叫func()
obj.func();
attribute
是对a
的引用。 "属性"和"a"都更改为 3。将它们视为相同, 单个变量,仅具有差异别名。 这意味着,此时,attribute
和a
指的是同一个变量, 并且可以互换使用。
void func() {
attribute = 3;
}
相关文章:
- 如果非动态变量被指针引用,何时超出范围?
- 基于范围的 for 循环unordered_map和引用
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 通过引用返回的变量的范围
- 在 c++ 中基于范围的 for 循环中使用引用作为控制变量
- C++引用和退出范围
- C++ 中的引用范围是什么?
- 是否未定义将对函数范围变量的引用作为值返回
- 使用基于范围的for循环取消对矢量指针的引用
- 为什么基于范围的 for 循环中的结构化绑定只是一个副本而不是引用?
- 对象超出范围后,引用成员设置为 0
- 无法取消引用超出范围的向量迭代器 - 有什么问题?
- 我们如何在范围消失时通过引用返回变量
- 通过引用传递的行为及其范围
- 指针范围问题和返回类中封装的指针向量内的指针引用
- 使用对范围中的矢量元素的引用
- 有没有办法使用基于范围的迭代器来迭代对指针列表值的引用?
- 变量循环范围会导致返回局部变量的地址引用
- 我们可以在范围循环中使用引用(而不是指针)上的删除