这几天阅读veloview源码,遇到2个和c++与QT有关的问题。以前没接触过c++和QT,感觉对于我的问题,对于写c++的人而言,应该是个小问题。不过,对于学习,遇到的问题记录下来总归是没有错的。
一 今天看qt的应用启动代码,发现这样两行:
-
QApplication qtapp(argc, argv);
-
...
-
QApplication::exec();
QApplication实例化对象qtapp,下面直接执行类函数exec,没有使用对象来执行。静态类成员函数?用的vscode看的代码。光标指在exec处,F12,直接调到exec函数,不是static,我就疑惑了。以前看到的qt例子基本都是对象执行exec的啊。经过查阅,才明白,如下:
1 首先,这确实是一个static类成员函数,声明时候有static,定义时候没有,这一点和C不同;
2 当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数并不在此列;
3 static成员属于类,而不属于某个对象,使用静态成员变量实现多个对象共享数据,不破坏c++的封装原则,还节省空间;
4 static成员存储在数据段,而对象空间一般在栈上分配,这个和C比较类似;关于这一点,感觉c++的内存分配和c还是有一点区别的,可以参考c++对象模型相关的描述。
5 c++规定,const静态类成员可以直接初始化,其它非const静态成员在类外初始化或定义,且定义时去掉关键字,如类内声明时static变量或函数,类外定义时不用static关键字;
6 类和对象都可以直接执行static函数;
二 第二个问题,看下面2行代码:
-
using InitializerT = pqVeloViewInitializer;
-
InitializerT pvInitializer;
-
InitializerT::Status status = pvInitializer.Initialize(argc, argv);
左值第一次出现,右面是一个类。
没有写过c++,但是起码看过简单的例子,以前的c++,基本还能看明白,看到这就。。。。。都不知道怎么查。有人提醒c++新特性。网上查阅,果然听人劝,吃饱饭,真是新特性。。基本就是typedef的功能。貌似c++11以后的新特性:指定别名。具体如下:
1 using a = b, 等同于 typedef b a,这个using的优势不明显;
2 using P = void (*)(int, int),等同于 pytedef void (*P)(int, int),哪个简单明了;
3 模板举例,略
总之就是为了阅读方便,但是在此处这么用,除了让人知道这是在init,也没有其它太明显的作用啊,感觉不如直接执行对象的init,简单粗暴还明了。费力不讨好还是有其它我没理解到的地方?
阅读(867) | 评论(0) | 转发(0) |