# learn-qt **Repository Path**: xingstone_2021/learn-qt ## Basic Information - **Project Name**: learn-qt - **Description**: 记录学习QT的历程 - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-06-12 - **Last Updated**: 2026-02-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Stone_QT ## 1. C++学习 ### 基础概念 a. 类与对象 1. 类成员的访问权限: 在类的内部(定义类的代码内部),无论成员被声明为 public、protected 还是 private,都是可以互相访问的,没有访问权限的限制. 在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 public 属性的成员,不能访问 private、protected 属性的成员. 既不写 private 也不写 public,就默认为 private;在一个类体中,private 和 public 可以分别出现多次(建议只写一次). 2. 运算符new和delete: new 用来动态分配内存,delete 用来释放内存. 在C++中,建议使用 new 和 delete 来管理内存,因能使用C++新特性,最明显的是可以自动调用构造函数和析构函数. 3. 内联函数inline: 函数调用是有时间和空间开销的。为了消除函数调用的时空开销,C++在编译时将函数调用处用函数体替换,这种处理行为称为内联函数. inline声明只是程序员对编译器提出建议,而非强制性的。编译器会根据具体情况决定是否这样做. 4. 函数的默认参数: 所谓默认参数,指的是当函数调用中省略了实参时自动使用的一个值,这个值就是给形参指定的默认值. C++规定,默认参数只能放在形参列表的最后,而且一旦为某个形参指定了默认值其后面的所有形参都必须赋默认值,实参和形参的传值是从左到右依次匹配的. 5. 函数重载: C++允许多个函数拥有相同的名字,只要它们的参数列表不同即可,这就是函数的重载. 参数列表不同包括参数的个数不同、类型不同或顺序不同,仅仅参数名称不同是不可以的。函数返回值也不能作为重载的依据. 6. 构造函数: 7. 析构函数: 8. 静态成员变量static: 其是一种特殊的成员变量,它被关键字static修饰. 其属于类,不属于某个具体的对象,即使创建多个对象也只为其分配一份内存,所有对象使用的都是这份内存中的数据. 其不占用对象的内存,而是在所有对象之外开辟内存,即使不创建对象也可以访问. 其和普通static变量一样,都在内存分区中的全局数据区分配内存,到程序结束时才释放. 其必须初始化,而且只能在类体外进行. 其既可以通过对象名访问,也可以通过类名访问,但要遵循 private、protected 和 public 关键字的访问权限限制. 9. 静态成员函数: 静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数. 静态成员函数不能访问普通成员变量,只能访问静态成员变量;不能调用普通成员函数,只能调用静态成员函数. 在C++中,静态成员函数的主要目的是访问静态成员;和静态成员变量类似,静态成员函数在声明时要加static,在定义时不能加static. 静态成员函数可以通过类来调用(一般都是这样做),也可以通过对象来调用. 10. const成员变量和成员函数: 成员变量: 其用法和普通const变量的用法相似,只需要在声明时加上const关键字;初始化const成员变量只有一种方法,就是通过构造函数的初始化列表. 成员函数: 其可用类中的所有成员变量,但不能修改它们的值,此措施是为了保护数据而设置的;需要在声明和定义的时候在函数头部的结尾加上const关键字. 11. const(常对象): 在C++中,const也可以用来修饰对象,称为常对象。一旦将对象定义为常对象就只能调用类的const成员(包括const成员变量和const成员函数). 12. 友元函数和友元类(friend关键字): 13. 内联函数: 14. class和struct区别: 使用class时,类中的成员默认都是private属性的;而使用struct 时,结构体中的成员默认都是public属性的. class继承默认是private继承,而struct继承默认是 public 继承. class可以使用模板,而struct不能. 在编写C++代码时,强烈建议使用class来定义类,而使用truct来定义结构体. b. 继承 1. 基类与派生类: 创建不是完全写入新的数据成员和成员函数的类,程序员可以指定一个新的类要继承现有的类成员。这个现有的类叫做基类,新的类被称为派生类. 类可以从一个以上的类中派生,这意味着它可以从多个基类继承数据和功能. 定义一个派生类中,我们使用一个类派生列表来指定基类(ES) 2. 访问控制和继承: 派生类可以访问其基类的所有非私有成员,基类成员不应该访问的派生类的成员函数应声明为private基类. | 访问 | public | protected | private | |------|--------|-----------|---------| | 同一类内 | yes | yes | yes | | 派生类 | yes | yes | no | | 外部类 | yes | no | no | 派生类继承了所有基类的方法,以下情况除外:构造函数,析构函数和基类的拷贝构造函数;基类的重载运算符;基类的友元函数. 3. 继承类型: 当派生类从基类继承,基础类可以通过public, protected 或 private继承. 我们几乎不使用保护或私有继承,但公有继承是常用的。同时使用不同类型的继承,应用下面的规则: 公共继承:当从公共基类派生,基类公有成员成为派生类公共成员和基类保护成员成为派生类保护成员。基类私有成员不能被派生类访问,但可调用基类公共和保护成员进行访问. 保护继承:当从受保护基类派生,该基类的公共和受保护成员成为派生类的protected成员。 私有继承:从私有基类派生,该基类的公共和受保护成员成为派生类的私有成员 4. 多继承: C++类可以从多个类继承成员,其扩展语法:class derived-class: access baseA, access baseB.... c. 重载(操作符和函数) 1. 函数重载: 2. 运算符重载: d. 指针 1. 常指针(指向常量的指针) const int *p:指针所保存的地址可以改变,然而指针所指向的值却不可以改变。 2. 指针常量 int* const p:指针指向的数值可以改变,然而指针所保存的地址却不可以改变。 3. 指向常量的常指针 const int const *p:特点是指针所保存的地址不可变,指针所指向的数值也不可变。 e. C++模板 1. 简述: 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码; 模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子; 2. 函数模板: template ret-type func-name(parameter list) { // 函数的主体 } 3. 类模板: template class class-name { , , , } f. C++ STL模板库