如果已经提出这个问题,我道歉,但我找不到相同的问题。 请将我重定向到相关问题。
#include<iostream>
using namespace std;
class ABC
{
int a;
int &ref;
public:
ABC(int arg = 0):a(arg), ref(a){}
void mutate_func(int arg) const {
ref = arg;
}
void print_val() {
cout << endl << &a << "\t" << &ref;
cout << endl << a << "\t" << ref;
}
};
int main()
{
ABC abc_obj(5);
cout << sizeof(abc_obj);
abc_obj.print_val();
abc_obj.mutate_func(10);
abc_obj.print_val();
return 0;
}
我试图通过引用变量修改const成员函数内的类的数据成员,该引用变量只是同一个类的一部分。
我有两个问题 -
为什么不抛出编译错误。
我打印两个变量的地址,并且正如预期的那样都显示相同的地址,但实例的sizeof()仍然显示为8个字节的大小。
答案 0 :(得分:2)
这是一个很容易触发未定义行为的类。只需创建它的const对象并调用const成员函数。
C ++支持mutable
关键字,用于支持在const成员函数中更改对象位的机制。
答案 1 :(得分:1)
我可以回答sizeof和地址部分。
可以看到引用类似于具有较轻语法的指针,因此它需要与指针相当的存储空间(此处为4个字节)。
仅在初始化ref(a)
期间修改引用。在初始化之后,对引用的值执行对引用的任何操作,因此&ref
给出引用值的地址而不是引用本身。所以&a == &ref
非常有意义。