我可以在QT中调用null对象的非静态方法吗?

时间:2015-01-19 14:57:10

标签: c++ qt

它是如何工作的?

QDesktopWidget *Desktop=NULL;
auto Desktop_Rect=Desktop->screenGeometry();
pDebug()<<Desktop_Rect.width()<<","<<Desktop_Rect.height(); //1440,900

如果我将其改写如下:

auto Desktop_Rect=QDesktopWidget::screenGeometry();//Error:screenGeometry is not a static method.
pDebug()<<Desktop_Rect.width()<<","<<Desktop_Rect.height();

2 个答案:

答案 0 :(得分:1)

基本上,您的问题与Qt有关,但与C++无关。

指针不需要调用方法,而是指针的类型。

该方法可能不会使用this,因此它运行代码就好了。

bahaviour应该是未定义的,取决于screenGeometry方法的实现。

P.S。编译警告并且不要忽视它们(由Jeoren在评论中提出)

答案 1 :(得分:1)

这适用于在NULL指针上调用类方法的所有情况。编译器在编译时不会(不能)检查指针的有效值。它只查看指针的类型,只要检出(在这种情况下,QDesktopWidget类确实有一个名为screengGeometry的函数接受0参数),它将很乐意编译你的代码。

但是,在运行时,只要该函数中的代码访问类的数据成员,就很可能会崩溃。那就是它试图取消引用&#34;这个&#34;指针,在本例中为NULL。您的第一个示例成功运行的事实只是意味着它不访问实例数据,而只访问静态或全局数据。

第二个片段只是一个完全不同的案例,你试图将方法调用为静态,而不是。这会导致您引用完全正确且有用的错误消息。

问自己这个:当没有它所属的实例时,当你调用screenGeometry时,该函数应该返回什么。两个代码片段都试图做一些荒谬的事情。