1

我有以下代码:

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() 标头,例如“ 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),但我不确定。我对吗?

4

5 回答 5

3

您正在返回对您班级成员的引用。但是,由于您的方法是 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 方法返回非常量引用会发生什么。

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

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

于 2013-06-07T19:36:40.327 回答
2

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

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

或者

int f() const { .... }

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

于 2013-06-07T19:34:58.173 回答
1

对于你的第一个问题:

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

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

于 2013-06-07T19:35:26.880 回答
1

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

于 2013-06-07T19:36:18.427 回答
0

const int& f() const就是这样。

你是对的,两者都是3次。

于 2013-06-07T19:35:36.897 回答