【问题标题】:A reference data-member changing another data member inside a const function引用数据成员更改 const 函数内的另一个数据成员
【发布时间】:2012-10-18 07:51:10
【问题描述】:

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

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

【问题讨论】:

  • @Andrey 这有点不同,因为被引用的值也是同一个对象的一部分。
  • 编译器在编译mutate_func时无法知道这一点
  • @Andrey 这就是对象大小为 8 字节的原因吗??
  • 是的。您可以期望编译器非常聪明地优化ref,但事实并非如此。请参阅 Johannes Schaub 的答案。

标签: c++ reference constants


【解决方案1】:
  1. 编译器无法在编译时完全跟踪引用目标。
  2. 因为它需要存储在引用所指的某个地方。

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

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

【讨论】:

  • 感谢 Johannes,这很有用。我知道 mutable 关键字。但我想知道是不是使用引用来更改 const 函数内的数据成员是一种黑客行为???不是有一些运行时检查吗??
【解决方案2】:

我可以回答 sizeof 和 address 部分。

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

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

【讨论】:

  • 那么原始的参考记忆会发生什么?这种内存泄漏问题是不是遇到了指针??
  • 内存泄漏仅在您分配数据而不是稍后删除时出现(例如使用newdelete)。如果您只是指向数据,则不可能有泄漏。参考引用了一些数据,这里没有分配。引用使用的空间包含引用数据的位置,仅此而已。
猜你喜欢
  • 2021-05-20
  • 1970-01-01
  • 2022-01-10
  • 2021-01-08
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 2011-06-04
相关资源
最近更新 更多