C++

C++

C++ 语法

Posted by Treaseven on January 23, 2025

#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(i); 动态转换(Dynamic Cast): 用于在继承层次结构中进行向下转换的一种机制,通常用于将一个基类指针或引用转换为派生类指针或引用.动态转换在运行时进行类型检查,如果转换失败,对于指针类型会返回nullptr,对于引用类型则会抛出std::bad_cast异常 dynamic_cast<目标类型>(表达式) 目标类型:必须是指针或引用类型 表达式:需要转换的基类指针或医用 常量转换(Const Cast):用于将const类型的对象转换为非const类型的对象,常量转换只能用于转换掉const属性,不能改变对象的类型 const int i = 10; int& r = const_cast<int&>(i); 重新解释转换(Reinterpret Cast):重新解释转换将一个数据类型的值重新解释为另一个数据类型的值,通常用于在不同的数据类型之间进行转换.重新解释转换不进行任何类型的检查,因此可能会导致未定义的行为 int i = 10; float f = reinterpret<float&>(i); //重新解释将int类型转换为float类型


C++模板 函数模板 template ret-type func-name(parameter list) { // 函数主体 } 类模板 template class class-name {

};



C++重载运算符 template 模板声明,使用了C++11引入的可变参数模板特性 typename... Args表示一个类型参数包,可以接受任意数量的类型参数 TVMRetValue operator()(Args&&... args) const; 函数运算符重载,返回类型TVMRetValue,重载函数调用符operator(),使对象可以像函数一样被调用,接受可变数量的参数Args&&... args,其中&&表示转发引用,用于完美转发参数 const关键字表示这是一个常量成员函数,不会修改类的成员变量


#include PyObject: Python与C/C++交互的基础,允许C/C++代码创建、操作和引用Python,实现两种语言之间的数据交换 PyMethodDef:结构体,结构体成员分别是方法名称(字符串)、实现函数(C函数指针)、调用约定标志(如METH_VARARGS)、方法文档字符串 PyArg_ParseTuple:解决Python与C/C++之间的数据类型转换问题 PyModuleDef: 结构体,用于Python模块的属性,包括模块名称、模块文档、模块状态大小、模块的方法表(PyMethodDef数组) PyModuleDef_HEAD_INIT: 宏,用于初始化PyModuleDef结构体的头部字段,设置正确的版本和类型信息 PyMoudle_Create: 函数,使用PyModuleDef结构体创建一个新的Python模块对象 Py_RETURN_NONE: 宏,用于从C/C++函数中返回Python的None对象


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标准模板库

不保证元素的排序, unordered_map是一个关联容器,它存储键值对,其中每个键都是唯一的 std::unordered_map<key_type, value_type> map_name; 提供一种关联容器,用于存储键值对,按照键的顺序自动排序,每个键都是唯一的 提供一种基于哈希表的容器,用于存储唯一的元素集合,不保证元素排序 std::unordered_set<Key, Hash = std::hash, Pred = std::equal_to, Alloc = std::allocator> 是一个关联容器,存储一组唯一的元素,并按照一定的顺序进行排序 用于存储动态大小的数组 ``` ``` std::optional 是一个包装类,它可以表示可能存在或不存在的值 ```