以下程序如何打印“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;
}
答案 0 :(得分:0)
您必须知道如何调用这些方法。
ex::show();
(...)
obj->show();
(通常可能)由您的特定编译器翻译为:
show(ex * this);
(...)
show(obj);
由于你没有在里面使用this
,所以没有理由抛出异常......
我强调了您的特定编译器,因为:
C ++标准,第8.3.2章,参考文献
[注意:特别是,在明确定义的程序中不能存在空引用,因为唯一的方法 创建这样的引用将是绑定到通过空指针间接获得的“对象”, 导致未定义的行为。如9.6中所述,引用不能直接绑定到位字段。 - 后注]
答案 1 :(得分:0)
在您的示例中,该方法是非虚拟的。所以它被实现为普通函数。因为你没有去除this
,所以没有问题。如果您的方法是虚拟的,您会调用类似this->__vtable[0](this)
的内容,因为您会取消引用0
,因此无效。
答案 2 :(得分:0)
由于您没有访问任何公共数据成员,因此不会抛出任何异常。
但如果您尝试通过该对象访问任何公共数据成员,它将抛出异常,因为没有为该对象分配内存。