为什么可以在没有对象实例的情况下调用非静态成员函数

Why is possible to call nonstatic member-function without an object instance?

本文关键字:情况下 调用 函数 静态成员 实例 对象 为什么      更新时间:2023-10-16

可能重复:
当我在NULL对象指针上调用成员函数时会发生什么?

我认为这个代码和程序输出可以自我解释:

#include <iostream>
#include <string>
using namespace std;
class Test
{
public:
    void Not_Static(string args)
    {
        cout << args << endl;
    }
};
int main()
{
    Test* Not_An_instance = nullptr;
    Not_An_instance->Not_Static("Non-static function called with no object?");
    cin.ignore();
    return 0;
}

程序输出:

在没有对象的情况下调用非静态函数?

为什么这是可能的?

未定义的行为。您的程序通过调用空指针上的方法来调用未定义的行为,因此所有内容都是允许的,包括您的输出。

请记住:C++语言的规范并没有指定每一个可能的程序的输出,从而为优化留出空间。许多事情没有明确检查,可能会导致看似不正确或不合逻辑的行为,但只是未指明。

此行为未定义,因此很可能会打印该输出。问题是,不明确的行为很容易咬到你,所以你不应该做这样的事。

因为它不使用this,因此不取消引用空指针。让它成为虚拟的,它很可能会失败。