分配C ++引用时出现意外行为

时间:2013-01-09 12:59:03

标签: c++ reference

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

只是一个简单的例子:

#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 link example

2 个答案:

答案 0 :(得分:7)

引用类似于C ++中的指针,除了语法之外还有两个重要的例外:

  • 无法将其指定为null
  • 他们无法重新分配

因此,当您致电b = bar时,您不会重新分配参考资料;您要将bar的值分配给b引用的对象;在这种情况下,您要将bar的值分配给foo。因此,在第二行中,您将拥有一个Foovalue_ 44的对象。正如你的输出所说的那样。

答案 1 :(得分:3)

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

Base & b = foo;指定对foo

的引用

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

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