空指针

int * p = NULL; // #define NULL 0
int * p = nullptr; // #define nullptr 0

野指针

int * p = (int *)0x3030; // 尽量避免这种写法

const修饰指针

  1. 常量指针(const修饰int,修饰的是值):指针的指向可以修改,但指针指向的值不能改

    int a = 10, b = 10;
    const int * p = &a;
    p = &b; // 正常执行
    *p = 20; // 报错
  2. 指针常量(const修饰p,修饰的是指针):指针的指向不能改,指针指向的值可以改

    int a = 10, b = 10;
    int * const p = &a;
    p = &b; // 报错
    *p = 20; // 正常执行
  3. const既修饰常量,也修饰指针

    int a = 10, b = 10;
    const int * const p = &a;
    p = &b; // 报错
    *p = 20; // 报错

const修饰形参,防止误改

struct Obj{
    int value = 0;
}
void f(const Obj * obj) {
    obj->value = 10; // 报错

作用:让代码结构更清晰

步骤:

  1. 创建后缀为.h的头文件
  2. 创建后缀为.cpp的源文件
  3. 头文件写函数的声明,并导入实现所用的其他头文件
  4. 源文件写函数的定义与实现,并导入.h头文件

其中的原理细节:

  1. #include包含头文件实质上是在预处理阶段的时候对文件进行拼接,也就是代码的直接复制粘贴。项目编译时会对所有的cpp都进行编译,因此需要注意的是#include只能包含头文件(.h),而不能#include源文件(.cpp),不然会导致重复定义和实现函数,从而报错。当包含头文件时,由于头文件中仅仅进行了函数声明操作,所以包含头文件不会导致报错
  2. #pragma once包含该语句的文件只会被编译一次

静态设计时操作布局:

左侧:组件面板
中上:可视化待设计的预览
右上:对象检查器,可以看到其中所有的控件
右下:属性编辑器,可以看到类的继承关系。属性可能是从父类继承过来的,所以若有想要修改的属性,要到对应的父类(也可能是当前类所定义)去找
中下:信号和槽,Action编辑器

.pro是项目管理文件,代码的含义如下:

QT+=core gui // 包含core和gui模块
greaterThan(QT_MAJOR_VERSION, 4): QT+=widgets // 超过4版本就加上widgets
CONFIG+=c++17 // 通用配置选项,加上c++
SOURCES+=main.cpp\widget.cpp // 源文件
HEADERS+=widget.h // 头文件
FORMS+=widget.ui // UI文件

qnx: target.path=/tmp/$${TARGET}/bin // $$用于替换函数的前缀
else: unix:!android: target.path=/opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS+=target

qmake用于构建项目,根据.pro文件生成makefile文件,然后C++编译器可以根据makefile文件进行编译和链接
MOC: meta-object compiler meta层编译器,meta层是在C++基础上封装的层次结构
UIC: user interface compiler 用户接口编译器
qmake自动生成MOC和UIC构建规则,将代码编译为底层二进制

  1. 支持C++17标准
  2. 核心库变化:
    2.1 新的属性和绑定系统;
    2.2 支持unicode字符串;
    2.3 QVector和QList统一为QList类
  3. 新的图形架构:在OpenQL的基础上加入RHI,使得Qt可以使用本地的3D图形API,例如Linux的Vulkan、Windows的Direct 3D、MACOS的Metal
  4. 仍然支持qmake,但建议使用CMake
  5. 多媒体、网络、Qt Quick 3D模块的改进