引用数据成员更改const函数内的另一个数据成员

时间:2012-10-18 07:51:10

标签: c++ reference const

如果已经提出这个问题,我道歉,但我找不到相同的问题。 请将我重定向到相关问题。

#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成员函数内的类的数据成员,该引用变量只是同一个类的一部分。

我有两个问题 -

  1. 为什么不抛出编译错误。

  2. 我打印两个变量的地址,并且正如预期的那样都显示相同的地址,但实例的sizeof()仍然显示为8个字节的大小。

2 个答案:

答案 0 :(得分:2)

  1. 编译器无法在编译时完全跟踪引用目标。
  2. 因为它需要存储在引用所指的位置。
  3. 这是一个很容易触发未定义行为的类。只需创建它的const对象并调用const成员函数。

    C ++支持mutable关键字,用于支持在const成员函数中更改对象位的机制。

答案 1 :(得分:1)

我可以回答sizeof和地址部分。

可以看到引用类似于具有较轻语法的指针,因此它需要与指针相当的存储空间(此处为4个字节)。

仅在初始化ref(a)期间修改引用。在初始化之后,对引用的值执行对引用的任何操作,因此&ref给出引用值的地址而不是引用本身。所以&a == &ref非常有意义。