
C++深度解析
深度解析 C++ 语言
-出发-
学生一个,正处于学习阶段,希望与大家多多交流
展开
-
【C++深度解析】14、对象的构造顺序
文章目录1 对象构造的顺序1.1 堆对象的构造顺序1.2 全局对象的构造2 小结1 对象构造的顺序局部对象:程序执行流到达对象的定义语句时进行构造堆对象:当程序的执行流到达 new 语句时创建对象全局对象:构造顺序是不确定的1.1 堆对象的构造顺序当程序执行流到达new语句时创建对象使用 new 创建对象将自动触发构造函数的调用// 14-1.cpp#include<...原创 2020-01-30 10:40:34 · 470 阅读 · 0 评论 -
【C++深度解析】52、重载new/delete,在静态存储区、栈上分配空间
new 关键字创建出来的对象位于什么地方?原创 2020-03-11 22:15:00 · 1174 阅读 · 0 评论 -
【C++深度解析】51、统计对象中成员变量的访问次数
// 51-1.cpp#include<iostream>using namespace std;class Test{ int m_value; int* const m_pCount;public: Test(int value = 0) : m_pCount(new int(0)) { m_value = value;...原创 2020-03-10 21:52:27 · 590 阅读 · 0 评论 -
【C++深度解析】49、构造函数、析构函数中的异常
文章目录1 构造中的异常2 析构中的异常3 小结1 构造中的异常构造过程立即停止,当前对象无法生成析构函数不会被调用对象所占用的空间立即收回建议:不要在构造函数中抛出异常,当构造函数中可能产生异常时,使用二阶构造模式编程实验:构造中的异常// 49-1.cpp#include<iostream>using namespace std;class Test{p...原创 2020-03-04 21:57:04 · 406 阅读 · 0 评论 -
【C++深度解析】50、判断一个变量是不是指针
C++ 中仍然支持 C 语言中的可变参数函数C++ 编译器的匹配调用优先级重载函数函数模板变参函数思路:将变量分为两类,指针和非指针,使用函数模板与变参函数。传入指针时首先匹配函数模板,传入非指针变量时,匹配的是可变参数函数。// 50-1.cpp#include<iostream>using namespace std;class Test{publ...原创 2020-03-04 21:59:02 · 2209 阅读 · 2 评论 -
【C++深度解析】48、C++ 中的类型识别
文章目录1 静态类型与动态类型2 typeid 获取类型信息3 小结1 静态类型与动态类型面向对象中可能有基类指针指向子类对象,基类引用成为子类对象的别名。如图所示,父类指针指向子类的对象,我们可以分为静态类型和动态类型。静态类型:变量(对象)自身的类型动态类型:指针(引用)所指向对象的实际类型看如下代码,进行类型转换,这样的转换安全吗?Base 是基类,Derived 是派生类,将父...原创 2020-03-04 21:56:26 · 453 阅读 · 0 评论 -
【C++深度解析】47、C++ 中的异常处理(下)
文章目录1 catch 将捕获的异常抛出1 catch 将捕获的异常抛出catch 中捕获的异常可以被重新解释后抛出catch 可以捕获异常,也可以重新抛出,抛出的异常被外层的 catch 捕获。void Demo(){ try { try { throw 'c'; } catc...原创 2020-03-03 21:41:37 · 387 阅读 · 0 评论 -
【C++深度解析】46、C++ 中的异常处理(上)
文章目录1 异常的概念2 C++中的异常1 异常的概念程序在运行过程中可能产生异常,异常与 Bug 的区别如下:异常是程序运行时可预料的执行分支Bug 是程序中的错误,是不被预期的运行方式下面列举几个常见的异常与 Bug。异常运行时产生除 0 的情况需要打开的外部文件不存在数组访问时越界Bug使用野指针堆数组使用后未释放选择排序无法处理长度为 0 的数组2 ...原创 2020-03-02 21:45:37 · 413 阅读 · 0 评论 -
【C++深度解析】25、C++中的智能指针
文章目录1 shared_ptr动态内存管理经常出现问题:一种是忘记释放内存,会造成内存泄漏;引用释放的内存,产生引用非法内存的指针。引入智能指针解决上面的问题,自动释放所指向的对象。shared_ptr 允许多个指针指向同一个对象,unique_ptr 则“独占”所指向的对象。weak_ptr 是一种弱引用,指向shared_ptr所管理的对象,这三种智能指针都定义在memory头文件中。1...原创 2020-03-01 21:52:07 · 494 阅读 · 0 评论 -
【C++深度解析】45、数组类模板
文章目录1 数值型模板参数2 数组模板类3 数组类改造4 小结1 数值型模板参数模板参数可以是数值型参数,如下所示,模板参数 N 是个数值。数值型模板参数的限制变量,浮点数,类对象不能作为模板参数本质:模板参数是在编译阶段被处理的单元,因此,在编译阶段必须准确无误的唯一确定。编程实验:计算 1 + 2 + 3 + ……+N 最高效的方式// 45-1.cpp#include&...原创 2020-02-29 21:50:27 · 553 阅读 · 0 评论 -
【C++深度解析】44、类模板深度剖析--模板特化
文章目录1 多参数类模板2 类模板特化3 函数模板特化4 小结1 多参数类模板类模板可以定义任意多不同的类型参数2 类模板特化类模板可以被特化指定类模板的特定实现部分类型参数必须显示指定根据类型参数分开实现类模板编译器自动择优选择类模板可以分为部分特化和完全特化两种类型部分特化–>用特定规则约束类型参数完全特化–>完全显示指定类型参数编程实验:...原创 2020-02-27 21:50:08 · 417 阅读 · 0 评论 -
【C++深度解析】43、类模板的概念和意义
1 类模板C++ 将模板的思想应用于类,使得类的实现不再关注数据元素的具体类型,而只管组类所需要实现的功能,一些类主要用于存储组织数据元素,如数组类,链表类,Stack 类,Queue 类同样的,在类声明前使用 template 进行标识,语法如下:...原创 2020-02-26 21:53:47 · 386 阅读 · 0 评论 -
【C++深度解析】42、函数模板及其本质分析
文章目录1 函数模板1.1 函数模板的语法规则1.2 函数模板的使用2 函数模板的本质3 小结对于函数体相同,仅仅参数类型不同的函数我们可以使用函数模板来解决,这是 C++ 中的一种泛型编程。1 函数模板函数模板是一种特殊的函数可用不同的类型进行调用,1.1 函数模板的语法规则template 关键字用于声明开始进行泛型编程typename 关键字用于声明泛型编程1.2 函数...原创 2020-02-25 21:53:28 · 475 阅读 · 0 评论 -
【C++深度解析】41、构造函数,析构函数可以是虚函数吗?
文章目录1 构造函数不能是虚函数,析构函数可以是虚函数2 构造析构函数调用虚函数不会发生多态3 小结1 构造函数不能是虚函数,析构函数可以是虚函数构造函数不可能成为虚函数在构造函数执行结束后,虚函数表指针才能被正确的初始化析构函数可以成为虚函数建议在设计类时将析构函数声明为虚函数编程实验:构造,析构,虚函数// 41-1.cpp#include<iostream>...原创 2020-02-24 21:53:55 · 889 阅读 · 0 评论 -
【C++深度解析】40、new和malloc的区别
文章目录1 new 和 malloc 的区别2 new/delete 和 malloc/free 混用2.1 new 申请 free 释放--内存泄漏2.2 malloc 申请 delete 释放--摧毁不存在的对象3 小结1 new 和 malloc 的区别1、属性new/delete 是 C++ 关键字。malloc/free 是库函数。2、参数new 以具体的类型为单位进行内存分配...原创 2020-02-24 21:53:39 · 1256 阅读 · 0 评论 -
【C++深度解析】39、被遗弃的多重继承(下)
文章目录1 多重继承问题三:产生多个虚函数表1.1 解决方案:dynamic_cast2 正确使用多重继承3 小结1 多重继承问题三:产生多个虚函数表继承是父类与子类的叠加,BaseA 和 BaseB 中都有虚函数,那么二者都会有虚函数表,Dervied 继承了这两个类,类中也就有了两个指针,分别指向两个虚函数表。编程实验:多重继承问题–产生多个虚函数表// 38-3.cpp#incl...原创 2020-02-23 21:55:47 · 413 阅读 · 0 评论 -
【C++深度解析】38、被遗弃的多重继承(上)
文章目录1 何为多重继承2 多重继承问题一3 多重继承问题二4 小结1 何为多重继承C++允许一个类拥有多个父类,这就是多重继承子类有用所有父类的成员变量子类继承所有父类的成员函数子类对象可以当作任意父类对象使用多重继承的语法规则:// 38-1.cpp#include<iostream>using namespace std;class BaseA{ ...原创 2020-02-22 21:48:27 · 412 阅读 · 0 评论 -
【C++深度解析】37、C++ 中的抽象类和接口
文章目录1 抽象类1.1 为什么有抽象类1.2 抽象类与纯虚函数2 接口3 小结1 抽象类1.1 为什么有抽象类在进行面向对象分析时,会有一些抽象的概念,如下图所示,矩形类和圆形类是形状类的子类,他们中都有求面积的函数。但是只有对具体的形状求面积才有意义,对概念上的”图形“求面积是没有意义的!图形只是一个概念上的类型,没有具体的对象。但是图形类依然有存在的必要。这里的图形类应该设计成抽...原创 2020-02-21 21:41:53 · 413 阅读 · 0 评论 -
【C++深度解析】36、C++对象模型(下:继承时的内存分布、虚函数表)
上一篇博客中我们讲到 class 与 struct 遵循相同的内存对齐规则,class 中的成员函数与成员变量分开存放,使用 sizeof 求解的是成员变量的内存大小,不包含成员函数,成员函数在代码段中。继承后子类的大小怎么计算呢?1 继承对象模型子类是由父类成员叠加子类新成员得到的编程实验:继承对象模型// 36-1.cpp#include<iostream>us...原创 2020-02-20 21:50:14 · 520 阅读 · 1 评论 -
【C++深度解析】35、C++对象模型(上:对象内存布局)
文章目录1 对象内存布局2 调用成员函数本质3 小结1 对象内存布局class 是一种特殊的 structclass 与 struct 遵循相同的内存对齐规则class 中的成员函数与成员变量分开存放(每个对象有独立的成员变量,所有对象共享类中的成员函数)编程实验:对象内存布局// 35-1.cpp#include<iostream>using namespace...原创 2020-02-19 22:34:15 · 401 阅读 · 0 评论 -
【C++深度解析】34、多态与虚函数
文章目录1 函数重写回顾2 多态概念1 函数重写回顾父类中被重写的函数依然会继承给子类子类中重写的函数将覆盖父类中的函数通过作用域分辨符(::)可以访问父类中的函数前一篇博客中我们知道,当使用父类的指针(引用)指向子类对象时,子类对象退化为父类对象,只能访问父类中的成员。也就是说父类的指针不管指向的是父类的对象还是子类的对象,调用的都是父类的函数。2 多态概念我们希望根据实际指向...原创 2020-02-18 20:30:58 · 361 阅读 · 0 评论 -
【C++深度解析】33、子类定义父类同名的函数或变量
文章目录1 子类定义父类同名成员2 子类定义父类同名函数3 小结1 子类定义父类同名成员子类中可以定义父类的同名成员子类中的成员将隐藏父类中的同名成员父类中的同名成员依然存在于子类中,需要用作用域分辨符(::)访问父类同名成员// 33-1.cpp#include<iostream>using namespace std;namespace A{ int ...原创 2020-02-17 00:19:51 · 6234 阅读 · 1 评论 -
【C++深度解析】32、继承中的构造与析构
文章目录11原创 2020-02-15 23:17:01 · 317 阅读 · 0 评论 -
【C++深度解析】31、三种继承方式(public,protected,private)
C++ 中支持三种继承方式:公有继承,私有继承,保护继承公有继承(public)基类的 public 和 protected 成员的访问属性在派生类中保持不变,但基类的 private 成员不可直接访问。派生类中的成员函数可以直接访问基类中的 public 和 protected 成员,但不能直接访问基类的 private 成员。通过派生类的对象只能访问基类的 public 成员。保...原创 2020-02-13 22:39:40 · 1086 阅读 · 0 评论 -
【C++深度解析】30、继承的概念与意义
继指类之间的父子关系子类是一种特殊的父类,拥有父类的所有属性和行为子类对象可以当作父类对象使用子类中可以添加父类中没有的方法和属性子类对象可以直接初始化父类对象,可以直接赋值给父类对象继承是 C++ 中代码复用的重要手段,通过继承,可以获得父类的所有功能,并且可以在子类中重写已有的功能,或者添加新功能...原创 2020-02-13 15:50:00 · 548 阅读 · 0 评论 -
【C++深度解析】29、int 与类类型之间的转换,类类型之间转换(转换构造函数,类型转换函数)
文章目录1 基本类型之间的转换2 普通类型与类类型之间的转换2.1 转换构造函数2.2 explicit 关键字3 小结1 基本类型之间的转换标准数据类型之间存在隐式的类型安全转换,在【C语言进阶剖析】4、类型转换中我们已经讲解了 C 语言中的强制类型转换和隐式类型转换。安全的隐式类型转换如下所示:我们通过一个案例回顾一下隐式类型转换// 29-1.cpp#include<io...原创 2020-02-10 23:39:24 · 1813 阅读 · 0 评论 -
【C++深度解析】27、不要重载逗号操作符
文章目录1 原生的逗号操作符2 重载逗号操作符1 原生的逗号操作符逗号表达式用于将多个子表达式连接为一个表达式逗号表达式的值为最后一个子表达式的值逗号表达式中的前 N-1 个子表达式可以没有返回值逗号表达式按照从左向右的顺序计算每个子表达式的值2 重载逗号操作符...原创 2020-02-09 22:54:28 · 428 阅读 · 0 评论 -
【C++深度解析】28、重载前置++与后置++
需要栈空间存储临时变量,同时需要调用构造函数创建对象,调用析构函数销毁对象。原创 2020-02-09 15:10:39 · 1460 阅读 · 0 评论 -
【C++深度解析】26、逻辑操作符没有短路法则了?
文章目录1 原生的逻辑操作符2 重载逻辑运算符3 小结1 原生的逻辑操作符对于原生的逻辑 && 和 || 操作符,我们知道结果只有两种值(true 和 false),并且逻辑操作符有短路法则实例分析:回顾原生的逻辑操作符// 26-1.cpp#include<iostream>using namespace std;int func(int i){ ...原创 2020-02-08 23:36:06 · 659 阅读 · 0 评论 -
【C++深度解析】24、赋值运算符与深拷贝
前面我们学习了操作符重载:在【C++深度解析】20、操作符重载中讲了操作符可以重载为成员函数和非成员函数,并重载运算操作符:+,-,*,/ ,比较操作符:==,!= ,和赋值操作符:=,实现了复数类。在【C++深度解析】22、数组操作符重载 中讲解了了重载数组访问操作符,并在数组类中重载数组访问操作符,可以对函数对象直接使用下标访问数组元素。在【C++深度解析】23、函数对象分析(重载函数调...原创 2020-02-07 22:26:10 · 959 阅读 · 0 评论 -
【C++深度解析】23、函数对象分析(重载函数调用操作符())
文章目录1 不一样的斐波那契数列2 函数对象--重载函数调用操作符()3 小结:1 不一样的斐波那契数列我们现有有这样一个需求:获取斐波那契数列每项的值每调用一次返回一个值函数可根据需要重复使用使用方式如下所示:我们可以通过使用静态变量的方法解决这个问题。代码如下:// 23-1.cpp#include<iostream>using namespace std...原创 2020-02-06 22:53:49 · 445 阅读 · 0 评论 -
【C++深度解析】22、数组操作符重载
文章目录1 重载数组访问操作符2 完善数组类3 小结前面一篇博客我们讲解了 string 类,string 类最大限度的考虑了 C 字符串的兼容性。那么类的对象怎么支持数组的下标访问呢?我们回顾一下 C 语言中数组访问,下面几种写法是等价的:1 重载数组访问操作符重载数组访问操作符([])只能通过类的成员函数重载重载函数能且仅能使用一个参数可以定义不同参数的多个重载函数编程实...原创 2020-02-05 21:54:24 · 493 阅读 · 0 评论 -
【C++深度解析】21、C++中的字符串类
文章目录1 C++ 标准库1.1 重载左移操作符1.2 C++标准库2 C++ 中的字符串类2.1 字符串与数字的转换2.2 字符串循环右移3 小结1 C++ 标准库1.1 重载左移操作符我们先来说一下重载左移操作符,下面看一段有趣的代码#include<stdio.h>const char endl = '\n';class Console{public: C...原创 2020-02-04 23:37:06 · 409 阅读 · 0 评论 -
C++深度解析--学习目录
【C++深度解析】1、C 到 C++ 的升级【C++深度解析】2、C/C++ 中的 const【C++深度解析】3、布尔类型和引用【C++深度解析】4、内联函数分析【C++深度解析】5、函数参数的扩展【C++深度解析】6、函数重载【C++深度解析】7、C++ 中的命名空间【C++深度解析】8、C++ 中的类型转换【C++深度解析】9、const 常量?只读变量?【C++深度解析】...原创 2020-02-13 22:45:32 · 920 阅读 · 0 评论 -
【C++深度解析】19、类中函数重载
文章目录1 重载回顾2 成员函数重载3 重载的意义4 小结1 重载回顾前面我们已经学习了函数重载,现在来回顾一下:C++通过函数名和函数参数确定函数调用,本质为相互独立的不同函数无法通过函数名得到重载函数的入口地址函数重载必然发生在同一作用域中2 成员函数重载类中的成员函数也可以进行重载,万变不离其宗重载函数的本质为多个不同的函数函数名和参数列表是唯一的标识函数重载必须发...原创 2020-02-02 23:32:09 · 380 阅读 · 0 评论 -
【C++深度解析】20、操作符重载
文章目录1 重载为成员函数2 重载为非成员函数3 小结如果我们直接使用 “+” 完成复数的加法,要怎么做呢?这就要使用操作符的重载功能了,操作符的重载是以函数的方式进行的。本质上是用特殊形式的函数扩展操作符的功能。重载通过 operator 关键字定义特殊的函数,可以重载为类的成员函数和非成员函数。1 重载为成员函数语法:将操作符重载函数定义为类的成员函数时比定义为非成员函数少一...原创 2020-02-01 11:58:36 · 436 阅读 · 0 评论 -
【C++深度解析】18、被遗弃的友元
文章目录1 友元1.1 函数友元1.2 类友元1.3 友元的缺点2 小结1 友元友元发生在函数和类之间或者类与类之间友元不是类的一部分友元不受类中访问级别的限制,可以直接访问具体类的所有成员友元关系是单向的,不能传递在类中用 friend 关键字对函数或类进行声明1.1 函数友元当一个函数声明为类的友元时,就可以访问类中的所有成员。编程实验:函数是类的友元// 18-1.c...原创 2020-01-31 21:57:19 · 366 阅读 · 0 评论 -
【C++深度解析】17、二阶构造模式
文章目录1 构造函数 return 会怎么样?1.1 半成品对象2 二阶构造2.1 数组类改进3 小结1 构造函数 return 会怎么样?首先我们思考一个问题?在构造函数中执行 return 语句会发生什么?构造函数执行结束是否意味着对象构造成功?编程实验:异常的构造函数// 17-1.cpp#include<stdio.h>class Test{public: ...原创 2020-01-31 19:00:27 · 427 阅读 · 0 评论 -
【C++深度解析】16、类的静态成员
文章目录1 静态成员变量2 静态成员函数3 小结1 静态成员变量静态成员变量属于整个类,所有对象共享类的静态成员变量可直接通过对象名、类名访问静态成员变量的生命期不依赖于任何对象特性:静态成员变量需要在类外单独分配空间,位于全局数据区我们现在有这样一个需求,不使用全局变量的情况下,统计某个类的对象数目。// 16-1.cpp#include<stdio.h>...原创 2020-01-31 11:04:04 · 393 阅读 · 0 评论 -
【C++深度解析】15、避免临时对象
文章目录1 临时对象的产生1.1 产生了临时对象1.2 问题解决2 编译器会减少临时对象3 小结1 临时对象的产生1.1 产生了临时对象首先,我们先看一段代码,//15-1.cpp#include<stdio.h>class Test{public: Test(int i) : x(i){} Test() { Test(0); ...原创 2020-01-30 20:06:19 · 566 阅读 · 0 评论