今天,我在使用参考文献时看到了非常奇怪的事情。
只是一个简单的例子:
#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。那么,可能知道这个魔法的秘密?
答案 0 :(得分:7)
引用类似于C ++中的指针,除了语法之外还有两个重要的例外:
因此,当您致电b = bar
时,您不会重新分配参考资料;您要将bar
的值分配给b
引用的对象;在这种情况下,您要将bar
的值分配给foo
。因此,在第二行中,您将拥有一个Foo
个value_
44
的对象。正如你的输出所说的那样。
答案 1 :(得分:3)
=
和Base & b = foo;
中的b = bar;
是不同的操作。
Base & b = foo;
指定对foo
b = bar;
尝试默认成员分配Base
。 b
仍指foo
。其成员已被重新分配。它仍然是Foo
类型。
典型的编码标准(such as Google's)通常要求您通过将其设为私有来撤销默认的复制构造函数和赋值。