【问题标题】:Why is possible to call nonstatic member-function without an object instance? [duplicate]为什么可以在没有对象实例的情况下调用非静态成员函数? [复制]
【发布时间】:2012-02-17 03:44:55
【问题描述】:

可能重复:
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;
}

程序输出:

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

为什么会这样?

【问题讨论】:

  • 因为它是未定义的行为,所以任何事情都可能发生。
  • @FredLarson,虽然是真的,但它并没有真正解释为什么它是可能的。
  • 这是可能的,因为阻止你打自己的脸不是 C++ 的工作。
  • @NicolBolas,我认为 OP 询问为什么没有拍摄。
  • @MichaelKrelin-hacker:没有明显枪击事件。未定义的行为意味着未定义。这包括一切看起来都很好的可能性。

标签: c++


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-08
        • 2015-01-26
        • 2017-10-22
        • 2011-10-17
        • 2015-09-15
        • 2020-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多