C++语言浅析
文章平均质量分 68
火焰山大白菜
事物的难度远远低于对事物的恐惧!
展开
-
学习C++的意义
--事物的难度远远低于对事物的恐惧! 前些天更新了几篇《C进阶养成记》,今天开始不定期的交互更新各个教程。 首先来一篇C++的开门红:学习C++的意义! 至于为什么要学习C++,本菜不想卷入各大派别的纷争,只是简单地来聊聊学对于C++的看法,首先来看看2017年3月份计算机语言的排行榜,可以看到C++在前三占有一席,如果心细的朋友会发现,C/C++语言这几年,...原创 2018-04-15 15:34:18 · 2241 阅读 · 0 评论 -
C到C++的升级
--事物的难度远远低于对事物的恐惧! 现在正式进入C++的世界,大家安全带系好,马上发车了! 这一章节来聊一聊C到C++的升级,我们来回顾下上一章节《学习C++的意义》的内容,我们知道,C++是一种加强版的C语言,兼容了C的特性,同时也提供了更为先进的软件设计方法:面向对象的设计方法。除此之外,C++还提供了更多的语法和特性,完美兼顾了开发效率与运行效率,可谓...原创 2018-04-15 16:46:44 · 294 阅读 · 0 评论 -
C到C++的升级
--事物的难度远远低于对事物的恐惧! 从上一节我们知道,C++与C语言并不存在什么竞争关系,C++可以说是进化版的C语言,兼容C语言的特性,同时又具有C语言所不具备的高级特性。 -C++继承了所有C的特性 -C++在C的基础上提供了更多、更灵活的语法和特性 -C++的设计目标时运行效率与开发效率的统一 1、C++更强调语言的实用性,所有的变量都可...原创 2018-06-02 22:19:19 · 433 阅读 · 0 评论 -
C++进化后的const分析
--事物的难度远远低于对事物的恐惧! 对于const关键字,在C进阶分析中,我们知道,const在C语言中有如下特性: -const修饰的变量是只读的,其本质还是变量而,也就是只读变量(依旧可以通过别的手段修改const变量) -const修饰的局部变量在栈上分配空间 -const修饰的全局变量或静态局部变量,在只读存储区分配空间 -const只...原创 2018-06-02 23:13:58 · 317 阅读 · 1 评论 -
C++布尔类型和引用
--事物的难度远远低于对事物的恐惧! 我们知道,C语言中是没有bool类型的,但是C++在C语言的基本类型系统之上增加了bool类型,并且C++中的bool可取的值只有true和false,bool类型理论上只占用一个字节 -true代表真值,编译器内部用1来表示 -false代表非真,编译器内部用0来表示 -C++编译器会将非0值转化为true,0值转化...原创 2018-06-03 00:27:02 · 797 阅读 · 0 评论 -
C++引用的本质分析
--事物的难度远远低于对事物的恐惧! 在上一节中我们知道,引用是变量的别名,操作这个别名就相当于操作这个变量,而在C++中,引用更多时候可以在一些场合代替指针,并且相对指针来说,引用具有更好的可读性和实用性。 下边来看看一个老生常谈的交换函数#include <iostream>using namespace std;//引用方式void swap1...原创 2018-06-03 11:12:03 · 928 阅读 · 0 评论 -
C++内联函数分析
--事物的难度远远低于对事物的恐惧! 在C语言中,我们经常看到宏代码块,使用宏代码块的作用是直接将代码直接在编译时就嵌到固定位置,那么有一个问题是:宏是简单粗暴的文本替换,并不会进行任何规则检查,在预处理期就完成宏的替换工作,编译器是不知道宏的存在的。 鉴于宏代码块的缺陷,C++中引入了内联函数替代宏代码块,使用inline关键字声明内联函数。需要注意的是:inline...原创 2018-06-03 12:14:56 · 383 阅读 · 0 评论 -
C++函数参数的扩展
--事物的难度远远低于对事物的恐惧! 在C++中,使用函数的默认参数可以使我们的编程工作在某些方面变得很方便,主要体现在我们调用函数时,如果没有指明函数参数,那么就是使用函数的默认参数,如果提供了函数参数,那么就使用我们提供的函数参数。需要注意的是:参数的默认值需要在声明函数时就指明,比如我们声明一个函数int fun(int i = 0); 这个样就使的fun函数的参数i的默认值为...原创 2018-06-03 17:36:28 · 508 阅读 · 0 评论 -
C++函数重载的分析(下)
--事物的难度远远低于对事物的恐惧! 上一节对函数重载做了个大概的分析,这节我们来做个比较深一点的分析。 1、函数重载遇上函数指针 -将重载函数名赋值给函数指针时 ->根据重载规则挑选与函数指针参数列表一致的候选者 ->严格匹配候选者的函数类型与函数指针的函数类型#include <...原创 2018-06-03 23:21:15 · 257 阅读 · 0 评论 -
C++中的新成员
--事物的难度远远低于对事物的恐惧! 这章我们介绍的是关于C++动态内存分配相关的知识,而所说的C++中的新成员就是new与delete,这两个关键字在C++中用于动态内存申请与释放。 -C++中通过new关键字进行动态内存申请 -C++中的动态内存申请是基于类型进行的 -delete关键字用于内存释放 下边直接来看看如何使用new和delete进行内...原创 2018-06-13 22:37:42 · 337 阅读 · 0 评论 -
C++进阶面向对象(上)
--事物的难度远远低于对事物的恐惧! 这章开始我们开始正式进入C++面向对象的领域,这节我们不聊代码,就聊聊生活中的现象,我们知道,面向对象开发,就是为了贴切我们生活中的例子,也就是说直接把生活中的现象搬到程序代码中。类和对象是面向对象中的两个基本概念 -类:指一类事物,是一个抽象的概念(比方动物、电脑等,都可看成一个类) -对象:指属于某个类的实体(比方猫、狗就是动...原创 2018-06-14 22:26:08 · 298 阅读 · 0 评论 -
C++进阶面向对象(下)
--事物的难度远远低于对事物的恐惧! 上一节我们介绍了类和对象的基本概念及对应生活中的一些例子,这节我们进一步来分析一下类和对象。 类之间的关系: -继承 A、从已存在类细分出来的类和原类之间具有继承关系 B、继承的类(子类)拥有原类(父类)的所有属性和行为 -组合 ...原创 2018-06-14 23:18:57 · 315 阅读 · 0 评论 -
C++类与封装的概念
--事物的难度远远低于对事物的恐惧! 这节我们来学习类与封装的概念,我们知道,一般电脑都是由CPU、内存、主板、硬盘等部件组合组成,像下边这样 但是我们组装电脑的时候,仅仅是把硬盘、内存、CPU、主板等这些部件的接口相互连接起来就行,我们不会去关注硬盘、CPU、主板等他们的内部是怎么实现的,组装电脑并不需要去了解学习硬盘的设计、主板的设计,直接用他们的接口就行,这就是封装一...原创 2018-07-16 22:41:54 · 16110 阅读 · 4 评论 -
C++类的真正形态
--事物的难度远远低于对事物的恐惧! 前边我们所定义的类,均是使用struct关键字来定义,但是C++中真正用于定义类的关键字为class,因为要C++兼容C,所以保留struct关键字,struct与class的用法完全相同,区别在于: -struct定义的类默认访问级别为public -class定义的类默认访问级别为privateC++中的类支持声明和实现的分...原创 2018-07-16 23:19:55 · 305 阅读 · 0 评论 -
C++对象的构造(上)
--事物的难度远远低于对事物的恐惧! 在开始对象的构造知识点讲解之前,我们先来思考个小问题:生成一个类对象时,其中的成员变量的初始值是多少?要理解上边的问题,我们首先要有一个概念:定义类对象可视为定义变量,根据我们C语言的基础,在全局区、栈空间、堆空间定义的变量,初始值都有所不同,其中全局区初始值为0,栈空间上为随机值,堆空间上为随机值。那么我们以下边的代码来验证一下我们的猜想:...原创 2018-07-18 22:04:10 · 435 阅读 · 0 评论 -
C++对象的构造(中)
--事物的难度远远低于对事物的恐惧! 上一章,我们简单的了解了C++ 中的构造函数,那么这节我们再来分析下C++中的构造函数,在上一节中,我们通过构造函数去初始化类对象,但是细心的朋友会发现,我们定义的三个类对象,它们的初始化值都一样,那么有没有办法使得不同类对象拥有各自的初始化值? 要解决上边的疑问,我们首先来回顾先C++中构造函数 - 无返回值,函数名与类名相同...原创 2018-07-18 23:21:39 · 593 阅读 · 0 评论 -
C++对象的构造(下)
在C++中,如果我们定义一个类,没有定义任何的构造函数,那么编译器会为我们提供两个特殊的构造函数:无参构造函数 和 拷贝构造函数 无参构造函数: 其实就是一个没有参数、函数体为空的构造函数 拷贝构造函数: 函数参数为 const class_name&,拷贝构造函数只是简单的进行成员变量的赋值下边来看下边两个类test1和test2test1中我们没有定义任...原创 2018-07-30 22:46:32 · 259 阅读 · 0 评论 -
C++初始化列表
在谈C++初始化列表这个内容前,我们先来回顾下const 修饰的变量,我们知道,在C语言中,被const修饰的变量是不可以被直接改变的,在C++中,const升级了,被const修饰后就直接进入常量符号表,是真正意义上的常量。既然我们知道这些知识,那么在C++的类中,我们能不能定义一个const变量?下边我们就直接用代码来验证下我们的设想: #include <iostrea...原创 2018-07-31 21:14:15 · 279 阅读 · 0 评论 -
C++中对象的构造顺序
在前边几课,我们知道了类的构造函数,在生成类对象时会被自动调用,但是假如我们定义多个对象,那么这些定义的对象,他们的构造函数执行的顺序是怎样的?换句话说就是类对象的构造顺序是怎样的? 我们来直接揭晓答案吧,这里我共分为3中情况 -全局区定义的对象的构造顺序是不确定的,不同的编译器使用不同的构造规则 -局部对象:当程序执行流到达对象构造语句时进行构造 -堆对...原创 2018-07-31 21:44:39 · 1984 阅读 · 0 评论 -
C++中对象的销毁
在前边的学习,我们知道,我们可以把类成员的初始化放在构造函数中,当我们定义类时,自动调用构造函数完成初始化工作;同样的道理,当我们的类对象使用完毕,销毁时,C++同样提供了一个特殊的函数来使我们方便的完成一些收尾工作(比方指针释放等),这个特殊的函数就是析构函数。 -析构函数语法规则: ~className(){} -析构函数无返回值、无参数,不能重载 #incl...原创 2018-07-31 22:18:02 · 4588 阅读 · 0 评论 -
C++中神秘的临时对象
这一章节我们来聊一个C++中比较坑爹的地方:临时对象。先来看看下边的代码:#include <iostream>#include <string>using namespace std;class test{private: int m_value;public: test(){} test(int value) ...原创 2018-08-03 21:23:32 · 216 阅读 · 0 评论 -
C++中的const对象与const成员函数
在前边几章的内容中,我们知道C++的类中可以有const成员变量,并且还知道类中的const成员变量只能在初始化列表中初始化。同样,在C++中,还存在const对象以及const成员函数,const修饰的对象为只读对象,他们的特性如下: const成员函数的定义:需要在函数的声明及定义的后边加上const关键字 -const对象只能调用const成员函数 -const...原创 2018-08-04 10:24:47 · 2836 阅读 · 1 评论 -
C++中类的(static)静态成员变量与(static)静态成员函数
在C语言中,我们知道有static静态变量,生命周期与作用域都跟普通变量有所不同。而在C++的类中,也有静态成员变量同时还有静态成员函数,先来看看C++中静态成员变量与静态成员函数的语法:#include <iostream>#include <string>using namespace std;class test{private: ...原创 2018-08-04 11:27:28 · 92789 阅读 · 20 评论 -
C++中构造函数之二阶构造模式
我们在前边已经知道,构造函数是C++中的一种特殊的函数,其没有返回值,在对象定义时自动被调用,主要用于对象中成员变量的初始化,但是有个问题是,我们前期一直都是默认构造函数能正常执行完毕,但是假如构造函数中执行出错,或者提前返回,会有什么情况发生?下边来看一段代码: #include <iostream>#include <string>using na...原创 2018-08-04 16:10:54 · 1890 阅读 · 2 评论 -
C++类中的函数重载
在前边的学习中,我们知道C++中支持函数的重载,并且知道函数重载有一下几个特性: -函数重载的本质是相互独立的不同函数 -C++中通过函数名和函数参数确定函数调用 -无法直接通过函数名得到重载函数的入口地址 -函数重载必然发生在同一个作用域中既然函数重载的要求是以上几点,那很明显,类中的成员函数也可以发生重载,而我们知道,...原创 2018-08-05 09:51:36 · 3067 阅读 · 2 评论 -
C++中操作符重载
C++中除了能进行函数重载,还能对操作符进行重载,在分析操作符重载之前,我们先来看看下边的代码: #include <iostream>#include <string>using namespace std;class Complex //定义一个复数类{private: int i; int j;public: ...原创 2018-08-05 10:41:16 · 331 阅读 · 1 评论 -
C++中的函数对象
C++中除了可以对运算、数组操作符进行重载外,同时也能对函数符号“()”进重载,这个就是函数对象,重载“()”后,类对象就能像使用函数的格式一样使用, 定义一个对象className obj; 以函数的方式使用对象obj(),下边我们就来重载“()”操作符,实现斐波那契数列,并且能从任意一个位置开始计算 #include <iostream>#include &...原创 2018-08-06 21:42:41 · 470 阅读 · 0 评论 -
C++中智能指针
在C、C++中,内存泄漏引起的Bug数不胜数,主要就是申请动态内存后用完不释放,而C++又不像java那样拥有内存回收机制,在C++中,指针是无法控制所指堆空间生命周期的,所以非常容易造成堆空间申请未释放,导致内存泄漏,甚至软件奔溃。 为了解决这个问题,C++中引入了智能指针的概念 -智能指针是一种特殊的指针 -智能指针的生命周期结束时主动释放堆空间 -一...原创 2018-08-06 23:10:18 · 293 阅读 · 0 评论 -
C++中继承的概念和意义
在C++中,类与类之间的关系有组合与继承两种,以生活中的例子来举例,组合就好比电脑这个类由主板、CPU、内存、硬盘等这些类组成的,属于整体与部分的关系,如下图:而继承则好比电脑与苹果电脑、戴尔电脑之间的关系,也叫父子关系,电脑为父类,苹果电脑与戴尔电脑为子类,如下:先来讨论类的组合关系: - 将其他类的对象作为当前类的成员使用 - 成员对象与当前类的对象生命周期相同...原创 2018-08-08 22:35:35 · 10026 阅读 · 2 评论 -
C++中类中为继承而生的访问级别:protect
到目前为止,我们知道,C++类中成员的访问级别有public与private,public公有级别能被外界直接访问,private只能被在类内部和类成员函数访问,不能被外界直接访问。但是我们又知道,子类继承父类后,便拥有了父类的所有属性,那么这个时候,子类能直接访问父类的私有成员吗? - 从面向对象的理论:子类拥有父类的所有属性,能直接访问父类的私有成员 - 从C++语法...原创 2018-08-09 20:56:55 · 13738 阅读 · 3 评论 -
C++继承中的构造与析构
前边的学习,我们知道了C++中的构造函数、析构函数、类之间的继承,那么当子类继承父类后,我们如何去初始化继承自父类的成员变量? C++中子类中可以定义构造函数 - 在子类的构造函数中直接通过初始化列表或者赋值的方式进行初始化 -调用父类构造函数进行初始化但是对于在子类中通过初始化列表或赋值的方式对父类进行初始化,当父类成员为private属性时,便无法直接访问...原创 2018-08-09 22:10:12 · 1126 阅读 · 0 评论 -
C++中的多态特性
前边我们知道,C++类之间有继承关系,子类能够哦继承父类并且拥有父类的属性,也能够定义子类自己的属性,古语就是:青出于蓝而胜于蓝。 但是子类中是否可以定义父类中的同名成员,使用时如何区分该成员是父类中的还是子类中的?下边代码来验证一下#include <iostream>using namespace std;class parent{public:...原创 2018-08-22 18:40:39 · 734 阅读 · 0 评论 -
C++中的对象模型分析
到目前为止,我们都是使用class关键字来定义类,其实在C++中,class是一种特殊的struct - 在内存中class依旧像struct一样,可以看作变量的集合 - class与struct遵循相同的内存对齐规则 - class中的成员函数与成员变量是分开存放的 - 每个对象拥有独立的成员变量 - 所有对象共享类中的成员函数 #i...原创 2018-08-23 12:24:10 · 482 阅读 · 0 评论 -
C++中的抽象类与接口
在面向对象编程时,有一些抽象的概念,而且可以从生活中映射过来,比方如何求一个图形的面积?这里的问题就是:没说明是求什么图形的面积,所以就求不出图形的面积,但是图形在我们生活中却是一个实实在在存在的概念,没有具体的对象实例。 同样在面向对象编程中,这个抽象的概念就对应到抽象类 - 抽象类可用于表示现实世界中的抽象概念 - 抽象类是一种只能定义类型,不...原创 2018-08-23 16:58:57 · 562 阅读 · 0 评论 -
C++中的函数模板
之前我们知道的交换两个变量的方法有宏定义、函数,这两种方式都能实现两个变量的交换,但是各有各的优缺点 宏定义: - 优点:代码复用,适合所有的类型 - 缺点:缺少类型检查,宏在预处理阶段就被替换掉,编译器并不知道宏的存在 函数: - 优点:真正的函数调用,编译器对类型进行检查 - 缺点:类型不同需要重复定义函数,代码无法复用上边两种方式...原创 2018-08-23 19:57:54 · 64542 阅读 · 22 评论 -
C++中的类模板
前边我们知道,C++中的泛型编程,有函数模板和类模板两种形式,我们之前已经对函数模板做了分析,这章我们就对类模板做个分析。将模板的思想应用于类,我们就可以只关注类的功能实现,不需要关注具体数据元素的类型,这种思想非常适用于编写数据结构相关的代码,比如数组类、线性表、栈和堆等,只需要实现他们的逻辑功能,不必关注具体的数据类型。 C++中的类模板与函数模板一样,都是使用templat...原创 2018-08-24 11:25:16 · 786 阅读 · 1 评论