【问题标题】:implicit default value for class member variable? [duplicate]类成员变量的隐式默认值? [复制]
【发布时间】:2021-08-26 20:18:36
【问题描述】:

我正在为我的认证考试做 C++ 测试,我遇到了这个我不明白的练习: (问题是下面程序的输出是什么)

#include <iostream>
using namespace std;
class A {
public :
    float v;
    float set(float v) {
    A::v += 1.0;
    A::v = v+1.0;
    return v;
    }
    float get(float v){
    v +=A::v;
    return v;
    }
};

int main()
{
    A a;
    cout<< a.get(a.set(a.set(0.5)));
    return 0;
}

我预计 set 函数的第一行会出现错误,因为 A::v 从未初始化,但我的程序编译了,似乎 A::v 默认值为 0.. 谁能解释一下为什么没有编译错误?

【问题讨论】:

  • 谢谢你的链接,很有趣,但它没有回答我的问题——人们在答案中说原语没有初始化(这也是我所期望的),所以这没有解释set函数的第一行如何编译
  • 您需要了解它是不可预测的。它可以像你的情况一样为零,但也可以是别的东西。有规律。它实际上回答了你的问题。如果你把踏板踩到金属上,闭上眼睛开车穿过繁忙的十字路口,你可能会撞车,也可能不会撞车。如何回答问题:为什么我没有崩溃?
  • 就 C++ 标准而言,程序具有未定义的行为,这就是我们所能说的。可能是某些实现总是给出2,或者通常给出2,或者一直给出2,直到该计算机上的其他东西碰巧为程序的虚拟地址空间提供了不同的RAM,或者它一直等到最坏的情况除了输出2之外,可能还有时间做点什么。
  • Pearson Vue 无可挑剔的机构声望需要引用。
  • “这就是为什么我相信这个程序的工作原理可能有更深层次的东西” - 你的意思是一些特殊情况,因为一些模糊的原因而不是 UB?听起来很捏造。无论如何,您是否认为您以 UB 来回答实际上正是他们可能想听到的答案?我的意思是,除此之外,理解代码应该做什么,忽略 UB,这太容易了,对吧?

标签: c++ function default-value


【解决方案1】:

就像你提到的,set 的第一行使用了A::v,之前从未初始化过。但是,这本身不会产生错误,它是未定义的行为。这意味着编译器可能会为您初始化它,或者它可能只是拾取它在内存中看到的一个随机数,或者他们喜欢的任何东西。 C++ 标准没有说明需要发生什么,所以它让编译器决定什么是容易的。

但是,在大多数情况下,该行发生的任何事情在您的代码中都不会太重要。原因是A::v 将在下一行重新分配给v + 1。所以它应该几乎总是在最后打印 2。

【讨论】:

  • 谢谢,我非常专注于第一行,以至于我什至没有注意到它甚至没有影响程序的最终输出。现在更清楚了
猜你喜欢
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2011-09-22
相关资源
最近更新 更多