C++ 在常量函数中更改另一个数据成员的引用数据成员

C++ 在常量函数中更改另一个数据成员的引用数据成员,c++,reference,constants,C++,Reference,Constants,如果已经有人问过这个问题,我很抱歉,但是我找不到相同的问题。 请让我转到相关问题 #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; } voi

如果已经有人问过这个问题,我很抱歉,但是我找不到相同的问题。 请让我转到相关问题

#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;
}
#包括
使用名称空间std;
ABC班
{
INTA;
int&ref;
公众:
ABC(int arg=0):a(arg),ref(a){
void mutate_func(int arg)常量{
ref=arg;
}
无效打印值(){
库特
  • 编译器无法在编译时完全跟踪引用目标
  • 因为它需要存储在引用引用的地方
  • 这是一个很容易触发未定义行为的类。只需创建一个const对象并调用const成员函数


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

    我可以回答sizeof和address部分

    一个引用可以被看作是一个具有更轻语法的指针,因此它需要相当于指针的存储空间(这里是4个字节)


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

    可能重复@Andrey这有点不同,因为引用的值也是引用的一部分同一个对象。编译器不知道编译
    mutate_func
    @Andrey这就是为什么对象大小为8字节的原因吗?是的。你可以期待编译器会如此聪明地优化
    ref
    ,但事实并非如此。请参见Johannes Schaub的答案。那么,引用的原始内存会发生什么情况呢指针遇到的这种内存泄漏问题??内存泄漏仅在分配数据而不是稍后删除数据时出现(例如使用
    new
    delete
    )。如果您只指向数据,则不可能发生泄漏。引用引用了一些数据,但此处没有分配。引用使用的空间包含引用数据的位置,而没有其他内容。感谢Johannes,这很有用。我知道可变关键字。但我想知道是否使用引用来更改内部的datamember常量函数类的黑客行为???是否有一些运行时检查??