
《C++ 进阶心法 V2》
文章平均质量分 89
一本介绍 C++ 进阶知识的开源书籍。
恋喵大鲤鱼
一条不止于编码的鱼。
展开
-
C++ 内存池介绍与经典内存池的实现
内存池(Memory Pool)是一种内存分配方式。通常我们习惯直接使用new、malloc等API申请内存,这样做的缺点在于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。原创 2015-11-01 00:04:38 · 43504 阅读 · 27 评论 -
C++ 数据类型转换详解之终极无惑
(1)综上所述,数据类型转换相当于一次函数调用。调用的的结果是生成了一个新的数据实体,或者生成一个指向原数据实体但解释方式发生变化的指针(或引用)。(2)编译器不给出任何警告也不报错的隐式转换总是安全的,否则必须使用显示的转换,必要时还要编写类型转换函数。(3)使用显示的类型转换,程序猿必须对转换的安全性负责,这一点可以通过两种途径实现:一是利用C++语言提供的数据类型动态检查机制;而是利用程序的内在逻辑保证类型转换的安全性。(4)只能用于含有虚函数的类。原创 2015-08-18 13:53:27 · 9123 阅读 · 9 评论 -
C++ static 关键字
在类中声明的成员变量或成员函数如果使用 static,那么它们属于类本身,而不是类的某个实例。静态成员可以在没有创建类实例的情况下访问,且所有实例共享同一份静态成员数据。public:// 静态成员变量// 静态成员变量的定义// 输出 Count: 2return 0;原创 2025-01-16 17:22:04 · 372 阅读 · 0 评论 -
分离编译模式简介
分离编译模式源于C语言,在C++语言中继续沿用。简单地说,分离编译模式是指一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件(obj文件),最后将所有目标文件连接起来形成单一的可执行文件的过程。原创 2015-10-03 16:54:58 · 2325 阅读 · 0 评论 -
C/C++ 变参函数
目前大部分主流编译器的最新版本均支持了C++11标准(官方名为ISO/IEC14882:2011)大部分的语法特性,其中比较难理解的新语法特性可能要属。原创 2016-11-21 13:02:13 · 5923 阅读 · 1 评论 -
C++ new 的三种面貌
C++ 中使用 new 运算符产生一个存在于 Heap(堆)上的对象时,实际上调用了 operator new() 函数和 placement new() 函数。原创 2015-05-05 00:19:17 · 4308 阅读 · 6 评论 -
C++ 继承与组合的区别
C++ 程序开发中,设计孤立的类比较容易,设计相互关联的类却比较难,这其中会涉及两个概念,一个是继承(Inheritance),一个是组合(Composition)。因为二者有一定的相似性,往往令程序员混淆不清。类的组合和继承一样,是软件重用的重要方式。组合和继承都是有效地利用已有类的资源。但二者的概念和用法不同。原创 2017-02-13 13:45:04 · 6562 阅读 · 3 评论 -
C++ 头文件的作用和用法
示例代码编译运行环境:Windows 64bits+VS2017+Debug+Win32。头文件是 C/C++ 程序不可或缺的组成部分,我们需要了解头文件的作用和相关规范。原创 2015-10-03 13:03:26 · 44603 阅读 · 6 评论 -
C++ endl 的本质
除了利用系统预定义的操纵符来进行IO格式的控制外,用户还可以自定义操纵符来合并程序中频繁使用的IO读写操作。定义形式如下:ostream &操纵符名(ostream &s) {// 自定义代码return s;istream &操纵符名(istream &s) {// 自定义代码return s;// 编号格式如:0000001return s;// 要求输入的数为十六进制数return s;int a;std::cout原创 2015-11-22 21:31:16 · 22585 阅读 · 9 评论 -
C++ inline 函数
inline 函数由 inline 关键字定义,引入 inline 函数的主要原因是用它替代 C 中复杂易错、不易维护的宏函数。原创 2016-07-31 22:39:37 · 39971 阅读 · 15 评论 -
C++ 引用的本质
引用是 C++ 引入的重要特性,它使原来在 C 中必须用指针实现的功能有了另一种实现的选择,在书写形式上更为简洁。那么引用的本质是什么,它与指针又有什么关系呢?原创 2015-07-08 16:33:22 · 18787 阅读 · 28 评论 -
C++ 操作符重载形式——成员函数 or 友元函数
运算符重载是C++多态的重要实现手段之一。通过运算符重载对运算符功能进行特殊定制,使其支持特定类型对象的运算,执行特定的功能,增强C++的扩展功能。运算符重载的我们需要坚持四项基本原则: (1)不可臆造运算符; (2)运算符原有操作数的个数、优先级和结合性不能改变; (3)操作数中至少一个是自定义类型; (4)保持重载运算符的自然含义。一般来说,C++运算符重载可采用成员函数和友元函数,二者原创 2017-02-10 16:39:50 · 4961 阅读 · 10 评论 -
C++ 异常处理的开销
C++ 异常是 C++ 有别于 C 的一大特性 ,异常处理机制给开发人员处理程序中可能出现的意外错误带来了极大的方便,但为了实现异常,编译器会引入额外的数据结构与处理机制,增加了系统的开销。天下没有免费的午餐,使用异常时我们必须了解其带来的开销和问题。原创 2018-08-06 23:07:54 · 2756 阅读 · 0 评论 -
C++ 使用引用捕获异常
catch子句捕获异常时既可以按值传递,也可以按照引用传递,甚至按照指针传递,但推荐使用引用捕获异常。考察如下程序:#include <iostream>using namespace std;class Base{public: Base() { cout << "Base's constructor" << ...原创 2018-08-06 20:46:46 · 2691 阅读 · 2 评论 -
C++ 为什么引入异常处理机制
另一方面,库的用户知道怎样处理这些错误,但却无法检查它们何时发生(如果能检测,就可以在用户的代码里处理了,不用留给库去发现)。setjmp()函数可在程序中存储一典型的正常状态,如果程序发生错误,longjmp()可恢复setjmp()函数的设定状态,从而实现goto语句无法实现的“长跳转”。(2)以后调用longjmp(j,r)的效果就是一个非局部的goto跳转或“长跳转”,程序将跳转到由j描述的上下文处(也就是到那原来设置j的setjmp()处)。取而代之的是那些传统的 C 的异常处理方法。原创 2015-11-28 20:57:58 · 3544 阅读 · 0 评论 -
C++ 以智能指针管理内存资源
C++ 作为一门应用广泛的高级编程语言,却没有像 Java、C# 等语言拥有垃圾回收(Garbage Collection )机制来自动进行内存管理,这也是C++ 一直被诟病的一点。C++ 在发展的过程中,一直致力于解决内存泄漏,C++ 虽然基于效率的考虑,没有采用垃圾回收机制,但从 C++98 开始,推出了智能指针(Smart Pointer)来管理内存资源,以弥补 C++ 在内存管理上的技术空白。原创 2018-10-13 16:52:38 · 1627 阅读 · 1 评论 -
C++ 模板特化与偏特化
文章目录1.模板特化1.1 概述1.2 函数模板特化1.3 类模板特化2.模板偏特化2.1 概述2.2 函数模板偏特化2.3 类模板偏特化3.模板类调用优先级参考文献1.模板特化1.1 概述模板特化(template specialization)不同于模板的实例化,模板参数在某种特定类型下的具体实现称为模板特化。模板特化有时也称之为模板的具体化,分别有函数模板特化和类模板特化。1.2 函数模板特化函数模板特化指函数模板在模板参数为特定类型下的特定实现。查看以下示例:#include <i原创 2018-08-29 10:25:57 · 25236 阅读 · 17 评论 -
C++ 智能指针简介
智能指针有时需要将其管理的对象的所有权转移给其它的智能指针,使得多个智能指针管理同一个对象,比如C++ STL中的shared_ptr支持多个智能指针管理同一个对象。这个时候智能指针就需要知道其引用的对象总共有多少个智能指针在引用在它,也就是说智能指针所管理的对象总共有多少个所有者,我们称之为引用计数(Reference Counting),因为智能指针在准备释放所引用的对象时,如果有其他的智能指针同时在引用这个对象时,则不能释放,而只能将引用计数减一。原创 2016-11-19 19:11:20 · 3001 阅读 · 1 评论 -
C++ 关于 main 函数的几点说明
main函数是C++程序的入口函数,C++标准要求main()函数的返回值类型为int。1.函数内并可以不出现return语句当main()函数的返回值为int,而函数内并没有出现return语句时,同样可以通过编译并正常运行。这是因为编译器在main()函数的末尾自动添加了return 0;的语句。所以,main()函数是C++程序经过特殊处理的函数。原创 2015-10-22 12:49:18 · 11706 阅读 · 3 评论 -
C++ STL 四种智能指针
auto_ptrunique_ptrshared_ptrweak_ptrauto_ptr 是 C++98 提出的,C++11 已将其摒弃,并提出了 unique_ptr 替代 auto_ptr。虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用更加安全的 unique_ptr,后文会详细叙述。shared_ptr 和 weak_ptr 则是 C+11 从准标准库 Boost 中引入的两种智能指针。原创 2018-08-07 11:25:13 · 75015 阅读 · 25 评论 -
C++ 仿函数
仿函数(Functor)又称为函数对象(Function Object)是一个能行使函数功能的类。仿函数的语法几乎和我们普通的函数调用一样,不过作为仿函数的类,都必须重载 operator() 运算符。因为调用仿函数,实际上就是通过类对象调用重载后的 operator() 运算符。如果编程者要将某种“操作”当做算法的参数,一般有两种方法:(1)一个办法就是先将该“操作”设计为一个函数,再将函数指针当做算法的一个参数。上面的实例就是该做法;原创 2018-09-23 01:12:49 · 34597 阅读 · 12 评论 -
C++ 纯虚函数与抽象类
可以毫不夸张地说虚函数是C++最重要的特性之一,我们先来看一看虚函数的概念。virtual函数返回值类型虚函数名(形参表){函数体}为什么说虚函数是C++最重要的特性之一呢,因为虚函数承载着C++中动态联编的作用,也即多态,可以让程序在运行时选择合适的成员函数。虚函数必须是类的非静态成员函数(且非构造函数),其访问权限是public。那么:(1)为什么类的静态成员函数不能为虚函数?原创 2018-09-22 17:10:36 · 658 阅读 · 1 评论 -
C++ 类成员指针
成员指针是 C++ 引入的一种新机制,是指向类成员的指针,你可以使用它们来访问类的成员变量和成员函数,包括公有、私有和保护成员。它的申明方式和使用方式都与一般的指针有所不同。成员指针分为成员变量指针和成员函数指针。原创 2015-10-28 16:54:53 · 8272 阅读 · 8 评论