【问题标题】:NULL pointer able to access class member function [duplicate]能够访问类成员函数的空指针[重复]
【发布时间】:2012-06-09 22:07:38
【问题描述】:

可能重复:
Accessing class members on a NULL pointer

一个非常愚蠢的问题,或者可能是我的概念上的疑问。

    #include <iostream>

    using namespace std;

    class A
    {
            public:
            void print()
            {
                    cout<<"Printing\n";
            }
    };

    int main()
    {
            A * a = NULL;
            a->print();
            return 0;
    }

输出是:打印

a指针(为NULL)如何访问A类的成员函数。

请解释一下...这可能只是一个愚蠢的问题,但我的印象是 NULL 指针不会访问类的成员函数。

【问题讨论】:

  • 你很不幸没有点披萨。下次祝你好运。
  • @R。 Martinho Fernandes:我只是喜欢不确定的行为让我吃到披萨! ;)
  • @K-ballo,当我的未定义行为点餐时,它永远不会像披萨那样令人愉快。

标签: c++


【解决方案1】:

取消引用NULL 会导致未定义的行为 (UB)。 UB 并不意味着“必须崩溃”或“必须做一些奇怪的事情”。

【讨论】:

    【解决方案2】:

    正如您在代码中所做的那样,取消引用 NULL 指针是未定义的行为。这种未定义的可能性之一是它可能会起作用。但它可能会在下一次崩溃,或者做一些完全出乎意料的事情。

    由于您没有在成员函数 print 中使用隐含的 this 参数,因此似乎这样的 NULL 指针永远不需要实际上被取消引用。

    【讨论】:

      【解决方案3】:

      如上所述,是的,这是未定义的行为,但它起作用的原因是......

      它是一个空指针,但仍然是定义类型“A”,每次创建类的实例时它不会重复方法,它只是分配内存并使用新分配的地址调用构造函数方法。

      调用该方法仍然可以工作,只要您的方法不使用任何类内部,而您的方法没有,但是如果您确实需要这样的功能,您显然应该使用静态方法而不是如果您尝试编译器会痛苦地抱怨访问“this”或任何类内部成员。

      如果你在方法内部打断并检查 'this' 的值,你会发现它是 NULL。

      【讨论】:

        猜你喜欢
        • 2013-06-14
        • 1970-01-01
        • 2012-07-07
        • 1970-01-01
        • 2013-04-10
        • 1970-01-01
        • 1970-01-01
        • 2015-12-17
        • 2010-10-01
        相关资源
        最近更新 更多