0

今天我在使用参考资料时看到了非常奇怪的事情。

只是一个简单的例子:

#include <iostream>

struct Base {
  enum Type {
    FOO = 0,
    BAR = 1
  };
  virtual ~Base() {}
  virtual Type type() const = 0;
  int value_;
};

struct Foo : Base { 
    Foo() { value_ = 33; }
    virtual Type type() const { return FOO; }
};

struct Bar : Base { 
    Bar() { value_ = 44; }
    virtual Type type() const { return BAR; }
};

int main() {
    Foo foo;
    Bar bar;
    Base & b = foo;
    std::cout << b.type() << ", " << b.value_ << "\n";
    b = bar;
    std::cout << b.type() << ", " << b.value_ << "\n";
    return 0;
}

你认为输出会是什么?看到的时候真的很惊喜:

0, 33
0, 44

在 VS 2010、mingw 4.6、gcc 4.3 上测试。那么,可能知道这个魔法的秘密吗?

Ideone 链接示例

4

2 回答 2

7

引用就像 C++ 中的指针,有两个重要的例外(除了语法):

  • 它们不能分配给 null
  • 他们不能被重新分配

因此,当您调用 时b = bar,您不会重新分配引用;您正在将 的值分配给;bar引用的对象 b在这种情况下,您正在分配barto的值foo。因此,在第二行中,您将有一个带有 a的Foo对象。正是你的输出所说的。value_44

于 2013-01-09T13:04:12.183 回答
3

=inBase & b = foo;b = bar;是不同的操作。

Base & b = foo;将引用分配给foo

b = bar;尝试对 的默认成员分配Baseb仍指foo。其成员已被重新分配。它仍然是 type Foo

典型的编码标准(例如 Google 的)通常要求您通过将其设为私有来撤销默认的复制构造函数和赋值。

于 2013-01-09T13:04:12.777 回答