1

可能重复:
在 NULL 指针上访问类成员

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

    #include <iostream>

    using namespace std;

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

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

输出是:打印

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

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

4

3 回答 3

6

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

由于您没有this在成员函数中使用隐式参数print,因此似乎NULL不需要实际取消引用此类指针。

于 2012-06-05T21:06:25.650 回答
5

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

于 2012-06-05T21:06:24.787 回答
2

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

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

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

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

于 2012-06-05T21:15:38.770 回答