NULL指针能够访问类成员函数

时间:2012-06-05 21:05:14

标签: c++

  

可能重复:
  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指针不会访问该类的成员函数。

3 个答案:

答案 0 :(得分:6)

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

由于您未在成员函数this中使用隐式print参数,因此似乎NULL指针永远不需要实际被取消引用。< / p>

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

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

调用方法仍然有效,只要你的方法不使用任何类内部,你的方法不是,但是如果你确实需要这样的功能,你应该使用静态方法,而不是如果你试图编译器会抱怨访问'this'或任何类内部成员。

如果你破坏方法并检查'this'的值,你会发现它是NULL。