从 C 向 C++ 进阶
本专栏将介绍如何在 C 语言的基础上进一步学习 C++ 语言,适合有一定 C 语言知识的同学学习参考。
☆星轨★
人生苦短,只争朝夕。
展开
-
【从 C 向 C++ 进阶】系列导航
1. 前言想写关于 C++ 的博文挺久的了,而本人也在有道云笔记上记录了一系列关于学习 C++ 的笔记,因此何不把这些笔记整理成较系统的博文分享出来,让大家一起进步呢?带着这个想法,撰写《从 C 向 C++ 进阶》系列博文正式启动。本系列适合于有一定 C 语言基础,并想进一步学习 C++ 的同学。系列主要分为三子系列:类、对 C 的语法扩展、STL 库。其中,《类》子系列将深入浅出介绍关于类...原创 2019-07-07 18:02:05 · 680 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 对 C 的语法拓展 - 异常处理
从 C 向 C++ 进阶系列导航1. C++ 新增的异常处理在 C++ 中新增了异常处理语法 try\catch,try 语句处理正常代码逻辑,catch 语句处理异常情况,通过 throw 语句可以抛出异常信息然后由相对应的 catch 语句处理。具体语法如下:try{ ...}catch{ ...}需要注意的是,throw 语句会由于发生地方的不同而表现出...原创 2019-10-26 21:41:05 · 151 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 28. 单例模式类模版
从 C 向 C++ 进阶系列导航1. 单例模式类单例模式类的含义是在整个程序生命周期中,只能存在一个对象。那么怎么限定编译器只能生成一个类对象呢?我们可以借用 static 成员的全局特性,作为是否已存在类对象的标志。具体实现方法是:将构造函数的访问属性设置为 private,定义 symbol 并初始化为 NULL;当需要使用对象时,先访问 symbol 的值,如果是空值,那么便创建对...原创 2019-10-15 21:17:30 · 147 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 27. 简单数组类模版
从 C 向 C++ 进阶系列导航1. 数值型模版参数模板参数除了有数据类型外,还有数值类型。声明方法如下:template <Type N>...其中,Type 为显式的数据类型,一般为 int。使用数值型模板参数有以下限制:变量不能作为模板参数。浮点数不能作为模板参数。类对象不能作为模板参数。数值型模板参数本质是模板参数是在编译阶段被处理的单元,因此在编译阶...原创 2019-10-13 11:12:28 · 168 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 15. 简单的智能指针
从 C 向 C++ 进阶系列导航1. 智能指针简介为了解决可能发生的内存泄漏问题,C++ 提出了智能指针的概念。智能指针本质上为类对象,具备以下特征:生命周期结束时,自动释放指向的内存空间。只能指向堆空间的内存,不能指向其他空间的内存,因为只有堆空间内存的生命周期是可控的。多个智能指针不能指向同一内存空间,防止重复对相同的内存释放。智能指针不准许进行运算与比较。2. 实现...原创 2019-07-21 19:00:58 · 196 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 14. string 类
从 C 向 C++ 进阶系列导航1. string 类在 C 中,对于字符串的实现采用的是字符数组的方式,并非真正意义上的字符串。因此,C++ 标准库提供了 string 类来实现真正意义上的字符串。string 具备以下特性:支持字符串直接连接,即具备 strcat 函数功能。支持字符串的大小直接比较,即具备 strcmp 函数功能。支持子串直接查找和提取,即具备 strstr...原创 2019-07-21 18:58:38 · 175 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 13. 初识 C++ 标准库
从 C 向 C++ 进阶系列导航1. C++ 标准库简介C++ 标准库(C++ Standard Library),是类库和函数的集合。C++ 编译器厂商根据 C++ 标准委员会官方的 ISO 规范并将其转化为代码。C++ 编译器厂商在实现 C++ 标准库过程中必须依赖其不同操作系统所提供的系统调用接口,因此每个平台都有其自己的 C++ 标准库实现。C++ 标准库的特点如下:C++ 标...原创 2019-07-21 11:12:36 · 133 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 12. 运算符重载进阶
从 C 向 C++ 进阶系列导航1. 重载赋值运算符在需要深拷贝时,除了需要定义拷贝构造函数外,还需要自定义重载运算符 “=” 函数,因为类中默认提供的 “=” 为浅拷贝。在重载运算符 “=” 函数中,必须遵循以下规则:函数返回类型必须为类引用类型。函数形参必须为 const 修饰的类引用类型函数内部必须检查形参对象与函数调用者是否相同,相同是直接返回 *this 或形参对象。...原创 2019-07-21 11:07:00 · 161 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 11. 运算符重载
从 C 向 C++ 进阶系列导航1. 类成员函数重载重载函数的特点如下:重载函数的本质为多个不同的函数。重载函数的函数名和参数列表是唯一标识符。函数重载必须发生在同一个作用域中。类成员函数也允许重载,但只能与同一类内的成员函数构成重载,不能与全局函数或其它类的成员函数构成重载。2. 运算符重载简介为了能够像操作变量一样操作对象,C++ 提高了运算符重载,使用重载后的运算...原创 2019-07-21 10:51:55 · 405 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 10. 友元
从 C 向 C++ 进阶系列导航1. 友元简介友元是 C++ 中的一种关系,友元关系发生在函数与类之间或者类与类之间。友元能够了忽略类的封装属性,即不受访问属性的限制,直接访问类的成员变量或成员函数。友元具备以下特征在类中以 friend 关键字声明友元。友元可以是其它类或具体函数。友元不受类中访问级别的限制,可以直接访问具体类的所有成员。友元不是类的一部分,仅是一种关系的声明。...原创 2019-07-21 10:27:19 · 144 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 18. 类的继承
从 C 向 C++ 进阶系列导航1. 类的继承类之间可以存在继承关系,又称父子关系,父类又称为基类,子类又称为派生类。父子类之间有以下特点:子类拥有父类的所有属性和行为。子类对象可以当父类对象使用,可增加父类没有的属性和方法。子类对象可以直接初始化为父类对象。子类对象可以直接赋值给父类对象。继承的形式如下:class Parent{ ...};class ...原创 2019-07-28 21:30:41 · 236 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 19. 虚函数
从 C 向 C++ 进阶系列导航1. 函数重写对于子类中与父类成员函数同名的成员函数,称其为子类的重写函数。函数重写一般发生在父类的成员函数不满足需求的情况下。同时,父子类是相互兼容的:子类对象可以直接赋值给父类对象。子类对象可以直接初始化父类对象。父类指针可以指向子类对象。父类引用可以引用子类对象。子类可以当作父类使用。但当使用父类类型的指针(或引用)调用子类的重写函...原创 2019-07-28 21:43:36 · 179 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 21. 纯虚函数
从 C 向 C++ 进阶系列导航1. 抽象类与纯虚函数抽象类为无实例的类,提出抽象类的意义是满足现实中一些概念的定义,例如:图形、人、动物等。抽象类不能用于创建对象,只能用于作为父类继承。抽象类通过纯虚函数实现,凡拥有纯虚函数的类均称为抽象类。纯虚函数是指只声明函数原型不定义实现的成员函数,声明方法为:virtual void fun() = 0;其中“= 0”是用于告诉编译器当前是...原创 2019-08-13 22:11:19 · 155 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 23. 构造、析构与虚函数
从 C 向 C++ 进阶系列导航1. 构造、析构与虚函数可否想过,构造函数和析构虚函数可以声明为虚函数吗?答案是,构造函数不能声明为虚函数,而析构函数可以声明为虚函数。虚函数表指针的初始化是发生在构造函数完成之后的,因此,把构造函数编译为虚函数是无意义的。编译时会直接报错。当类作为父类时,应声明析构函数为虚函数。因为对于堆上的类对象,使用关键字 delete 释放堆空间时,假设父类的析构...原创 2019-08-19 21:10:23 · 139 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 22. 多继承
从 C 向 C++ 进阶系列导航1. 多重继承C++ 支持多重继承。所谓的多重继承指的是子类同时继承多个父类,此时子类拥有所有父类的所有成员。继承方式如下:class Derived : public Baes_A, public Baes_B{ ...}多重继承会造成不同的父类指针(或引用)指向(或引用)子类对象时,实际所指向(或引用)的子类地址不一致。如此一来,假设程...原创 2019-08-15 21:05:25 · 169 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 24. 函数模版
从 C 向 C++ 进阶系列导航1. 函数模版C++ 中提出了函数模板的概念。函数模板可以看作是具备类型检查的宏,并可适配任意的数据类型。这也是泛型编程的思想,即不考虑具体数据类型的编程方式,具体的数据类型由调用者决定。函数模板定义方式如下:template <typename T>Type Funname(T x){ ...}其中,template 告诉编译...原创 2019-08-27 21:39:08 · 138 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 25. 类模版
从 C 向 C++ 进阶系列导航1. 类模版C++ 提供了类模板。与函数模板相同,类模板本质也是数据类型的替换,在定义类对象时指定数据类型可以控制类中的数据类型等。类模板定义方式如下:template <typename T>class ClassName{ ...}类模板也会进行二次编译。第一次为类模板本身的编译,第二次为数据类型替换后的类编译,每定义一个类...原创 2019-10-01 10:50:19 · 195 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 26. 模板特化
从 C 向 C++ 进阶系列导航1. 多参数类模版类模板支持多个泛型参数,使用方式与函数模板基本一致。实验:template <typename T1, typename T2>class Operator{public: T2 add(T1 a, T2 b); T1 minus(T1 a, T1 b);};template <typen...原创 2019-10-03 15:44:59 · 211 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 20. C++ 对象模型
从 C 向 C++ 进阶系列导航1. C++ 对象模型class 类对象的内存分布与 struct 结构体对象的内存分布相同,即遵循内存对齐原则。同时,类对象的内存中只保存成员变量,而成员函数保存在代码段。那么程序中是怎么通过成员对象来调用对应的成员函数呢?实际上,在调用成员函数时,编译器会把对象的地址隐式传递给成员函数,成员函数中用隐式形参指针 this 来接收对象地址,这个传递过程是隐...原创 2019-07-29 22:22:51 · 173 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 17. 类的提前声明
从 C 向 C++ 进阶系列导航1. 问题描述在我做类型转换函数博文中最后的实验时,一直遇到了 “error: invalid use of incomplete type ‘class Test_B’” 这个编译错误,报错的源码如下:class Test_B;class Test_A{private: int m_var;public: Test_A(int num) ...原创 2019-07-24 12:21:03 · 2042 阅读 · 5 评论 -
【从 C 向 C++ 进阶】- 类 - 1. 类的封装
从 C 向 C++ 系列导航1. 封装简介早在 C 语言中便有封装这一概念,可以通过 struct 定义的结构体便是对一系列的数据进行封装,得到自定义的结构体类型。通过该结构体类型可以定义得到对应的结构体变量,该结构体变量就是其内部的一系列的成员变量的集合。在 C++ 中,进化了封装这一概念,可以把数据与函数一并进行封装,称之为类。类为一系列的属性以及功能的方法,方法对应的实体称之为对象,...原创 2019-07-07 18:32:37 · 302 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 2. 构造函数
从 C 向 C++ 系列导航1. 构造函数简介C++ 中,构造函数是与类名相同的特殊成员函数。在创建对象时,自动调用类的构造函数来完成对象的初始化。对象本质是变量。因此,在栈、堆创建的对象,对象的成员变量初始化为随机值;在 .bss 段上的对象,对象的成员变量初始化为 0。2. 构造函数定义构造函数较普通函数,具备以下特征:构造函数名称与类名称一致。构造函数无返回值。在创建...原创 2019-07-09 01:34:23 · 157 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 3. 拷贝构造函数
从 C 向 C++ 进阶系列导航1. 默认构造函数默认构造函数为无参构造函数,当类中没有定义构造函数(包括拷贝构造函数)时,编译器默认提供一个无参构造函数,并且其函数体为空。如果类中已经定义了构造函数(包括拷贝构造函数),编译器不会再提供默认的无参构造函数。因此,对于空类:class Tset{}至少存在默认构造函数、默认析构函数、重载运算符函数等(后续讲解)。2. 拷贝构造...原创 2019-07-10 00:57:20 · 260 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 4. 成员初始化列表
从 C 向 C++ 进阶系列导航1. 赋值与初始化赋值与初始化是存在差异的,例如:int num = 3; // 初始化num = 4; // 赋值赋值与初始化的关系实际为包含关系,即赋值为初始化的子集。下列情况可以体现出赋值与初始化的关系:定义指针时,必须初始化,在后续的程序中可以赋值改变指针所指向的地址。定义 const 修饰的常量时,必须初始化,但不...原创 2019-07-10 01:05:32 · 235 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 5. 析构函数
从 C 向 C++ 进阶系列导航1. 析构函数简介析构函数是 C++ 中类的特殊的清理函数,在类对象销毁时自动调用,完成对象的销毁。析构函数的作用并不是删除对象,而在对象销毁前完成的一些清理工作,如释放申请的系统资源等。2. 析构函数准则析构函数的规则如下:对象销毁时,自动调用。完成销毁的善后工作。无返回值,与类同名,不可以重载,无参数,不能设置默认参数。示例:cl...原创 2019-07-10 23:37:44 · 166 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 6. 临时对象及 this 指针
从 C 向 C++ 进阶系列导航1. 临时对象在程序中,可以在非定义类时不通过对象直接调用类的构造函数,此时会产生一个临时对象,该对象的生命周期仅在当前语句中,在程序跳转到下一条程序语句时该对象便被析构。当然,如果想通过对象手动调用构造函数,会发生编译错误。实验:class Test {public: Test() { cout << "Tes...原创 2019-07-10 23:46:19 · 235 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 对 C 的语法扩展 - 动态内存分配
从 C 向 C++ 进阶系列导航1. malloc 与 free 联系malloc 函数与 free 函数均为 C 库函数。malloc原型:void* malloc(unsigned int bytes);功能:按字节为单位动态申请字节数为 bytes 的堆空间内存返回:申请成功时返回内存的首地址,申请失败时返回 NULL由于 malloc 返回的为 void 类型指针,...原创 2019-07-11 22:40:11 · 472 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 对 C 的语法拓展 - 命名空间
从 C 向 C++ 进阶系列导航1. 命令空间简介在 C 中,只有一个全局作用域,所有的全局标识符共享一个作用域,因此标识符之间可能存在冲突。C++ 为了解决这个问题,提出了命名空间的概念。命名空间将全局作用域分为不同的部分,不同命令空间中的标识符可以重名而不会发生冲突,命名空间可以多层嵌套。全局作用域即为默认的命名空间。2. 声明命名空间命名空间声明如下:namespace te...原创 2019-07-11 22:46:17 · 157 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 对 C 的语法扩展 - 默认参数
从 C 向 C++ 进阶系列1. 函数的默认参数在 C++ 中可以在函数声明时为参数提供一个默认值,当函数调用时没有提供参数的值时,则使用默认值。当函数的声明与实现分开时,函数的默认值只能在函数声明中指定,在函数实现中指定是无效的,且同时指定时会发生编译错误。实验:// void fun_B(int num = 0); // error: default argument give...原创 2019-07-13 11:40:30 · 142 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 对 C 的语法扩展 - 引用
从 C 向 C++ 进阶系列1. 引用简介变量的本质是某段内存的名称,因此,可以把引用理解为该段内存的另一个名称。通俗来说,引用为已存在的变量的别名,是 C++ 为了优化指针而提出的新类型。示例:int var = 0;int& ref = var;以上定义后,当改变 ref 的内容时,var 的内容同样被改变,这与指针操作内存相似。2. 引用规则引用遵循以下规则...原创 2019-07-13 11:47:04 · 207 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 对 C 的语法扩展 - 类型转换
从 C 向 C++ 进阶 - 系列开篇1. 隐式类型转换在 C 中支持隐式类型转换。所谓的隐式类型转换为编译器自动地完成不同的数据类型之间赋值转换。低类型到高类型的转换是安全的,反之是不安全的,可能会发生数据截断。这里的低类型指的是占用存储空间较小的数据类型。隐式类型转换发送在如下情形:算数运算中,低类型转换为高类型。赋值表达式中,表达式的值转换为左边变量的类型。函数调用时,实参...原创 2019-07-14 15:26:25 · 162 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 对 C 的语法扩展 - const 关键字
从 C 向 C++ 进阶系列导航1. const 关键字在 C 中,const 关键字可以改变变量的属性以及存储空间。不同的判别标准如下:修饰局部变量:变量具有只读属性,仍保存在内存的栈中,可通过指针访问地址进行修改。修饰全局变量或静态变量:变量存储空间由静态存储区改变为只读存储区(.rodate段),且不能用指针来修改。在 C++ 中,对 const 关键字的作用进行了优化。...原创 2019-07-14 15:45:42 · 160 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 7. 类与 const
从 C 向 C++ 进阶系列导航1. const 对象const 对象为只读对象,只能调用 const 成员函数,因此无法直接修改成员变量。可通过指针方式间接访问非 const 成员函数与修改成员变量。实验:class Test {private: int m_Var; public: Test(int num) { m_Var = num; } void pr...原创 2019-07-14 16:03:47 · 193 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 8. 类与 static
从 C 向 C++ 进阶系列导航1. 静态成员变量静态成员变量为特殊的成员变量,存储在静态存储区,被所有类对象共用,不为任意对象私有,因此类对象的大小不包含静态成员变量。定义方式比较特殊,需要在类内部声明为:static type varname;,然后在全局作用域内进行初始化:type classname::varname = initvalue;。示例:class Test{...原创 2019-07-15 22:47:47 · 117 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 9. 二阶构造
从 C 向 C++ 进阶系列导航1. 构造函数的缺陷构造函数存在以下问题:构造函数只提供自动初始化成员变量的机会,不能保证初始化逻辑一定成功。构造函数中申请系统资源可能失败,失败后构造出一个半成品对象。执行 return 语句后构造函数立即结束。构造函数创建的对象可能是半成品对象,而半成品对象是合法的,但是却是十分危险的,容易造成难以定位的段错误等程序异常。因此,实际工程开发...原创 2019-07-16 22:23:23 · 158 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 类 - 16. 类类型转换
从 C 向 C++ 进阶系列导航1. 类类型隐式转换陷阱C++ 的类类型的转换规则如下:转换函数定义在源对象(转换对象)类中,是转换源对象的成员函数。一旦为转换源类型提供了到目标类型的转化函数,就可以将源类对象以隐式转化的方式转换得到目标类型对象。当没有定义转换函数时,编译器会尽力把源对象转化为目标对象,且容易触发隐私转换,不一定报错。实验:class Test{p...原创 2019-07-24 12:17:08 · 227 阅读 · 0 评论 -
【从 C 向 C++ 进阶】- 对 C 的语法扩展 - 函数重载
从 C 向 C++ 进阶系列导航1. 函数重载规则在 C 中,不允许定义同名的函数。而在 C++ 中,允许定义不同的参数列表的同名函数,这便是函数重载。重载的函数之间必须至少满足以下一个条件:参数个数不同。参数类型不同。相同参数类型顺序不同。需要注意的是,函数重载只能发生在相同的作用域中,且函数返回类型不能作为函数重载的依据。实验:int add(int num_A...原创 2019-07-13 11:03:21 · 136 阅读 · 0 评论