C++ 关于const与引用和虚拟继承的结合

C++ 关于const与引用和虚拟继承的结合,c++,C++,我有以下代码: class A { int x; public: A(int i=25) { x=i; } int& f() const { return x; } }; int main() { A a(15); cout<<a.f(); return 0; } 问题是B在M1和M2中继承了多少次。我认为答案是3,首先是D1,然后是D3,然后是D4,但我不确定。我说的对吗?首先,您的函数可能没有修改常量值,但您试图将常量值

我有以下代码:

class A
{
    int x;
public:
    A(int i=25) { x=i; }
    int& f() const { return x; }
};

int main()
{
    A a(15);
    cout<<a.f();
    return 0;
}

问题是B在M1和M2中继承了多少次。我认为答案是3,首先是D1,然后是D3,然后是D4,但我不确定。我说的对吗?

首先,您的函数可能没有修改常量值,但您试图将常量值作为非常量返回,然后可以修改它。编译器正在保护您。要保持常量,请将其修改为:

const int &f() const {... }


第一个函数返回常量引用,第二个函数按值返回结果。

首先,您的函数可能没有修改常量值,但您尝试将常量值作为非常量返回,然后可以修改。编译器正在保护您。要保持常量,请将其修改为:

const int &f() const {... }


第一个返回常量引用,第二个按值返回结果。

对于第一个问题:

 class A
 {
    int x;
 public:
    A(int i=25) { x=i; }

    const int& f() const { return x; }
    //^^You should add const here
};

int main()
{
    A a(15);
    cout<<a.f();
    return 0;
}

否则,您将从常量成员函数返回非常量引用。另一个选项是简单地按值返回。

对于第一个问题:

 class A
 {
    int x;
 public:
    A(int i=25) { x=i; }

    const int& f() const { return x; }
    //^^You should add const here
};

int main()
{
    A a(15);
    cout<<a.f();
    return 0;
}
否则,您将从常量成员函数返回非常量引用。另一种选择是简单地按值返回。

常量int&f const是一种方法

你说得对,两个都是3次。

const int&f const就是这样


你说得对,两个都是3次。

在非静态常量成员函数中,此类型更改为常量*常量。因此,x的类型被更改为int const&。常量对象不能隐式转换为其类型的非常量版本。

在非静态常量成员函数中,此对象的类型更改为常量*常量。因此,x的类型被更改为int const&。常量对象不能隐式转换为其类型的非常量版本。

您正在返回对类成员的引用。但是,由于您的方法是const,因此不允许您返回非const引用,因为这将允许最终用户在调用const方法后修改您的类状态

考虑这一点:

class A
{
    int x;
public:
    A(int i=25) { x=i; }
    const int& f() const { return x; }
};

int main()
{
    A a(15);
    int &ref = const_cast<int &>(a.f());
    ref = 42;
    // a.x == 42
    return 0;
}
使用const_cast通常是一个坏主意,在这里演示如果允许您从const方法返回非const引用会发生什么

最终用户可以更改类中的属性x,因为调用了const函数,这是不应该发生的


按值返回结果是一种方法,因为它只是一个整数。

您正在返回对类成员的引用。但是,由于您的方法是const,因此不允许您返回非const引用,因为这将允许最终用户在调用const方法后修改您的类状态

考虑这一点:

class A
{
    int x;
public:
    A(int i=25) { x=i; }
    const int& f() const { return x; }
};

int main()
{
    A a(15);
    int &ref = const_cast<int &>(a.f());
    ref = 42;
    // a.x == 42
    return 0;
}
使用const_cast通常是一个坏主意,在这里演示如果允许您从const方法返回非const引用会发生什么

最终用户可以更改类中的属性x,因为调用了const函数,这是不应该发生的


按值返回结果是一种方法,因为它只是一个整数。

您需要返回一个常量引用,const int&。您还应该一次问一个问题。最好在第二部分中提出一个不同的问题。您需要返回一个常量引用,const int&。您还应该一次提出一个问题。从这一部分的第二部分引出一个不同的问题可能更好。