
C++ 细枝末节
文章平均质量分 64
L-Super
路漫漫其修远兮
展开
-
C++ std::endl 与 \n 的区别
如果您正在编写真正需要立即查看的调试消息,那么这种区别非常重要。如果你想尽可能提高效率,使用\n。如果你对打印输出结果实时性要求不高,想立即看到打印的输出,使用std::endl。原创 2024-03-11 16:40:47 · 812 阅读 · 0 评论 -
C++ 打印enum class枚举类
C++11 中引入了强类型的enum class类型(或称为枚举类),但是有一点比较尴尬的是,std::cout标准流不支持输出enum class类型。E0349 没有与这些操作数匹配的 "原创 2024-02-24 14:43:49 · 3423 阅读 · 0 评论 -
C++ POD类型
POD 类型就是指能和 C 语言兼容的类型。在 C++ 20 后,POD 换成更研究的 Trivial Type(平凡类型)。总的来说,了解 POD 类型对于涉及到底层编程、内存管理和与 C 语言接口交互时会很有帮助。原创 2024-02-03 17:05:06 · 701 阅读 · 0 评论 -
C++ 智能指针实现之shared_ptr
智能指针本质上并不神秘,其实就是 RAII 资源管理功能的自然展现而已。本文将介绍如何实现 C++中智能指针的 shared_ptr。多个不同的shared_ptr不仅可以共享一个对象,在共享同一对象时也需要同时共享同一个计数。当最后一个指向对象(和共享计数)的shared_ptr析构时,它需要删除对象和共享计数。我们实现了一个基本完整的带引用计数的shared_ptr智能指针。从而对智能指针有一个比较深入的理解。当然,这里与标准的还欠缺一些东西,比如多线程安全、不支持自定义删除器以及和的配合。原创 2024-01-17 11:00:00 · 1274 阅读 · 0 评论 -
C++ 智能指针实现之unique_ptr
智能指针本质上并不神秘,其实就是 RAII 资源管理功能的自然展现而已。本文将介绍如何实现 C++中智能指针的 unique_ptr。自行实现一个 unique_ptr 相对比较简单,因为不涉及引用计数,只需要一个对象只能被单个unique_ptr所拥有。原创 2024-01-16 17:55:18 · 478 阅读 · 0 评论 -
C++ 11 常见新特性总结
可以说C++ 11 是全新的语言,因为它带来了很多的新特性,与C++98相比,完全像两个世界的产物,这里简要列出一些常见的特性。原创 2023-03-15 19:02:28 · 417 阅读 · 0 评论 -
C++ 二级指针的理解
指针一直很抽象,不是很容易理解,尤其是二级指针。原创 2023-03-04 21:37:36 · 449 阅读 · 0 评论 -
C++ 20 source_location 分析
C++20推出了类,用于记录文件名、行号以及函数名。在C++20之前,一般使用__FILE____LINE__的预定义宏调用方式。原创 2023-02-05 17:55:08 · 1045 阅读 · 0 评论 -
Pimpl 与 unique_ptr 的问题
error: invalid application of ‘sizeof’ to incomplete type ‘CM::MemoryPrivate’ 79 | static_assert(sizeof(_Tp)>0原创 2022-11-14 21:30:18 · 586 阅读 · 0 评论 -
C++ 原子操作 atomic 的一些思考
在赋值、比较过程中,是原子操作吗?为了验证结果,这里写了一个demo用来验证a == 1和a = 1过程中,是否也是原子操作。原创 2022-10-18 18:25:52 · 1601 阅读 · 0 评论 -
C++ 字符编码
C++ 支持各种字符串和字符类型,并提供表示每种类型的文本值的方法。在源代码中,使用字符集表示字符和字符串文本的内容。通用字符名称和转义字符允许你仅使用基本源字符集表示任何字符串。原始字符串使你可以避免使用转义字符,可以用于表示所有类型的字符串。还可以创建文本,而无需执行额外的构造或转换步骤。字符串文本可以具有u8、L、u和U前缀以分别指示UTF-8、宽字符(UCS-2 或 UTF-16)、UTF-16 和 UTF-32 编码。原始字符串文本可以具有R、u8R、LR、uR和UR。转载 2022-09-03 22:54:02 · 1782 阅读 · 0 评论 -
C++之Most Vexing Parse
这是一个经典的二义性问题,针对这种问题,我们应该避免写出这种代码,如果写出来了,可以采用文中两种方案来进行解决,从而避免歧义。原创 2022-08-14 17:36:55 · 173 阅读 · 0 评论 -
C++ 类Pimpl手法
类pimpl手法,它通过写一个含有纯虚函数的C类,B类包含C类成员,同时A类继承C类,重写纯虚函数。这样在B类中调用C类成员函数时,最终调用的是A类的成员函数。个人认为好处是,与pimpl一致,提高了封装性,减少了A类的接口暴露,也提高了编译速度。pimpl是封装了数据成员,而类pimpl手法则是封装了成员函数。......原创 2022-07-29 17:45:43 · 326 阅读 · 0 评论 -
C++ Pimpl手法代码实现
pimpl 惯例是一种新式 C++ 技术,用于隐藏实现、最小化耦合和分离接口。原创 2022-06-14 14:47:28 · 175 阅读 · 0 评论 -
探索 std::move
C++里通常分为左右值,但标准里更细化这里需要明确右值的概念:纯右值 prvalue 是没有标识符、不可以取地址的表达式,一般也称之为“临时对象”。最常见的情况有:返回非引用类型的表达式,如 x++、x + 1、make_shared(42)除字符串字面量之外的字面量,如 42、trueC++11 开始,C++ 语言里多了一种引用类型—右值引用。右值引用的形式是 T&&,比左值引用多一个 & 符号。我们使用右值引用的目的是实现移动,而实现移动的意义是减少运行的开销原创 2022-04-27 14:02:20 · 1624 阅读 · 0 评论 -
C++ 打印类的继承关系和虚函数表结构信息
首先创建一个demo//demo vptr.cpp#include <iostream>class Base { public: virtual void funcA() { std::cout << "Base::funcA" << std::endl; } virtual void funcB() { std::cout << "Base::funcB" << std::endl; }};class A :原创 2022-05-13 15:51:56 · 737 阅读 · 0 评论 -
C++ new 对象的时候,加括号与不加的区别
在代码中时常会遇到两种new的形式A* a = new A;//①A* a = new A();//②那么,这两者有何区别吗?结论先给出结论:当A类无构造函数,有数据成员的情况下,有区别。①的数据成员为随机值,而②的数据成员会被初始化。当A类有构造函数,有数据成员的情况下,无区别。数据成员都为随机值,因为此时,初始化由构造函数去执行。如果A是空类,那么以上两种写法没有区别。另外基本数据类型的情况如下:int *a1 = new int;//初值随机int *a2 = new in原创 2022-05-20 15:56:49 · 616 阅读 · 0 评论