它是如何工作的?
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();
答案 0 :(得分:1)
基本上,您的问题与Qt
有关,但与C++
无关。
指针不需要调用方法,而是指针的类型。
该方法可能不会使用this
,因此它运行代码就好了。
bahaviour应该是未定义的,取决于screenGeometry
方法的实现。
P.S。编译警告并且不要忽视它们(由Jeoren在评论中提出)
答案 1 :(得分:1)
这适用于在NULL指针上调用类方法的所有情况。编译器在编译时不会(不能)检查指针的有效值。它只查看指针的类型,只要检出(在这种情况下,QDesktopWidget类确实有一个名为screengGeometry的函数接受0参数),它将很乐意编译你的代码。
但是,在运行时,只要该函数中的代码访问类的数据成员,就很可能会崩溃。那就是它试图取消引用&#34;这个&#34;指针,在本例中为NULL。您的第一个示例成功运行的事实只是意味着它不访问实例数据,而只访问静态或全局数据。
第二个片段只是一个完全不同的案例,你试图将方法调用为静态,而不是。这会导致您引用完全正确且有用的错误消息。
问自己这个:当没有它所属的实例时,当你调用screenGeometry时,该函数应该返回什么。两个代码片段都试图做一些荒谬的事情。