
C++
文章平均质量分 93
莫彩
首先是一个人,然后是一个程序员
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【Modern C++ Part10】Prefer-scoped-enum-to-unscoped-enums
一般而言,在花括号里面声明的变量名会限制在括号外的可见性。但是这对于`C++98`风格的`enums`中的枚举元素并不成立。枚举元素和包含它的枚举类型同属一个作用域空间,这意味着在这个作用域中不能再有同样名字的定义。原创 2025-07-12 22:01:33 · 693 阅读 · 0 评论 -
【Modern C++ Part9】Prefer-alias-declarations-to-typedefs
摘要: C++11推荐使用声明别名(alias)而非typedef,尤其在模板编程中更具优势。声明别名可简化复杂类型定义,如函数指针类型。关键区别在于模板场景下:声明别名支持模板化(模板别名),而typedef需要嵌套在模板结构体中。模板别名无需像typedef那样使用::type后缀和typename前缀,代码更简洁。原创 2025-07-12 22:00:58 · 394 阅读 · 0 评论 -
【Modern C++ Part8】Prefer-nullptr-to-0-and-NULL
摘要:在C++中,应优先使用nullptr而非0或NULL表示空指针。0本质是整数类型,而NULL可能是整数或长整型,在重载函数中可能导致调用非预期的版本。nullptr具有std::nullptr_t类型,能隐式转换为任意指针类型,确保正确调用指针重载函数,并提升代码清晰度。在模板编程中,nullptr避免了类型推导错误,而0和NULL可能导致类型不匹配。因此,nullptr是更安全、更明确的选择。原创 2025-07-09 23:23:44 · 830 阅读 · 0 评论 -
【Modern C++ Part7】_创建对象时使用()和{}的区别
C++11引入了统一的{}初始化语法,旨在解决传统初始化方式的混乱和局限性。{}初始化具有三大优势:通用性(可用于任何初始化场景)、防止隐式类型转换、避免C++的二义性问题。然而,当类包含std::initializer_list构造函数时,{}初始化会强制优先匹配该构造函数,可能引发意外行为。例如,Widget w{10,5.0}可能因类型收窄而被拒绝,或调用非预期的构造函数。尽管存在这些特殊情况,{}初始化仍是更安全、更清晰的选择,尤其在默认构造(Widget w{})和容器初始化(vector<原创 2025-07-09 23:21:50 · 730 阅读 · 0 评论 -
【Modern C++ Part6】Use-the-explicitly-typed-initializer-idiom-when-auto-deduces-undesired-types
摘要: 条款6指出,当auto推导出非预期类型时应使用显式类型初始化。文中以std::vector<bool>为例,说明其operator[]返回的是std::vector<bool>::reference代理类而非bool&。当使用auto声明变量时,可能意外持有代理类对象而非期望的类型,导致未定义行为(如野指针问题)。解决方案是采用"显式类型初始化原则",即在auto声明时强制转换初始化表达式为期望类型,避免代理类带来的问题。原创 2025-07-08 15:53:58 · 739 阅读 · 0 评论 -
【Modern C++ Part5】Prefer-auto-to-explicit-type-declarations
摘要:条款5建议优先使用auto而非显式类型声明。auto能自动推导类型,避免未初始化变量、冗长的类型声明和类型截断问题。相比std::function,auto更高效且节省内存。在迭代器和容器操作中,auto能防止类型不匹配的错误。示例显示auto简化了代码,提高了可读性和正确性。原创 2025-07-08 10:59:26 · 549 阅读 · 0 评论 -
【Modern C++ Part4】Know-how-to-view-deduced-types
对类型推导结果的查看的工具的选择和你在软件开发过程中的相关信息有关系。我们要探讨三种可能:在你编写代码的时候,在编译的时候和在运行的时候得到类型推导的信息。原创 2025-07-07 19:21:42 · 888 阅读 · 0 评论 -
【Modern C++ Part3】Understand-decltype
本文讨论了C++中decltype的类型推导机制及其应用。decltype通常返回变量或表达式的确切类型,但在某些情况下会产生意外结果。文章通过示例展示了decltype的基本用法,并重点说明了其在模板函数返回值类型推导中的重要作用。 在C++11中,decltype常用于尾随返回类型,以声明依赖于参数的返回值类型。而C++14引入的decltype(auto)组合解决了模板类型推导中引用被忽略的问题,保留了表达式原有的类型特性。原创 2025-07-05 12:03:28 · 902 阅读 · 0 评论 -
【Modern C++ Part1】Understand-template-type-deduction
文章摘要 C++模板类型推导是现代C++的重要特性,分为三种情况: 非通用引用或指针:忽略引用部分,保留const属性。 通用引用(T&&):左值推导为左值引用,右值推导为普通类型。 值传递(非引用非指针):忽略引用和const/volatile属性。 auto的类型推导遵循相似的规则,理解模板类型推导有助于编写更高效的代码。原创 2025-07-04 10:53:23 · 844 阅读 · 0 评论 -
《Effective C++》第三部分:资源管理
所谓资源就是,我们可以向系统申请并使用的东西,但是将来必须归还给系统。说到这类东西,我们最容易想到的就是动态内存了,除此之外还包括文件描述器(file descriptors)、互斥锁(mutex locks)、数据库连接以及网络套接字。另外提到内存,不仅仅是 new 的基本对象,一些 new 出来的对象或者通过工厂方法得到的对象指针都是属于“内存资源”的范畴。原创 2022-10-17 17:56:07 · 517 阅读 · 0 评论 -
《Effective C++》第二部分:构造、析构、赋值运算
如果你自己没声明,编译器会为你声明拷贝构造函数、拷贝赋值运算符、默认构造函数和一个析构函数,所有这些函数都是 public 且 inline 的。首先对于默认构造函数和析构,编译器生成他们其实主要是为了自己使用。比如类含有虚函数时,自身的虚表要初始化,因此当程序员不写的时候,编译器需要自己弄出一个默认构造函数完成虚表的初始化。(其实在四种情况下编译器会声明默认构造函数,能不声明是编译器是不会干活的,比如当这些函数不会被调用的话,编译器就不会生成。但是这四种情况在这里不细说了,这个属于更高级的东西,我自己也没原创 2022-10-17 17:03:28 · 507 阅读 · 0 评论 -
《Effective C++》第一部分:让自己习惯C++
C 是一种简单的语言。它真正提供的只有有宏、指针、结构、数组和函数。不管什么问题,C 都靠宏、指针、结构、数组和函数来解决。而 C++不是这样。原创 2022-10-11 21:39:34 · 782 阅读 · 0 评论