gpt4 book ai didi

c++ - 关于const结合引用和虚继承

转载 作者:行者123 更新时间:2023-11-30 00:36:06 24 4
gpt4 key购买 nike

我有以下代码:

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;
}

我收到一条错误消息,提示我无法从类型为 const int 的表达式中初始化类型为 int& 的引用?如果我修改函数的 f() header ,例如“int f() const”或“int& f()”,它会起作用。我知道 const 函数不能修改类的成员,但在我的示例中,这并没有发生,而且仍然是我无法理解的错误。

其次,我有这段代码:

class B { /* instructions */ };
class D1: virtual B { /* instructions */ };
class D2: virtual B { /* instructions */ };
class D3: B { /* instructions */ };
class D4: private B { /* instructions */ };
class D5: virtual public B { /* instructions */ };
class M1: D1, public D2, D3, private D4, virtual D5
{ /* instructions */ };
class M2: D1, D2, virtual D3, virtual D4, virtual D5
{ /* instructions */ };

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

最佳答案

您正在返回对类(class)成员的引用。但是,由于您的方法是 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 引用会发生什么。

由于调用了 const 函数,最终用户可能会更改您类中的属性 x,这是不应该发生的。

按值返回结果是我要走的路,因为它只是一个整数。

关于c++ - 关于const结合引用和虚继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16991614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com