gpt4 book ai didi

c++ - 分配 C++ 引用的意外行为

转载 作者:太空宇宙 更新时间:2023-11-04 14:50:06 25 4
gpt4 key购买 nike

今天我在处理引用时看到了非常奇怪的事情。

举一个简单的例子:

#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 上测试。那么,可能知道这种魔法的 secret 吗?

Ideone link example

最佳答案

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

  • 他们不能赋值为null
  • 他们不能被重新分配

因此,当您调用 b = bar 时,您并没有重新分配引用;您正在将 bar 的值分配给 b 引用的对象;在这种情况下,您将 bar 的值分配给 foo。因此,在第二行中,您将拥有一个 Foo 对象,其 value_44。正如您的输出所说。

关于c++ - 分配 C++ 引用的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14235757/

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