最近我在一次采访中被要求预测以下程序的输出:
#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()时,在控制台上看不到输出。这种行为的原因可能是什么?
未初始化的指针和空指针上的调用方法的行为是不确定的。这意味着您不再能够以任何有意义的方式来推理程序的行为。它实际上可以做任何事情。例如,它可以订购披萨。
您的程序有未定义的行为。话虽如此,但对于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
并非如此。
我认为唯一有效的答案是:该程序调用未定义的行为,因此any