【问题标题】:Variable declaration with const and reference带有 const 和引用的变量声明
【发布时间】:2014-07-30 07:57:47
【问题描述】:

我对带有引用的变量声明感到困惑。我读了一些页面,这让我更加困惑,所以更愿意在这里问。

我在一次 C++ 面试中被问到 4 个问题;其中哪一个是错的,为什么?

(1) int & n;
(2) const int & n=15;
(3) float x; const int & n =x;

谁能解释一下哪个不正确,为什么?

【问题讨论】:

  • 你的编译器告诉你什么?
  • c++ interview(which is same in c i guess) 听起来好像有人在他们头上。
  • 编译器没有给出为什么的答案? (但如果你真的不想帮忙也没关系,那么你肯定会这样评论)
  • @user3735822,我的编译器对Why给出了非常清晰的解释。你说什么?
  • ideone.com/70GBig 不清楚吗? (向下滚动到编译信息并忽略警告)

标签: c++ c++11 constants


【解决方案1】:

tl;dr 引用必须在声明时初始化(直接或在类初始化中)。

int& n;

这会使引用n 未初始化。引用必须在声明时初始化。

const int& n = 15;

这里没有错。对const int 的引用被初始化为15

float x; const int& n = x;

float 没问题,但不初始化是个坏主意。引用 n 被初始化为 x(适用浮点/整数转换),这也不是一个好主意。

【讨论】:

  • 但是为什么不给初始化为 int n 作为参考的 flotavariable 错误呢? (它是否进行任何类型转换?)
  • @user3735822。浮动 - 积分转换将适用。我不建议在一般意义上编写这样的代码。但是代码看起来是正确的,因此编译时不会出错。附加说明:const& 将绑定到临时对象并延长临时对象的寿命。
  • @user3735822。如果您将const int& n = x 中的const 删除为int& n = x(对于float 情况);你会得到一个编译错误。
  • @user3735822 int& n; 在类定义中可以。这一切都取决于上下文。我相信这会让你在面试中获得加分。
  • @juanchopanza 你能告诉我 int&n; 的情况吗?正常工作。
【解决方案2】:

必须始终初始化引用。

【讨论】:

  • 是的,但这并不一定会让int & n; 出错。例如,当它与结构的其余部分一起初始化时,它将是结构的有效成员。
  • @Jens 感谢您的回答,但我想知道为什么在 (3) float x 中初始化时,从浮点数更改为整数的数据类型不会出错; const int & n =x;
  • @hvd 只要它与结构的其余部分一起被初始化,它总是被初始化。当你不在构造函数中初始化它时,你会得到一个编译器错误。
  • @Jens 对。因此,您必须始终初始化引用的答案不一定适用于问题中的三个片段中的任何一个。这可能是第一个片段的预期答案,但如果是这样,那就意味着问题是错误的。
  • @hvd 为什么不适用于第一个片段。问题是这三个片段中的哪一个是错误的,并且由于给定的原因,那将是第一个。
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 2022-01-04
相关资源
最近更新 更多