![](https://img-blog.csdnimg.cn/3d9e0c8a25264a7b9314ed608ffeddda.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
文章平均质量分 86
主要讲述c++语言
胡代洲
埋头拉车,抬头看路
展开
-
C++学习总结
序言今天是2021年12月31日,也是2021年的最后一天,时间过得很快,也很慢,回想年初在江边玩耍的时候定下学习目标,仿佛就是昨天的事,细想来从定下目标的那一天至今我已完成了很多课程的学习,复盘今年,好像我走哪都只有学习的那种感觉给我留下的印象最深刻,我都怀疑如果不是学习,也许我现在根本想不起今年都去到了哪里,干了些什么。今年出了两趟远门,去了趟上海出差,在酒店的桌子上学习链表。去了趟河南的丈母娘家,在书桌上学习动静态库的引用和作用域、链接属性等。年初时周末为了不被家里小孩打扰,在弟弟的新房里学...原创 2022-01-10 09:40:05 · 1119 阅读 · 0 评论 -
C++ 智能指针
智能指针是为了解决内存泄漏问题,与普通指针相比,他能够自动释放malloc或者new的内存的空间。智能指针本质上的实现是函数连带自动释放,先来看段代码:class smartp {public:smartp(T size) { p=new T(size); } ~smartp() { if(p !=NULL) delete[] p;}pri...原创 2022-01-02 11:25:11 · 523 阅读 · 0 评论 -
STL其它容器-下
mapmap释义“映射”,和set类似,是一个典型的有序关联容器,不同的是map是成对的(key,value)且一对一映射,一个key对应一个value,key不能重名,但value是不做限制的,而set只有key,map和set用法很类似,map中的元素由pair构成。pairpair释义“对”,也就是(key, value),本质上是一个只有两个元素的结构体,pair中的两个元素类型可以相同,也可以不同,两个元素的名字是固定的,前者叫first对应key,后者叫second对...原创 2021-12-28 09:29:38 · 515 阅读 · 0 评论 -
C++ STL其它容器 (上)
STL的三种容器适配器容器适配器:queue、priority、stack有序关联容器:set、map、multiset、multimap无序关联容器:unordered_se和unordered_map/unordered_multiset和unordered_multimap什么是容器适配器适配器adapter,本质是添加一个中间层来转换要适配双方,c++有三种适配器:函数适配器、容器适配器、迭代适配器。函数适配器我们在...原创 2021-12-26 10:51:01 · 866 阅读 · 0 评论 -
c++类型萃取
类型萃取类型萃取,可简单理解为类型获取,萃取的典型应用是在模板函数中区分T的类型是原生类型POD,还是自定义类型,POD全称plain old data,简单理解就是c++从c继承来的基本数据类型,如int、double等。之所以需要区分类型,主要是因为POD类型与自定义类型的很多处理方法不同,典型的就是copy,POD可以直接使用c库提供的memcpy,它主要是实现内存层面的拷贝,而非POD类型需要使用for循环挨个拷贝,因为涉及到深拷贝与浅拷贝的问题,所以在模板中...原创 2021-12-24 11:55:10 · 2489 阅读 · 0 评论 -
C++模板特化
模板特化在学习模板的时候我们用模板来解决了一个add模板函数,实现不同类型的传参相加,实践证明,模板函数比普通函数好用。那么现在如果我们要新增一个需求,就是如果传入的是两个string类型的参数,我们不要简单的拼接,我们要在两个字符串之间添加一个空格,显然模板函数已经无法满足我们的要求,解决方法就是使用模板特化,简单说就是模板的一个特殊化,当传参为两个string类型的时候,不调用模板函数,而是调用特化模板函数,传入其它类型的时候,仍然使用模板函数,如下示例:template &l...原创 2021-12-24 11:26:26 · 1427 阅读 · 1 评论 -
c++ STL泛型算法
什么是泛型算法软件分数据和计算两部分,前面我们学的容器是对数据的封装,被称为数据结构。关于这些数据结构的计算在容器内部包含了一部分,如sort用来排序,但是没有提供更多,每一个容器内的的sort的实现方法不同,因为他们面对的是不同的容器,泛型算法是独立于容器类的一些操作方法,可以通用于多种容器,所以叫泛型,泛型算法有更高的抽象,实现起来难度更大,这也是STL的核心技术。使用STL算法库进行升序排序,示例代码如下。vector<int> bb{4,2,1,3,5};so...原创 2021-12-23 17:04:24 · 605 阅读 · 0 评论 -
STL容器类和迭代器
STL容器类介绍容器,顾名思义就是盛放东西的东西,如盛饭的饭碗就是一个容器,这样的容器c++库也为我们提供了,只是不能用来盛饭。在程序中只有数据和数据处理方法,数据和方法结合在一起就形成了类或对象,在面向对象的语言中流行一切皆是对象,要有对象首先肯定要有类,用来存放对象的类就叫容器类,简称容器。计算机的运行时数据只能存放在内存中,而容器类就是用做容器的内存管理方法。容器的内涵就是数据结构(数据打包的方法)+算法(数据处理方法)。容器其实我们早就接触...原创 2021-12-18 21:01:09 · 293 阅读 · 0 评论 -
c++模板编程
模板引入模板主要是用来解决类库与类库使用不是一个人,编写类库时,不能确定使用类库的人会传入什么类型的数据,而做的一个类型抽象,编译器根据具体调用类库的时候,调用者传入的参数自动推导出数据类型,来替换类库中的数据类型。template关键字定义一个模板,typename关键字指定模板类型抽象名称。示例如下:template<typename T> void myswp(T &a,T &b) //交换数据{ T temp; temp=a;...原创 2021-12-13 10:22:31 · 3238 阅读 · 0 评论 -
嵌套与局部类
嵌套类嵌套类,就是类中再定义了一个类,外面的叫外围类,内部的叫内部类,如下示例,外部类与内部类各有自己的权限,且遵守传统权限规则,两者的友元函数仅在自己的类中有效,嵌套类可以用来隐藏类名,减少全局标识符,限制用户使用内部类来创建对象,以提高抽象能力,还可用来强调两个之间的主从关系。class a{ public: class b { public: void func(); }}局部类...原创 2021-12-09 10:29:05 · 427 阅读 · 0 评论 -
C++的友元函数和友元类
友元函数在c++中对类的成员设置了保护,如private和protected是不允许外部访问的,有时候有一个外部函数就是需要访问,为了解决这个问题,c++开了个后门,就是友元函数,友元函数就是将外部函数在类中进行申明,声明时前面添加friend关键字,将其声明为类的友元函数后就可以任意访问类中成员。示例如下:class person{ public: string name; private: i...原创 2021-12-09 10:17:56 · 749 阅读 · 0 评论 -
C++静态成员
staticstatic这个关键字在c中有两个完全不相干的两种语义,在函数局部用来修饰局部变量,函数前面用来将函数的作用域限定在本文件中。为了尽可能的减少关键字,所以c++又给static定义了第三种完全不相干的语法,在类中用来修饰静态成员。static用在成员变量,那么就是静态成员变量;static用在成员函数,那么就是静态成员方法;static成员实例化经过static修饰后的成员属于类本身而不属于对象,在定义对象的时候不会去实例化静态成员...原创 2021-12-09 09:40:08 · 244 阅读 · 0 评论 -
运算符重载
从函数重载说起函数重载是在一定的作用域内,多个名称相同,但是参数不同的函数重载,在编译时由编译器根据给的参数类型来决定调用哪一个函数,这个过程被称为“重载决策”,重载的本质还是多个独立的函数,函数重载发生在编译过程,与运行无关,函数重载的意义就是避免我们给函数乱起名,也是为了方便编写类库覆盖各种操作,函数重载也是一种语法糖。什么是运算符重载我们平时用到的算数运算符如+、-、×、÷和关系运算符>、 =、 < 就是典型的可以运算符重载的符号,然而并不是...原创 2021-12-06 09:49:30 · 194 阅读 · 0 评论 -
c++继承与多态(下)
派生类同名处理隐藏redifine当我们在派生类中写了一个与基类同名、同参的成员方法时,编译器不会报错,当我们通过派生类定义的对象去访问重名函数时,会访问到派生类的那个函数,这种现象叫做“重定义”有时候也叫“隐藏”,实际上在派生类中两个函数都存在,只是在不同类域名中,新成员方法会隐藏掉旧方法,这个是当然,如果旧方法隐藏新方法,那还要新方法干嘛。访问被隐藏成员的方法 如果想要访问被隐藏的方法,可以将派生类强制转换成基类的类型,再去调用,编译器会以为是...原创 2021-12-03 11:52:04 · 150 阅读 · 0 评论 -
c++继承与多态(上)
什么是继承儿子继承父亲的财产,父亲的东西就是儿子的东西,这就是继承,在c++的类中把父亲叫做基类或父类,儿子叫做派生类或叫子类,继承是c++原生支持的一种语法特性,是c++的面向对象的一种表现。就像儿子继承父亲的财产一样,派生类可以瞬间拥有基类的所有(有权限的情况下)属性和方法,继承的出现本质上是为了解决代码的复用,类在c中可以理解为结构体,派生类可以理解为结构体包含结构体。继承语法如下:class 派生类名:权限控制 基类1,访问控制 基类2,访问控制 基类3{成员变量和成员...原创 2021-11-29 09:48:53 · 268 阅读 · 0 评论 -
类的权限控制
拷贝构造函数当我们定义一个普通类型的变量时,可以直接赋初值,也可以间接赋初值,如下:int a = 7;//直接赋初值初始化int b=a; //间接赋初值初始化c++极力想让我们在操作类的时候也有操作普通变量一样的感觉,所以类的初始化也给了直接初始化和间接初始化,示例如下:class person p1(“hdz”,32,ture); //直接初始化class person p2=p1; class person p2(p1); //间接初始化,...原创 2021-11-25 11:50:19 · 464 阅读 · 0 评论 -
构造与析构函数
面向对象编程的整体工作分为2大块,一个是建模(将任务抽象成类)和编写类库(类的方法实体编写),另一个是使用类库来编写主程序完成业务。有些人只负责建模和编写类库,这些都是高手,还有些人是调用现成的类库来编写自己的主任务程序。c++的四重境界第一重:语法层面,对语法比较熟悉,会使用c++的语法来建模、编程。 第二重:基于第一重,能使用c++来解决实际问题。我们工作大部分时候在这一重。 第三重:编写库给别人用,出了问题能快速解决,这种人基础比较强,且有一定的框架思维。 第四重:理解c...原创 2021-11-24 10:45:06 · 331 阅读 · 0 评论 -
MDK平台使用c++编写STM32单片机程序
本文介绍了在mdk(keil)平台下,如何使用c++来实现面向对象编程,解决我们单片机中一些复杂的业务。原创 2021-11-19 18:36:11 · 1166 阅读 · 0 评论 -
c和c++面向对象的对比
概述面向对象并不是c++的特有的,理论上说,所有语言都可以实现面向对象。只是面向对象的语言原生就支持面向对象编程,实现面向对象特别简单。而非面向对象的语言要实现面向对象需要程序员去做些额外的工作。面向对象编程就像是我们平时的惯用的比喻修辞手法一样,能更容易理解问题。面向对象只是编程语法层面的,是来帮助人类理解的,实际上经过编译后的二进制文件根本就不存在面向对象的概念。面向对象是一种思维、是一种解决问题的思路,往大了说面向对象就是一种哲学。...原创 2021-11-18 18:48:56 · 1048 阅读 · 0 评论 -
c++内存管理
概述内存管理的原理庞大而复杂,然而这些都被操作系统进行了封装,并对外预留了API,这些api被c++调用,同时也被c++再次进行了封装,再面向程序员预留出了语法特性的接口,作为使用c++的程序员,我们只需要掌握c++预留的内存管理特性即可,就像我们开车不需要管变数箱、发动机是怎么变速、点火的,我们只需要掌握汽车给我们预留的接口,方向盘、刹车、油门如何使用即可。c++程序容易出bug,主要就是因为内存管理部分的复杂性 ,java、python等语言提供了更多的封装,所以...原创 2021-11-17 10:19:50 · 378 阅读 · 0 评论 -
c++关键字(下)
castcast转换包含多个类型转换,在c中类型转换有两种,如果是允许互相转换的类型,编译器就直接隐式类型转换了,不允许的,可以强制类型转换,这种其实有一些一刀切的味道。c++为了避免这种一刀切,把强制类型转换进行了细分。隐式可以由程序员自己转换使用static_cast、不兼容类型转换使用reinterpret_cast,而const类的转换使用const_cast,需要动态确认的使用dynamic_cast转换。static_caststatic_cast第一...原创 2021-11-15 19:39:24 · 358 阅读 · 0 评论 -
c++标准库iostream
我们学习c的时候也频繁用到了一些库,但是库并不多,c++也有库,且比c要多,通常越高级的语言库越多,如java、python等封装越严重的语言库就更多,在学习高级语言时学习库占比变得很重,如python我们学习完他的语法才算刚刚入门,后面的提高就是库的应用。一个典型的c程序(后缀.c)可以完全被视为c++程序来编译。在c++的编译器中自动定义了一个long int型__cplusplus(双下划线)变量用来存放当前c++的版本,而c没有该变量,所以c程序可以使用宏来判断是否有定义__cplu...原创 2021-11-14 16:32:02 · 8851 阅读 · 0 评论 -
为什么要学习c++
前言今天是2021/10/31日,前面历时8个月的时间终于把朱友鹏老师的嵌入式linux核心课程学习完了,今天也正式进入c++课程。此刻我心存犹豫,因为linux核心课程我虽然学完了,但是缺乏实际项目练习,所以整个课程掌握得并不牢靠,前面很多的课程内容甚至都已经忘了,犹豫的是该继续做几个项目来巩固前面的课程还是继续往前走,学习c++。综合考虑,我目前的首要目标是转型软件开发,对当前的硬件开发工作已经心不在焉,所以我觉得还是应该快刀斩乱麻,尽快转向自己想做的事情,以改变现在的工作状态,这是对...原创 2021-11-01 11:44:57 · 726 阅读 · 0 评论 -
c++命名空间
命名空间的由来命名空间(namespace),是c++引入的一种机制,namespace目的是用来解决全局变量名与函数名或函数名与函数名之间名称相同的冲突的。c语言没有namespace,从c扩展而来的c++早期也没有,后来的c++、java、python都使用了这种技术,甚至在一些高级语言中把namespace设计得更好。一个客观的事实就是一个庞大的项目,如linux内核,内部上万个.c文件,变量与函数名称重名是不能避免的,如同在中国,重名太正常不过了。本节我们就是...原创 2021-11-07 10:39:31 · 10739 阅读 · 1 评论 -
C++关键字(上)
c++的关键字相较于c的关键字的变化,分为新增关键字、新增语义、语义变化、无变化四大类,无变化的我们不提,只看前三部分。boolbool类型也叫逻辑类型,是个两值enum,结果为true和false(这两个也是c++的关键字),我们在c程序中也见过bool,实际上c中并没有bool这个关键字,是编程的人自己使用typedef int bool来重命名的,而在c++中原生就支持了该类型,一般占1个字节(与平台有关),用法与c中自定义的相同,因为编译器本来就认识bool,所以在c++中函...原创 2021-11-14 11:20:10 · 376 阅读 · 0 评论