0

下面的程序如何打印“Show Called”?我猜它应该是运行时错误,因为 obj ptr 的值为 NULL。

#include<iostream>
using namespace std;

   class ex
    {
        int i;

    public:
        ex(int ii=0):i(ii) {}

        ~ex(){cout<<"dest"<<endl;}

        void show()
        {
            cout<<"Show called";
        }

    };

    int main()
    {
        ex *obj = NULL;
        obj->show();

        return 0;
    }
4

3 回答 3

0

As you are not accessing any public data member, it will not throw any exception.

But it will throw an exception if you try to acces any public data member through that object as there is no memory allocated to that object.

于 2013-06-18T11:11:08.403 回答
0

你必须知道,方法是如何被调用的。

ex::show();
(...)

obj->show();

由您的特定编译器(很可能)翻译为:

show(ex * this);
(...)

show(obj);

而且由于您不在this内部使用,因此没有理由抛出异常......

我强调了您的特定编译器,因为:

C++ 标准,第 8.3.2 章,参考资料

[注意:特别是,在定义良好的程序中不能存在空引用,因为创建此类引用的唯一方法是将其绑定到通过空指针间接获得的“对象”,这会导致未定义的行为。如 9.6 中所述,引用不能直接绑定到位域。——尾注]

于 2013-06-18T10:59:04.617 回答
0

在您的示例中,该方法是非虚拟的。所以它被实现为一个正常的功能。因为你不取消引用this,所以没有问题。你的方法是否是虚拟的,你会调用类似this->__vtable[0](this)which 不起作用的东西,因为你会取消引用0

于 2013-06-18T11:03:37.133 回答