随笔分类 - C++
摘要:C++中会常使用到宏来进行条件编译,或设置变量 1、__cplusplus:区分当前代码为 C++ 或 C // 定义只在C++中才进行 extern "C" 的操作 #ifdef __cplusplus extern "C" { #endif void fun(int a, int b); #if
阅读全文
摘要:C++中常用的类型除了隐式转换,还有显示转换,如:static_cast, dynamic_cast, const_cast, reinterpret_cast。 其中隐式转换如常见的double、int、bool、float 等类型之间的转换。显示转换的用法具体如下: 一、static_cast:
阅读全文
摘要:C++中函数指针表示指向函数的指针,其作用相当于函数的别名,通过函数指针可以直接调用对应的函数。 函数指针有两种表示方式,一种通过typedef进行声明,一种通过新的方式using来进行声明。 函数指针所指向的函数,其对应的形参个数、类型与返回值,都应该相同。 // FuncPtr1为函数指针,表示
阅读全文
摘要:C++11中的智能指针主要分为3种:std::unique_ptr、std::shared_ptr,std::weak_ptr,存在于头文件 <memory>中。 对于智能指针的创建一般优先建议,分别使用 make_unique 和 make_shared,而不是使用new的指针来构建。这种方式创建
阅读全文
摘要:C++中深拷贝与浅拷贝常见场景为类的 拷贝构造函数 与 赋值运算符重载 中。 其主要的区别在于指针成员的拷贝上,如果指针成员变量指向的内容位于动态申请的堆内存上,此时浅拷贝只是拷贝了指针变量,会造成多个指针指向同一块内存,当这些对象被析构时,就会造成多次释放同一块内存的问题,即 double fre
阅读全文
摘要:C++中如果没有显式定义类的构造函数和赋值运算符,编译器会自动生成对应的函数,但是对于一些含有指针成员变量的类,自动生成的成员函数只会进行浅拷贝,会导致动态申请的内存在对象析构的时候double free,引起崩溃的问题。 因此如果没有必要,通常会禁用该接口,避免用户调用该接口造成问题。 禁用的方式
阅读全文
摘要:std::vector 中不存在直接查找某个元素是否存在的方法,一般是通过 <algorithm> 中的 std::find, std::find_if, std::count, std::count_if 等方法的返回值来判断对应元素是否存在。 如当vector中存储的元素为 double 类型时
阅读全文
摘要:在 C++ 引用头文件中,如在Debug模式下进行编译,可能此时本地环境中没有对应的 ***_d.lib 文件,只有 ***.lib,就会提示对应的错误信息。 如C++中Debug模式下 #include <Python.h> 会提示链接错误信息 无法打开文件“python311_d.lib”,此时
阅读全文
摘要:C++ 程序有时需要统计一段代码的执行消耗时间,可以通过类 chrono 库来进行计算。该库中常常使用两个类来进行计算时间: std::chrono::steady_clock:表示稳定的时钟 std::chrono::system_clock:表示当前系统时钟 代码如下 #include <chr
阅读全文
摘要:C++ 中的取模运算符 % 操作数是 int 类型,如果需要对 double 类型的数据进行取模操作,需要使用到 std::fmod(double, double) 如 x 对 y 进行取模操作, #include <cmath> double x = 6.2, y = 5.6; // 返回结果为:
阅读全文
摘要:C++中产生随机数的方式有产生一个随机数和产生一系列不重复的随机数两种方式; 1. 产生单个随机数 通过 rand() 函数,需要先设置不同随机数种子,否则后面生成的每个随机数都一样,在此可以使用当前的时间作为种子。 #include <cstdlib> #include <random> sran
阅读全文
摘要:C++中的枚举 enum使用如果没有对应的范围限定,会很容易出现重定义的错误。 如下的重定义错误,在一个文件中有如下两个枚举,编译时会出现重定义错误 enum Type { MIN_TYPE, MAX_TYPE, INPUT_TYPE }; enum Mode { CITY, INPUT_TYPE
阅读全文
摘要:## 构造函数 C++的构造函数包含==一般构造函数==,==拷贝构造函数== 与 ==移动构造函数==。 #### 拷贝构造函数 1. 其中包含浅拷贝和深拷贝(此处以深拷贝为例),主要是通过将已存在的对象的所有成员拷贝给新对象,来实现对新对象的初始化。这样就会存在两个一样的对象,相当于内存中存在两
阅读全文
摘要:### 析构函数可以为虚函数,且一般建议为虚函数。 在基类的析构函数为非虚析构函数的情况下: 当通过基类指针来指向派生类所`new`的对象,如果`delete`释放该指针的对象,将会只是释放基类的内存,而不会释放派生类的内存,从而导致内存泄漏。因为此时基类的析构函数为非虚析构函数,无法通过动态多态的
阅读全文
摘要:### 左值 - 左值是一个==可以取取地址的变量==。 - 左值可以放在等号的左边,也可以放在等号的右边; - 通常情况下,**变量**,**对象成员**,以及**返回引用类型的函数调用**都是左值。 ```cpp // 1. 变量 int x = 10; // 'x' 是一个可修改的左值 int
阅读全文
摘要:程序源代码被编译后主要分为两种段:程序指令 和 程序数据: 程序指令:代码段属于程序指令 程序数据:包括数据段.data 和 .bss 段 程序在内存空间上的布局如下图: 代码段(.text):这里存放的是CPU要执行的程序指令,代码是可共享的,相同的代码在内存中只有一份拷贝,同时这个段是只读的,防
阅读全文
摘要:测试当前网络是否可用的命令有 Ping 和 curl,由于在公司内网中使用 ping 会存在失败的情况,所以推荐使用 curl 命令来进行测试。 bool AccessNetworkTest() { FILE* fp = _wpopen(L"curl www.baidu.com", L"r"); w
阅读全文
摘要:有时调试需要在控制台输出 string(使用 printf), wstring(wprintf) 。但是当 wstring 中包含中文等Unicode字符时,wprintf就无法正确输出中文字符。 方法一、使用 _cwprintf来代替。 #include <iostream> #include <
阅读全文
摘要:目录一、数组的特征二、 一般数组声明与定义1、 栈上的数组(stack)2、堆上的数组(heap) —— 动态数组三、字符串的三种表示方式:四、字符数组来表示字符串1、C 风格字符串2、C 风格字串处理五、字符串的格式化 一、数组的特征 数组是存放类型相同的对象的容器,这些对象没有名称,只能根据其所
阅读全文
摘要:在C++中经常需要在不同类型字符串之间进行转换,常见的转换如下: 1. ==const char*== 与 ==char*== 之间转换 1) const char*转换成 char* const char* pSrc = "test"; // 方式1:强转 char* pDest_1 = (cha
阅读全文