使用通配符和空指针调用函数时的输出说明

问题描述 投票:0回答:3

最近我在一次采访中被要求预测以下程序的输出:

#include <bits/stdc++.h>
using namespace std;

class a {
 public:
  int x = 10;
  void f() { cout << "hello" << endl; }

  void g() { cout << x << endl; }
};

int main() {
  a* ptr = new a();
  a* ptr1;
  a* ptr2 = NULL;
  ptr->f();
  ptr1->f();
  ptr2->f();

  ptr->g();
  ptr1->g();
  ptr2->g();
}

当使用Null和Wild指针调用函数f()时,输出为hello,但是使用这两个指针调用函数g()时,在控制台上看不到输出。这种行为的原因可能是什么?

c++ output
3个回答
0
投票

未初始化的指针和空指针上的调用方法的行为是不确定的。这意味着您不再能够以任何有意义的方式来推理程序的行为。它实际上可以做任何事情。例如,它可以订购披萨。


0
投票

您的程序有未定义的行为。话虽如此,但对于f的调用会引起奇怪的行为,为什么对g的调用似乎可以正常工作,所以有很好的解释。

这些函数在概念上被翻译为:

void mangled_function_for_f(a const* this)
{
   cout << "hello" << endl;
}

void mangled_function_for_g(a const* this)
{
   cout << this->x << endl;
}

[请注意,this中未使用f。因此,对f的调用似乎正常。 g并非如此。


0
投票

我认为唯一有效的答案是:该程序调用未定义的行为,因此any

© www.soinside.com 2019 - 2024. All rights reserved.