随笔分类 -  C++

摘要:C++开发中使用 Pimpl 的用法可以加速编译速度、避免头文件包含依赖、保持更新后ABI的兼容性。原始的用法是将所有的私有成员变量放在头文件中,这样所有包含该头文件的源文件都需要同步包含一些依赖,Pimpl将其私有成员放到一个类或结构体中,然后提供一个私有指针来进行操作,所有的实现都放在cpp文件 阅读全文
posted @ 2025-07-02 11:22 Jeffxue
摘要:程序开发中常常需要有配置文件来记录相关的设置项,便于用户下次启动软件时,能恢复设置。常见的配置有如下几种形式: ini:用于简单的 section: key-value 形式,在Windows上有专用的API接口 xml:结构化的存储配置文件 json:使用相对广泛 注册表:Window专有的配置方 阅读全文
posted @ 2025-06-30 17:10 Jeffxue
摘要:在Linux上开发C++多线程程序,可以使用 pthread_t或标准的 std::thread来进行创建。pthread_t是Linux 提供的底层接口,便于对线程进行更加精细的控制。 pthread_t 创建线程的主要流程如下: #include <stdio.h> #include <stdl 阅读全文
posted @ 2025-04-21 18:28 Jeffxue
摘要:目录程序编译过程1. 预处理: -E2. 编译:-S3. 汇编:-c4. 链接g++ 的常用参数5. -D 定义对应的宏6. -I 用于编译时指定头文件的搜索路径7. -std 用来指示C++语言的标准版本8. -L:链接时需要查找库文件的路径9. -l:用于链接库文件(link 的首字母)10. 阅读全文
posted @ 2024-12-29 17:36 Jeffxue
摘要:C++中会常使用到宏来进行条件编译,或设置变量 1、__cplusplus:区分当前代码为 C++ 或 C // 定义只在C++中才进行 extern "C" 的操作 #ifdef __cplusplus extern "C" { #endif void fun(int a, int b); #if 阅读全文
posted @ 2024-08-28 14:09 Jeffxue
摘要:C++中常用的类型除了隐式转换,还有显示转换,如:static_cast, dynamic_cast, const_cast, reinterpret_cast。 其中隐式转换如常见的double、int、bool、float 等类型之间的转换。显示转换的用法具体如下: 一、static_cast: 阅读全文
posted @ 2024-08-22 16:12 Jeffxue
摘要:C++中函数指针表示指向函数的指针,其作用相当于函数的别名,通过函数指针可以直接调用对应的函数。 函数指针有两种表示方式,一种通过typedef进行声明,一种通过新的方式using来进行声明。 函数指针所指向的函数,其对应的形参个数、类型与返回值,都应该相同。 // FuncPtr1为函数指针,表示 阅读全文
posted @ 2024-08-21 14:29 Jeffxue
摘要:C++11中的智能指针主要分为3种:std::unique_ptr、std::shared_ptr,std::weak_ptr,存在于头文件 <memory>中。 对于智能指针的创建一般优先建议,分别使用 make_unique 和 make_shared,而不是使用new的指针来构建。这种方式创建 阅读全文
posted @ 2024-08-15 16:25 Jeffxue
摘要:C++中深拷贝与浅拷贝常见场景为类的 拷贝构造函数 与 赋值运算符重载 中。 其主要的区别在于指针成员的拷贝上,如果指针成员变量指向的内容位于动态申请的堆内存上,此时浅拷贝只是拷贝了指针变量,会造成多个指针指向同一块内存,当这些对象被析构时,就会造成多次释放同一块内存的问题,即 double fre 阅读全文
posted @ 2024-08-09 11:02 Jeffxue
摘要:C++中如果没有显式定义类的构造函数和赋值运算符,编译器会自动生成对应的函数,但是对于一些含有指针成员变量的类,自动生成的成员函数只会进行浅拷贝,会导致动态申请的内存在对象析构的时候double free,引起崩溃的问题。 因此如果没有必要,通常会禁用该接口,避免用户调用该接口造成问题。 禁用的方式 阅读全文
posted @ 2024-08-09 09:20 Jeffxue
摘要:std::vector 中不存在直接查找某个元素是否存在的方法,一般是通过 <algorithm> 中的 std::find, std::find_if, std::count, std::count_if 等方法的返回值来判断对应元素是否存在。 如当vector中存储的元素为 double 类型时 阅读全文
posted @ 2024-07-08 11:11 Jeffxue
摘要:在 C++ 引用头文件中,如在Debug模式下进行编译,可能此时本地环境中没有对应的 ***_d.lib 文件,只有 ***.lib,就会提示对应的错误信息。 如C++中Debug模式下 #include <Python.h> 会提示链接错误信息 无法打开文件“python311_d.lib”,此时 阅读全文
posted @ 2024-01-15 17:13 Jeffxue
摘要:C++ 程序有时需要统计一段代码的执行消耗时间,可以通过类 chrono 库来进行计算。该库中常常使用两个类来进行计算时间: std::chrono::steady_clock:表示稳定的时钟 std::chrono::system_clock:表示当前系统时钟 代码如下 #include <chr 阅读全文
posted @ 2024-01-11 15:52 Jeffxue
摘要:C++ 中的取模运算符 % 操作数是 int 类型,如果需要对 double 类型的数据进行取模操作,需要使用到 std::fmod(double, double) 如 x 对 y 进行取模操作, #include <cmath> double x = 6.2, y = 5.6; // 返回结果为: 阅读全文
posted @ 2024-01-03 17:26 Jeffxue
摘要:C++中产生随机数的方式有产生一个随机数和产生一系列不重复的随机数两种方式; 1. 产生单个随机数 通过 rand() 函数,需要先设置不同随机数种子,否则后面生成的每个随机数都一样,在此可以使用当前的时间作为种子。 #include <cstdlib> #include <random> sran 阅读全文
posted @ 2023-12-07 22:45 Jeffxue
摘要:C++中的枚举 enum使用如果没有对应的范围限定,会很容易出现重定义的错误。 如下的重定义错误,在一个文件中有如下两个枚举,编译时会出现重定义错误 enum Type { MIN_TYPE, MAX_TYPE, INPUT_TYPE }; enum Mode { CITY, INPUT_TYPE 阅读全文
posted @ 2023-12-03 23:22 Jeffxue
摘要:## 构造函数 C++的构造函数包含==一般构造函数==,==拷贝构造函数== 与 ==移动构造函数==。 #### 拷贝构造函数 1. 其中包含浅拷贝和深拷贝(此处以深拷贝为例),主要是通过将已存在的对象的所有成员拷贝给新对象,来实现对新对象的初始化。这样就会存在两个一样的对象,相当于内存中存在两 阅读全文
posted @ 2023-08-05 23:05 Jeffxue
摘要:### 析构函数可以为虚函数,且一般建议为虚函数。 在基类的析构函数为非虚析构函数的情况下: 当通过基类指针来指向派生类所`new`的对象,如果`delete`释放该指针的对象,将会只是释放基类的内存,而不会释放派生类的内存,从而导致内存泄漏。因为此时基类的析构函数为非虚析构函数,无法通过动态多态的 阅读全文
posted @ 2023-07-07 15:57 Jeffxue
摘要:### 左值 - 左值是一个==可以取取地址的变量==。 - 左值可以放在等号的左边,也可以放在等号的右边; - 通常情况下,**变量**,**对象成员**,以及**返回引用类型的函数调用**都是左值。 ```cpp // 1. 变量 int x = 10; // 'x' 是一个可修改的左值 int 阅读全文
posted @ 2023-07-07 13:59 Jeffxue
摘要:程序源代码被编译后主要分为两种段:程序指令 和 程序数据: 程序指令:代码段属于程序指令 程序数据:包括数据段.data 和 .bss 段 程序在内存空间上的布局如下图: 代码段(.text):这里存放的是CPU要执行的程序指令,代码是可共享的,相同的代码在内存中只有一份拷贝,同时这个段是只读的,防 阅读全文
posted @ 2023-07-07 11:47 Jeffxue