C/C++
文章平均质量分 74
C/C++
another heaven
这个作者很懒,什么都没留下…
展开
-
【C/C++ 宏定义和typedef的区别及代码示例】越是基础的东西越容易被忽视
定义方式与作用时机使用#define预处理指令进行定义。在预处理阶段(编译之前)进行文本替换,不进行类型检查。宏定义是预处理器指令,不是C/C++的语句,因此末尾不加分号。是C/C++的一个关键字,用于定义新的类型别名。在编译阶段生效,编译器会进行类型检查。typedef定义的是类型别名,因此使用时要加分号表示语句结束。功能与用途主要用于定义常量、简化代码或进行条件编译等。可以进行简单的文本替换,但可能会因为运算符优先级等问题导致意外的结果。原创 2024-07-07 10:00:00 · 431 阅读 · 0 评论 -
【C/C++ 宏定义和函数的区别及代码示例】越是基础常用的东西越容易被忽视
处理时机:宏定义:在预处理阶段处理,即编译器在编译之前将宏定义中的代码直接替换到程序中。这意味着宏定义并不占用程序运行时的内存或执行时间,但它可能会增加编译后的代码大小。函数:在程序运行时被调用和执行。函数执行时需要占用内存(调用栈等)和时间。参数检查:宏定义:不进行类型检查,仅进行文本替换。如果宏的参数在替换后产生了不期望的结果(如运算符优先级问题),可能会导致难以发现的错误。函数:进行严格的类型检查,确保传递给函数的参数类型正确。原创 2024-07-05 20:00:00 · 350 阅读 · 0 评论 -
【C/C++ new/delete和malloc/free的异同及原理】
new是类型安全的,malloc不是。//编译错误//编译无错误new调用名为operator new的标准库函数分配足够空间并调用相关对象的构构造函数,delete对指针所指对象运行适当的析构函数,然后通过调用名为perator delete的标准库函数释放该对象所用内存。后者均没有相关调用。new是封装了malloc,直接free不会报错,但是这只是释放内存,而不会析构对象new和delete是如何实现的?原创 2024-07-04 20:00:00 · 823 阅读 · 0 评论 -
【COM/ATL 运用ATL工程创建和调用COM组件】
ATL (Active Template Library) 是一个用于简化 COM (Component Object Model) 组件开发的库。使用 ATL,你可以创建 COM 对象,这些对象可以跨进程和跨机器进行通信。下面是一个简单的步骤,说明如何使用 ATL 创建一个简单的 COM 组件,并在另一个程序中使用它。然后在你的 ATL 类中实现这个方法:步骤 3: 注册 COM 组件编译你的 ATL 项目后,你需要注册你的 COM 组件。这通常可以通过运行生成的 DLL 或 EXE 文件的 /R原创 2024-06-15 19:13:01 · 314 阅读 · 0 评论 -
【C++11 之单例模式线程安全原理+案例】及旧版本互斥锁线程安全案例
在C++11之前,通常我们会使用互斥锁(如pthread_mutex_t在POSIX线程中,或者在C++标准库中使用std::mutex,尽管std::mutex是C++11引入的,但这里我们可以假设我们有一个兼容的互斥锁实现)来保证单例模式的线程安全。请注意,在上面的代码中,我们使用了pthread_mutex_t作为互斥锁,并使用pthread_mutex_lock和pthread_mutex_unlock函数来加锁和解锁。在C++11及之后的版本中,它被广泛用于实现线程安全的单例。原创 2024-06-29 10:00:00 · 917 阅读 · 0 评论 -
【C++11 之新增容器 array、foward_list、tuple、unordered_(multi)map/set】应知应会
std::array 是一个固定大小的数组容器,它在栈上分配内存,并提供了类似于标准库容器的接口。它提供了更好的类型安全性和范围检查,同时保持了与原生数组相似的性能。std::array 的大小必须在编译时确定,并且不能更改。std::forward_list 是一个单向链表容器,它提供了高效的插入操作(在链表头部插入元素为常数时间)。与 std::list 相比,它只支持前向迭代,不支持双向迭代,因此其空间效率更高。原创 2024-06-23 20:59:25 · 373 阅读 · 1 评论 -
【C++11 之强类型枚举enum class/struct 基本结构及应用场景】了解在enum基础上增加了什么
/ 声明一个名为 Color 的强类型枚举,底层类型为 unsigned intRED, // 枚举值,通常是大写的GREEN,BLUE,// 可以有其他枚举值// 使用枚举类// 使用枚举类的作用域解析运算符 :: 来指定枚举值// ... 其他代码 ...return 0;原创 2024-06-22 12:01:47 · 316 阅读 · 0 评论 -
【C++11 之nullptr关键字 用以消除空指针和0歧义】基础知识必须了解
它的类型是 std::nullptr_t,这是一个新的内置类型,可以隐式转换为任何指针类型,但不能转换为非指针类型(如整数)。因此,使用 nullptr 可以消除上述的歧义。引入 nullptr 的主要目的是解决使用 NULL 或 0 时可能产生的歧义,并提供一个更清晰、更明确的空指针常量表示。此外,nullptr 还与 C++ 的其他语言特性(如模板和类型安全)更好地集成,从而提高了代码的安全性和可靠性。但是,使用 0 作为空指针常量有一个问题:0 既可以表示整数零,也可以表示空指针。原创 2024-06-22 12:00:49 · 270 阅读 · 0 评论 -
【C++11 之auto 自动类型推导】一个你必须知道的基础知识
auto 关键字背后的原理是,编译器会查看变量的初始化表达式,并确定该表达式的类型。然后,编译器将该类型应用于 auto 声明的变量。在上面的代码中,y 被自动推导为 int 类型,因为 x 是 int 类型的。原创 2024-06-21 17:42:37 · 244 阅读 · 0 评论 -
【c++11 之智能指针2 unique、shared、weak *_ptr 原理及案例】及四种智能指针对比分析
熟悉C++11引入的三种智能指针的原理及判断使用场景;理解unique_ptr对auto_ptr的替换;三种指针都是将一些释放操作自动化实现,也可以自己手写智能指针;一张表格分辨四种智能指针:auto_ptr (已废弃)unique_ptrshared_ptrweak_ptr所有权独有(但有问题的拷贝语义)独有共享(引用计数)不拥有(观察)拷贝语义转移所有权(可能导致问题)禁止拷贝,但可以移动引用计数增加不支持赋值语义转移所有权(可能导致问题)原创 2024-06-21 17:41:37 · 1650 阅读 · 0 评论 -
【C++98 智能指针1 auto_ptr的原理及代码案例】已弃用!!
std::auto_ptr 是 C++98 引入的一个简单的独占所有权智能指针,但在 C++11 中已经被弃用(deprecated),并在 C++17 中被移除。这是因为 std::auto_ptr 在所有权转移时的行为(特别是通过赋值和复制操作)可能导致意外的结果和难以调试的问题。原创 2024-06-18 17:45:57 · 235 阅读 · 0 评论 -
【C++17 之 .base() 函数实现正向和反向迭代器之间的交换,原理及代码展示】接上一p
我前期看过一位博主的关于正向迭代器和反向迭代器的图解描述,至今仍印象深刻,稍后我找到了会更新链接,方便大家理解。原创 2024-06-18 17:45:05 · 518 阅读 · 0 评论 -
【C++11 之rbegin()、rend() 反向迭代器原理介绍及 重点-限制情况】与正向迭代器对比(互换放在下一p)
反向迭代器是一种特殊的迭代器,它允许我们按照与正向迭代器相反的顺序遍历容器。也就是说,如果我们使用正向迭代器从容器的开始遍历到结束,那么使用反向迭代器就是从容器的结束遍历到开始。原创 2024-06-15 19:30:35 · 820 阅读 · 0 评论 -
【C++11 之lambda表达式-语法+值传递、引用传递+应用场景】附匿名函数
capture-list:捕获列表,用于捕获外部作用域中的变量。parameter-list:参数列表,和普通函数的参数列表一样。return-type:返回类型,当函数体中的表达式类型可以明确推断出时,可以省略。function-body:函数体,包含函数实现的代码。原创 2024-06-14 17:03:54 · 1446 阅读 · 0 评论 -
【C++11 之 emplace_back 原理、使用、与push_back对比】
当你可以在容器的末尾直接构造元素时,应该优先考虑使用 emplace_back 而不是 push_back,因为它通常可以提供更好的性能。然而,请注意,不是所有的 STL 容器都支持 emplace_back(例如 std::list),所以在使用时应该检查你所使用的容器的文档。原创 2024-06-14 17:03:07 · 523 阅读 · 0 评论 -
【三级指针、二级指针、一级指针、指针值】原理+超直白说明/总结(当然,还是会有点涩~)
毕竟它是指针当我们想要修改某个指针指向的指针值时,如果是当前函数(一级函数),则可以直接修改;当我们想要在函数的函数(二级函数)里面修改时,则可以通过传递二级指针修改;当我们想要在函数的函数的函数(三级函数)里面修改时,则可以通过传递三级指针修改;balbal~~记住,你虽然代码传递的是某级指针,但原理只是传递某级指针值,更简要的说,函数参数传递的本质是“值传递”;原创 2024-06-06 11:42:53 · 1742 阅读 · 0 评论 -
【C++11 之右值和移动语义(本质+应用场景+代码)】
右值中比较重要的部分是两个:右值引用和移动语义。原创 2024-04-24 21:30:00 · 309 阅读 · 0 评论