C++
文章平均质量分 71
一念之间、
自古闲人多愁绪,唯有读书稳人心!
展开
-
C++学习笔记--字符串类
在C中并不支持字符串类型,只是通过使用字符数组和一组函数来进行字符串操作,由于C不支持自定义类型,所以无法获取字符串类型。C++完全兼容C,所以C++也没有字符串类型。从C到C++的过程中引入了制定会议类型的概念,我们可以通过类来完成对字符串类型的定义。所以经过前人的努力构建了一个字符串的类string类型,它直接支持了字符串连接,字符串大小比较,子串查找和提取,字符串插入和替换。使用字符串类时需原创 2017-11-28 16:20:23 · 294 阅读 · 0 评论 -
C++学习笔记--数组类模板、智能指针模板、单例类模板
上一节中讲到类模板,本节就针对类模板常用的例子来强化类模板。数组类模板前面讲过类模板的泛指类型参数,在模板参数中除了类型参数还有一种数值型参数,数值型参数也有他自身的限制:变量不能作为模板参数,什么意思呢?在声明了一个数值型参数后不能指定一个变量作为实际类型参数。浮点数不能作为模板参数。类对象不能作为模板参数。本质上就是说数值型模板参数是在编译阶段被处理的单元,因此在编译阶原创 2017-12-09 21:13:41 · 302 阅读 · 0 评论 -
C++学习笔记--临时对象
C中最值得警惕的是野指针,C++最值得的就是野指针和临时对象了,临时对象是C++中的一个灰色地带了,那么它是如何产生的呢,答案是由于直接调用构造函数导致的。直接调用构造函数将产生一个临时对象,它的生命周期只有一条语句的时间,作用域也仅仅在一条语句中,当语句执行完就自动被析构了。class Test { int i;public: Test(int ret) {原创 2017-11-24 21:20:27 · 308 阅读 · 0 评论 -
C++学习笔记--组合、继承
简单继承三句话描述继承:代码复用(子类可以完全当做父类使用)、面向对象(属性和方法描述)、长江后浪推前浪(子类不仅可以使用父类的所有属性和行为,还可以自定义自身特有的属性和行为 )。类与类之间存在什么联系吗?当然有的,组合和继承。组合就是一个类的成员变量包含其他的类对象。我们今天讲的主要是继承。什么叫做继承呢?从字面上看就是全部获取的意思。面向对象中的继承指的是类之间的父子关系,父类也...原创 2017-12-01 23:17:51 · 204 阅读 · 0 评论 -
C++学习笔记--继承中的构造与析构
当一个子类继承了父类后,在子类中如何初始化父类成员?子类中可以定义构造函数,而且必须对继承而来的成员进行初始化,可以直接通过初始化列表或在子类构造时通过给父类成员变量赋值的方式进行初始化父类的成员变量和在子类构造的时候直接调用父类构造函数。但是直接赋值有可能行不通,因为父类的私有成员变量是无法在外界访问的,那么此时就只能通过父类的构造函数来进行初始化工作了,父类构造函数在子类中有两种调用方式,默认原创 2017-12-02 23:55:29 · 200 阅读 · 0 评论 -
C++学习笔记--继承中的同名变量和同名函数
同名成员子类中是否可以定义与父类同名的变量?如果可以的话该怎么区分?可不可以试试就知道了。class Parent{public: int mi;};class Child : public Parent{public: int mi;};我们发现编译器是能通过编译的,说明父类与子类中可以定义同名变量。如果定义了一个子类对象c,那么c.mi = 100;原创 2017-12-03 20:29:47 · 1985 阅读 · 2 评论 -
C++学习笔记--初始化列表和类中的const成员变量
当我们在类里使用const定义一个成员变量会发生什么?能够通过构造函数直接初始化const定义的标识符吗?class Test{private: const int ci; int var1; int var2; int var3;public: Test() { //ci = 10;//error } in原创 2017-11-24 10:03:03 · 2656 阅读 · 0 评论 -
C++学习笔记--构造函数
当我们创建了一个类并定义了一个对象后并不显式初始化,我们知道对象成员变量的初始值是多少吗?是随机值还是0?答案是两者都有可能,在堆和栈上创建的对象成员初始值为随机值,在全局数据区创建的对象成员初始值为0。但是我们并不想它一会儿为随机值一会儿为0,想让它初始值为多少就为多少,又该怎么办?方法肯定是有的,在类里我们可以定义一个成员函数对成员变量进行赋值然后每次在创建对象后紧接着就调用初始化函数这样是不原创 2017-11-23 22:34:28 · 265 阅读 · 0 评论 -
C++学习笔记--类的静态成员变量和静态成员函数
前面我们知道通过对象名能够访问类的public成员变量,每个对象都有自己专属的一套成员变量,不能在对象之间共享。当我们想统计在程序运行期间某个类产生的对象数目,并且不能使用全局变量,该怎么办?如何在类里实现这种数据共享的问题?C++提供了静态成员变量来解决这种问题,静态成员属于整个类所有,并不隶属于单独的某个对象,所有对象共享类的静态成员变量,它的生命周期为整个程序的运行周期,我们可以通过原创 2017-11-26 10:15:45 · 313 阅读 · 0 评论 -
C++学习笔记--析构函数
为了在使用对象结束后进行一些请理性的资源,C++给出了析构函数的定义,它的功能和构造函数相反,所以在声明上为~classname(),析构函数没有参数也没有返回值类型声明,所以它不可以被重载,析构函数也是被自动调用的。class Test{ int mi;public: Test(int i) { mi = i; printf("Test原创 2017-11-24 11:20:21 · 285 阅读 · 0 评论 -
C++学习笔记--const对象和this指针
const对象const关键字能够修饰对象,修饰的对象为只读对象,它的成员变量不允许被改变,但这只是编译阶段的概念,运行时无效,可以使用指针修改成员变量。既然有const对象,那么必然也存在const成员函数,但是它有什么特性呢?首先const对象只能调用const成员函数,const成员函数中也只能调用const成员函数,const成员函数中不能直接改写成员变量的值。const成员函原创 2017-11-25 23:50:18 · 367 阅读 · 0 评论 -
C++学习笔记--重载new和delete
前面说过new申请的空间在堆空间上,那么我们能不能将new回来的空间存放在其他地方呢?能,那么该如何操作?首先关注下new和delete的被忽略的东西:new/delete本质上是C++预定义的操作符。C++对这两个关键字做了严格的定义。new:获取足够大的空间,默认是堆空间上,使用new一个对象的空间时会调用构造函数;delete:会调用析构函数释放占用的空间,默认还是在堆空间,ne原创 2017-12-13 23:09:40 · 259 阅读 · 0 评论 -
C++学习笔记--尴尬友元
什么叫做友元?它是C++中的一种关系,包括类与类之间和函数与类之间,友元关系是单向的,并且不能传递。为什么本节名字叫尴尬友元?因为由于友元的强大能力降低了程序的效率以及破坏了C++中的封装性,导致了在现代软件开发中已经几乎摒弃了这种能力。在类中,以friend关键字作为声明友元关系的关键字,一个类的友元可以是另一个类或者是一个函数,但是友元却并不是类中的一部分,存在友元关系的可以不受类中的访问原创 2017-11-26 22:42:32 · 296 阅读 · 0 评论 -
C++学习笔记--二阶构造模式
如何判断构造函数的执行结果?在构造函数中执行return语句会发生什么?构造函数执行结束是否意味着对象构造成功?在一般的构造函数中我们确实无法判断构造函数的执行结果,当我们在函数里添加bool标志虽然可以通过检测返回值但是终究不是一个好方法;在构造函数里如果添加了return语句的话,当执行到return语句时就会立即返回,如果是在初始化完成前返回的话就会产生一个半成品对象,这样的结果肯定不是原创 2017-11-26 19:29:27 · 426 阅读 · 0 评论 -
C++学习笔记--类对象、继承、多态的内存模型
以前我们学习过结构体变量在内存中是如何排布的,那么对于一个类对象,内存中又是如何排布的?在学习class关键字之前我们是使用struct关键字来创建一个类的,它与class仅有的区别就是默认的访问级别不同,struct的默认访问级别是public,class的默认访问级别是private。所以,class只是一个特殊的struct,在内存中依旧可以看做变量的集合,class遵循与struct相原创 2017-12-05 21:50:52 · 352 阅读 · 0 评论 -
C++学习笔记--抽象类-纯虚函数
什么是抽象类?面向对象中的抽象类可用于表示现实世界中的抽象概念,是一种只能定义类型,而不能产生对象的类,它只能被继承并重写相关函数,在抽象类中的相关函数最直接的表现特征就是没有完整的实现。比如现实世界中的图形,它是一个抽象的概念,但是又无法缺少,如果将图形做成一个类的话那么图形就可以说成是一个抽象类,如果我们说要对图形求面积的话是行不通的,因为没有指定具体的图形类型,没有任何意义,但是现实中缺少了原创 2017-12-07 22:50:21 · 550 阅读 · 0 评论 -
C++学习笔记--C语言模拟this指针
都知道,C++中类的成员变量和成员函数是分开存储的,变量可以存储在堆、栈、全局区,而函数只能存在代码段,并且一个类只对应一套成员函数,那么如何通过类对象调用成员函数呢?答案是通过this指针,类对象将this指针传递给函数,所以函数能够使用类对象的成员变量,而this指针保存的就是当前对象的地址。这个传递的行为被编译器隐藏起来了,下面通过C代码模拟this指针的传递过程。头文件test.h#...原创 2018-10-25 23:26:54 · 3928 阅读 · 3 评论 -
C++学习笔记--再谈const和引用
前面提到过C++编译器在遇到const常量时会将字面常量放入符号表,编译中遇到时直接拿符号表里的值替换,const引用会生成一个只读变量,那么我们是否有必要深入分析一下const修饰的标识符什么时候为只读变量?什么时候为常量?const常量的判别准则:只有用字面量初始化的const常量才会进入符号表使用其他变量初始化的const常量仍然是只读变量被volatile修饰的const常原创 2017-11-22 10:25:49 · 1022 阅读 · 0 评论 -
C++学习笔记--类模板
C++中将泛型思想引入到了类,实现了类模板,使得类的实现不再关注数据元素的具体类型,而只关注类所需实现的功能,适用于编写数据结构相关代码。C++中的类模板以相同的方式处理不同的类型,在类的声明前使用template关键字标识将要泛型编程,用于说明类中使用的T是泛指类型,类模板只能显式指定具体类型,无法像函数模板那样能够自动推导,下面给出定义过程和使用方法:template class O原创 2017-12-09 10:35:04 · 182 阅读 · 0 评论 -
C++学习笔记--函数模板
泛型编程就是不考虑具体数据类型的编程方式。而C++中存在一种泛型编程方式,函数模板。函数模板是一种特殊的函数可用不同类型进行调用,看起来和普通函数很相似,区别是类型可被参数化,形如下面:template void Swap(T& a, T& b){ T c = a; a = b; b = c;}其中,template关键字用于声明开始进行泛型编程,typename原创 2017-12-08 22:48:16 · 144 阅读 · 0 评论 -
C++学习笔记--数组操作符重载
首先问一下,在使用了string类后我们还能像在C中使用下标来操作数组的元素吗?当然可以啦,因为C++会最大限度的兼容C的用法,依然能够用下标操作单个字符。看下面一个逆序字符串例子:void reverseString(string &str) { int begin = 0; int end = str.length()-1; while(begin < e原创 2017-11-28 19:58:19 · 313 阅读 · 0 评论 -
C++学习笔记--C到C++的扩展
今天是我正式学习C++的第一天,那么作为一个学习单片机和嵌入式的程序员来说为什么还要学习在应用软件方面用处比较广泛的C++呢?而不是努力深入学习C语言呢?最开始我也同意如此认为的,嵌入式方面都是和底层打交道的,那为什么要放弃它而往应用层上学习,学好C的同时再学习数据结构不就行了?操作系统和驱动程序什么的都是用C写的,那我们学好C不是就够用了吗?甚至有些大牛都觉得C++用处并不大,还有就是以后做驱动原创 2017-11-19 15:18:52 · 277 阅读 · 0 评论 -
C++学习笔记--函数对象
什么叫做函数对象?干嘛用?函数对象就是通过对象来实现函数调用的功能,既然说到对象那么自然就想起了类,对的,函数对象就是在一个类里面实现函数调用操作符“()”的重载,那么它有什么用处,回忆一下函数有些什么特性,函数一旦调用就无法重来,局部静态变量处于函数内部,外部无法做出修改,使用全局变量虽然可以在函数更改,但是这又影响了使用,在不同条件下使用就得更改不同的初始状态,还是比较麻烦的,函数是全局的,是原创 2017-11-28 21:51:23 · 184 阅读 · 0 评论 -
C++学习笔记--操作符重载
我们前面学过函数重载,知道全局函数之间可以重载,类普通成员函数和类静态成员函数之间可以进行重载,因为他们都是在同一作用域下进行的。那么重载有什么意义呢?除了函数能不能对操作符进行重载呢?重载的意义是通过函数名对函数功能或者参数列表对函数功能进行提示,或者扩展系统中已存在的函数功能。既然能扩展函数功能,肯定也能扩展操作符的功能。对于一个复数类,我们想要直接使用+-来进行复数对应实部虚部计算,原创 2017-11-27 16:01:26 · 229 阅读 · 0 评论 -
C++学习笔记--引用
在进入正题前先回顾一下什么叫做变量。变量是一段连续物理空间的别名,在程序中通过变量来申请并命名存储空间,同样的通过变量也能使用一段存储空间。那么问题来了,一段连续的存储空间只能有一个别名吗?答案是否定的。在C++中增加了引用的概念,引用可以看做一个已定义变量的别名,它是个名词,用法如下:type& var_name = var;普通引用在定义时需要用同类型的变量进行初始化。例如:int a =原创 2017-11-19 19:55:15 · 161 阅读 · 0 评论 -
C++学习笔记--智能指针
我们知道当我们在堆空间中申请了一片内存后如果使用完毕后就应该释放,否则就会造成内存泄漏。这是所有程序员都基本知道的一个问题,即便都知道但还是出现了大量的因内存泄漏而导致的BUG,C++中并没有像Java语言中存在垃圾回收机制,而且指针还不能控制所指堆空间的生命周期,因为指针本身只是一个变量,它和堆空间的内存并没有任何关系,指针没了,但是堆空间还存在,既然C++是一门更贴近于生活的语言那么就应该对此原创 2017-11-29 15:20:11 · 218 阅读 · 0 评论 -
C++学习笔记--内联
C++中的const常量可以替换宏常量,那么是否有一个方法可以替代宏对代码块的替换呢?有的,就是内联函数,在C++中推荐使用内联函数替代宏对代码的替换,在具体介绍内联函数之前我们可以看一个代码片段:#include #define FUNC(a, b) ((a) < (b) ? (a) : (b))int main(int argc, char *argv[]){ int a原创 2017-11-20 19:58:56 · 217 阅读 · 0 评论 -
C++学习笔记--函数参数扩展和占位参数
默认参数 C++中可以在函数声明时为参数提供默认值,参数的默认值必须在函数声明中指定,还有一种函数是在main函数之前定义并实现的,这种也可以给函数参数提供默认值需要提醒的是:只能在函数声明时提供默认值,在后面的函数实现中提供默认值是错误的。当函数被调用时没有传入实参时,则使用默认值,例如:#include int sum(int x = 1, int y = 1, int z原创 2017-11-20 21:34:47 · 440 阅读 · 0 评论 -
C++学习笔记--陷阱!!逻辑操作符
逻辑操作符 && || !,在C语言中是经常使用的,C++是完全兼容了C的语法,那么又为什么说有陷阱呢?首先看逻辑操作符的原义:操作数只有两种值,真或假;逻辑表达式不需要全部计算完就能确定表达式的值;最终结果只能是真或假。int a = 0;int b = 1;if(a && b){ ... ...}当我们确定了表达式a的值后就能判断出逻辑表达式为为假,这就是所谓的短路法则,同理表原创 2017-11-29 19:58:29 · 171 阅读 · 0 评论 -
C++学习笔记--前置++、后置++操作符
在C语言中我们学习了前置操作符和后置操作符,比如++i,--i,i++,i--,由于++和--属于同类型操作符,此处讲解均以++作为模型。首先问一个问题,i++和++i有何区别?i++就是先返回i的值然后再加1;++i则是先对i加1再返回i的值。这是一般的解释。工程中,在C/C++中单独的两条语句在编译器编译后并没有任何区别,实现的汇编代码是一样的。通过观察汇编代码发现确实没有...原创 2017-11-29 22:24:09 · 511 阅读 · 0 评论 -
C++学习笔记--函数重载
重载的意思是什么?就是同一个标识符在不同上下文中发挥不同的作用,比如‘洗’这个字,配上不同的事物就代表不同的意义,洗衣服、洗脸等等。从平时生活中的自然语言我们可以延伸到程序语言中,即对函数进行重载。函数重载函数重载就是用同一个函数名定义不同的函数,当同一个函数名和不同参数列表搭配时函数的意义不同。int func(int x){ return x;}int func(int原创 2017-11-21 10:19:22 · 251 阅读 · 0 评论 -
C++学习笔记--类型转换函数
知道了普通类型可以转换成类类型,那么类类型可不可以向普通类型转换呢?为了求证,写几行测试代码试试:创建一个类,只包含一个私有成员变量,一个构造函数,一个普通成员函数。 class Test{ int mValue;public: Test(int i = 0) { mValue = i; } int value() ...原创 2017-11-30 13:33:26 · 313 阅读 · 0 评论 -
C++学习笔记--转换构造函数
在C中我们知道数据类型之间会进行隐式的类型安全转换,转换规则为小类型转大类型。下面看一些隐式转换的例子: short s = 'a';//合法 unsigned int ui = 200;//合法 int i = -1000;//合法 double d = i;//合法上面语句都是合法的,要么同类型赋值,要么小类型往大类型赋值,当我们在进行数据...原创 2017-11-30 10:59:16 · 277 阅读 · 0 评论 -
C++学习笔记--多重继承的问题
C++中允许一个类继承自多个类,所以可以编写多重继承的代码,一个子类可以拥有多个父类,继承关系和普通继承一样,子类拥有父类所有的成员变量和成员函数,并且子类可以当做任意的父类使用。多重继承的语法规则是:class Derived : public BaseA, public BaseB{ };其本质还是和单继承是一样的,子类中的变量排布也是先父类再子类,父类的排布顺序由继承顺序决定原创 2017-12-08 10:04:32 · 1103 阅读 · 0 评论 -
C++学习笔记--new和namespace
内存申请 在C中我们学习了动态内存分配(小知识:一般动态分配回来的内存空间比需要的略大)的函数,为什么我们在C++中还要学习新的内存分配方式?那是因为C中的malloc、calloc、等都不是C中自带的,而是通过库函数调用得到的,对于一些不支持这些库编译器就无法使用。C++中使用new关键字(表面是C++自带的,不取决于编译环境使用)进行动态内存分配,在C中的动态内存分配是基于字节分配的,但是原创 2017-11-21 12:02:02 · 279 阅读 · 0 评论 -
C++学习笔记--类型转换
C中经常会用到强制类型转换,比如(type)(表达式),这种粗暴的类型转换方式存在比较大的问题,他可以对任意类型之间的表达式进行转换,但是编译器却无法判断其正确性,当出现BUG时也很难在源码中快速定位所有使用过强制类型转换语句,导致很难查错,可我们也知道,在工程应用中难免会必须使用强制类型转换的时候,那么如何更加安全可靠的进行强制类型?C++中提供一种新式类型转换方案,将所有的强制类型转换分为原创 2017-11-21 19:01:35 · 216 阅读 · 0 评论 -
C++学习笔记--new失败后的处理
众所周知,C++中使用new关键字申请内存成功时会返回申请的内存起始地址,并在该地址上调用构造函数。那么,有考虑过失败的情况吗?动态申请的处理方式C语言int *p = (int*)malloc(10000000000000000000);if(NULL == p){ //申请失败处理分支}else{ //申请成功处理分支 //..... free(p);}C+...原创 2018-12-23 23:07:02 · 3616 阅读 · 3 评论