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

时间:2012-01-23 19:44:07

标签: c++

  

可能重复:
  What will happen when I call a member function on a NULL object pointer?

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

#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;
}

节目输出:

  

没有对象调用的非静态函数?

为什么会这样?

3 个答案:

答案 0 :(得分:9)

未定义的行为。您的程序通过在空指针上调用方法来调用未定义的行为,因此允许一切,包括您的输出。

请记住:C ++语言的规范没有指定每个可能程序的输出,以便为优化留出空间。许多事情没有明确检查,可能导致行为似乎不正确或不合逻辑,但根本没有说明。

答案 1 :(得分:5)

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

答案 2 :(得分:2)

因为它不使用this因此不会取消引用空指针。将其设为虚拟,可能会失败。