2

如果这个问题已经被问过,我很抱歉,但我找不到同样的问题。请将我重定向到相关问题。

#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 个字节。

4

2 回答 2

2
  1. 编译器无法在编译时完全跟踪引用目标。
  2. 因为它需要存储在引用所指的地方。

这是一个非常容易触发未定义行为的类。只需为其创建一个 const 对象并调用 const 成员函数。

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

于 2012-10-18T08:08:52.797 回答
1

我可以回答 sizeof 和 address 部分。

引用可以看作是语法较轻的指针,因此它需要与指针等效的存储空间(此处为 4 个字节)。

引用仅在其初始化期间被修改ref(a)。在其初始化之后,对引用的任何操作都是在被引用的值上执行的,因此&ref给出被引用值的地址而不是引用本身。所以&a == &ref完全有道理。

于 2012-10-18T08:14:35.327 回答