#ifndef HEADER_NAME_H #define HEADER_NAME_H // 头文件内容 #endif //HEADER_NAME_H
工作原理:
* 首次包含:宏未定义,定义宏并编译内容
* 再次包含:宏已定义,跳过内容,这样保证头文件只被编译一次
基本定义语法 namespace identifier{ // 声明或定义 class MyClass{}; void function() {} int variable; }
访问命名空间的方式 identifier::MyClass obj; // 方式1:作用域解析运算符:: using identifier::MyClass; // 方式2:using声明 MyClass obj; // 可以直接使用 using namespace identifier; // 方式3: using指令 MyClass obj; // 可以使用命名空间的所有名称
嵌套命名空间 namespace A { namespace B { namespace C { void function() {} } } } A::B::C::function(); // 访问嵌套命名空间
C++继承 class 派生类名 : 继承方式 基类名 { // 派生类的成员定义 }; 三种继承方式: class Child : public Parent { // 类定义 }; 基类的public成员在派生类中仍是public 基类的protected成员在派生类中仍是protected 基类的private成员在派生类中不可访问 class Child : protected Parent { // 类定义 }; 基类的public和protected成员在派生类中变成protected 基类的private成员在派生类中不可访问 class Child : private Parent { // 类定义 }; 基类的public和protected成员在派生类中变成private 基类的private成员在派生类中不可访问
类型别名
| 别名 | 描述 | 示例|
| :---: | :---: | :---: |
| typedef | 为现有类型定义别名 | typedef int MyInt; |
| using | 为现有类型定义别名 | using MyInt = int; |
标准库类型
| 数据类型 | 描述 | 示例 |
| :---: | :---: | :---: |
| std::string | 字符串类型 | std::string s = "Hello"; |
| std::vector | 动态数组 | std::vector<int> v = {1, 2, 3} |
| std::array | 固定大小数组 | std::array<int, 3> a = {1, 2, 3} |
| std::pair | 存储两个值的容器 | std::pair<int, float> p(1, 2.0) |
| std::map | 键值对容器 | std::map<int, std::string> m; |
| std::set | 唯一值集合 | std::set<int> s = {1, 2, 3}; |
C++中的类型限定符
| 限定符 | 含义 |
| :---: | :---: |
| const | const定义常量,表示该变量的值不能被修改 |
| volatile | 修饰符volatile告诉该变量的值可能会被程序以外的因素改变,如硬件或其他线程 |
| restrict | 由restrict修饰的指针是唯一一种访问它所指向的对象的方式 |
| mutable | mutable用于修饰类的成员变量,被mutable修饰的成员变量可以被修改,即使它们所在的对象是const |
| static | 用于定义静态变量,表示该变量的作用域仅限于当前文件或当前函数内,不会被其他文件或函数访问 |
| register | 用于定义寄存器变量,表示该变量被频繁使用,可以存储在CPU的寄存器中,以提高程序的运行效率 |
定义函数 return_type function_name(parameter list) { body of the function } 函数声明 return_type function_name(paramter list); Lambda 函数与表达式 capture->return-type{body}
枚举类型是由用户定义的若干枚举常量的集合。如果一个变量只有几种可能的值,可以定义为枚举类型,所谓枚举是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。 enum 枚举名{ 标识符[=整型常数], 标识符[=整型常数], … 标识符[=整型常数] } 枚举变量;
类型转换
C++中有四种类型转换:静态转换、动态转换、常量转换和重新解释转换
静态转换(Static Cast): 将一种数据类型的值强制转换为另一种数据类型的值,静态转换不进行任何运行时类型检查,可能会导致运行时错误
int i = 10;
float f = static_cast
C++模板
函数模板
template
};
C++重载运算符
template
#include
C++接口(抽象类) 接口描述了类的行为和功能,而不需要完成类的特定实现 C++接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念 如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用”=0”来指定的
C++内联函数 如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方,如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字inline C++友元函数 类的友元函数是定义在类外部,但有权访问类的所有私有成员和保护成员,尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数;如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字friend
gdb调试 break [行号] 断点设置在该行开始处,该行代码未被执行 break [文件名:行号] 适用于有多个源文件的情况 break [函数名] 断点设置在该函数的开始处,断点所在行被执行 info breakpoints 查看断点的情况,包含都设置了那些断点,断点被命中的次数等信息 delete breakpoint断点编号 删除断点 list 查看代码 list first,last 指定行号查看代码 list [文件名加行号或函数名] 列出指定文件的源码 next 用于在程序断住后,继续执行下一条语句 step 可以单步跟踪到函数内部 continue 会继续执行程序,直到再次遇到断点处 print [变量名] 查看变量
|file<文件名>|加载被调试的可执行程序文件|
|:---:|:---:|
|run|重新开始运行文件|
|start|单步执行,运行程序,停在第一执行语句|
|list|查看源代码,简写l|
|set|设置变量的值|
|next|单步调试(逐过程,函数直接执行),简写n|
|step|单步调试(逐语句,跳入自定义函数内部执行),简写s|
|backtrace|查看函数的调用的栈帧和层级关系,简写bt|
|frame|切换函数的栈帧,简写f|
|info|查看函数内部局部变量的数值,简写i|
|finish|结束当前函数,返回到函数调用点|
|continue|继续运行,简写c|
|print|打印值及地址,简写p|
|quit|退出gdb,简写q|
STL标准模板库