c++
code配上格子衫
终身学习
展开
-
理解面向对象的三大特性 -- 多态(详解!!!)
基于32位操作系统多态概念概念多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。C++中,实现多态有以下方法:虚函数,抽象类,覆盖,模板(重载和多态无关)。举例直接说明多态是什么可能不太好理解, 举个例子来说明一下。问题一个主人养了猫和狗,猫和狗都有自己爱吃的东西,主人在喂它们的时候,如果既要判断是猫还是狗,再判断他们分别爱吃什么,就显得很麻烦。如果主人养了很多种动物,这样的重复判断,就会浪费很多时间。解决多原创 2020-06-12 18:32:50 · 8899 阅读 · 8 评论 -
理解面向对象三大特性 -- 继承
继承的概念概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。定义被继承的类叫做基类继承的类叫做派生类方式: 派生类 : 继承方式 基类(下面进行详解)简单继承代码示例namespace test1 { class Person { public: void Prin原创 2020-06-11 18:52:11 · 1182 阅读 · 1 评论 -
STL —— vector,list,deque,使用与优缺点比较
关于vector list deque 已经做过介绍,本文是对三种容器的优劣做出比较。下面是vector list deque的博客链接vectorlistdequevector/list对比底层结构动态顺序表,一段连续空间带头结点的双向循环链表随机访问支持随机访问,访问某个元素效率O(1)不支持随机访问,访问某个元素效率O(N)插入和删除任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时有可能需要增容,增容:开辟新空间,拷贝元素,释放旧空间,导致效率更原创 2020-09-27 17:51:58 · 411 阅读 · 0 评论 -
带你攻克STL ——如何正确使用deque(深入理解deque底层)
deque介绍deque(双端队列):是一种双开口的"连续"空间的数据结构。双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。deque容器的存储结构deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:和 vector 容器采用连续的线性空间不同,deque 容器存储数据的空间是由一段一段等长的连续空间构成,各段空间原创 2020-09-27 17:43:20 · 2201 阅读 · 0 评论 -
STL —— priority_queue容器用法简介
文章目录priority_queue介绍使用模拟实现priority_queue介绍优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。(默认大堆)此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。底层容器可以是任何标准容器类模板,也可以是其他特原创 2020-09-26 16:33:13 · 425 阅读 · 0 评论 -
STL —— queue容器用法简介
介绍C++队列queue模板类的定义在头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的。C++队列queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。下图展示了一个 queue 容器及其一些基本操作:queue 的生成方式和 stack 相同,下面展示如何创建一个保存字符串对象的 queue:std::queue<std::string> words;也可以使用拷贝构造函数:std::queue原创 2020-09-26 16:20:34 · 318 阅读 · 0 评论 -
STL —— stack容器用法简介
文章目录一、简介二、函数用法示例三、结语一、简介stack是一种容器适配器(STL的容器分为顺序容器和关联容器,容器适配器,是对这两类容器进行包装得到的具有更强的约束力的容器),被设计来用于操作先进后出(FILO)结构的情景,在这种情况下, 元素的插入和删除都只能在容器的尾部进行。stack通过容器适配器来实现,是一种将特定的容器类作为其最底层的容器的类,它提供了一些特定的成员函数来访问自己的元素,元素只能在这个特定容器的后面,也就是栈的顶部,进行出栈和入栈操作。最底层的容器可以是任意一种标准的容器转载 2020-09-26 16:08:46 · 493 阅读 · 0 评论 -
带你攻克STL —— 如何正确使用list(重难点剖析及其模拟实现)
文章目录list介绍正确使用list构造函数iteratorlist 其他常用接口迭代器失效问题list模拟实现list介绍简单理解list,list就是一个封装了的双向链表,使得用户可以更加便捷使用。list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list原创 2020-09-26 15:38:40 · 205 阅读 · 0 评论 -
带你攻克STL —— 如何正确使用vector (重难点剖析及其模拟实现)
文章目录vector介绍正确使用vecotr初始化iterator空间问题扩容机制resize 和 reversevector 其他常用接口迭代器失效问题vector模拟实现vector介绍c++官方文档定义简单来说,vector就是一个被封装了的类, 这个类实例化的对象可以存储各种类型的成员,通过类中的成员函数我们可以高效的操作我们的数据。vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和原创 2020-09-26 15:02:51 · 615 阅读 · 0 评论 -
带你彻底理解大端小端,结构体内存对齐
大端小端小端存储:数据的低字节存储在地址空间的低字节位,数据的高字节存储在地址空间的高字节位。大端存储:数据的低字节存储在地址空间的高字节位,数据的高字节存储在地址空间的低字节位。因为现代PC大多采用小端字节序,小端字节序又被称为主机字节序。大端字节序也称为网络字节序。判断计算机是小端还是大端的核心点:1、取出int类型低字节存于char,对比取出的低位存放的数据跟整个int类型数据的值。2、跟据联合体特点,所有成员共享内存空间。特别的:网络字节序是大端模式。#include <s原创 2020-09-24 19:23:24 · 1036 阅读 · 0 评论 -
深入了解string的深浅拷贝,写时拷贝
c++中类中有默认的构造函数,其中就有拷贝构造,默认的拷贝构造按照字节进行拷贝,按字节拷贝的问题在于:如果该空间为指针变量,且指向一块正在管理的空间,当浅拷贝之后,就会有两个变量同时管理这块空间,当生命周期结束后,也会随之析构两次,这是不允许的。因此这种情况下,我们需要手动实现拷贝构造,简单来说,我们需要开辟空间,将原来管理的空间赋值一份,这样,一人一份就没有纠纷了。string深拷贝的实现,以及传深拷贝统写法与现代写法。#define _CRT_SECURE_NO_WARNINGS#includ原创 2020-08-09 17:49:39 · 656 阅读 · 0 评论 -
C++ —— 内存管理详解
文章目录内存分配堆与栈的区别静态变量与非静态变量动态内存管理内存泄漏内存泄漏分类危害 和 预防内存分配栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是可以上增长的。数据段–存储全局数据和静态数据。代码段–可执行的代码/只读常量。堆与栈的区别管理方式不同 :栈是由编译器自动申请和释放空间,堆是需要程序员手动申请和释放;空原创 2020-09-21 17:05:28 · 924 阅读 · 0 评论 -
C++ —— 友元,内部类以及cin cout重载的实现
友元在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。作用: 提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。友元函数友元函数是可以直接访问类的私有成员的非成员原创 2020-09-21 16:08:45 · 580 阅读 · 0 评论 -
C++ —— 深入浅出带你理解类和对象
文章目录类的空间存储匿名对象this指针六大默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载const与非const取地址重载exlicit关键字static与类和对象类的空间存储匿名对象this指针六大默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载const与非const取地址重载exlicit关键字static与类和对象...原创 2020-09-21 09:58:35 · 200 阅读 · 0 评论 -
C++ —— 代替宏的inline内联函数与const
内联函数在C++中宏函数的概念是使用内联函数来实现的,而无论从哪一方面来说,内联函数都是真正的函数。唯一不同之处是内联函数在适当的地方像宏一样展开,所以不需要函数调用的开销。任何在类中定义的(在花括号内)函数会自动地成为内联函数;开栈的开销 > 执行的开销 建议设为inline开栈的开销 < 执行的开销 不建议 代码膨胀注意事项对于那些函数体代码量很小,又经常调用的函数,一般用作内联函数。因为函数体代码很小,函数体执行的时间远小于调用函数的时间,从而提高代码执行效率。一原创 2020-08-11 11:14:31 · 467 阅读 · 0 评论 -
C++ —— 理解引用及其原理
概念引用的简单概念: 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。引用一般被使用做参数/返回值这样可以提高效率, 减少拷贝。底层实现在语言层面引用是一个对象的别名不占据空间, 但是实际上在底层的实现上引用是类似于指针实现的。我们借助代码进行探索int i=5;int &ri=i;ri=8;通过:调试->窗口->反汇编int i=5;00A013DE mov dword原创 2020-09-19 18:44:59 · 1408 阅读 · 0 评论 -
C++ —— 函数重载,extern“C“,缺省参数
概念函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。也就说在同一作用域下通过名称相同,参数不同实现函数的区分。底层实现c++名字修饰规则:实际我们的项目通常是由多个头文件和多个源文件构成,而通过我们C语言阶段学习的编译链接,我们可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Ad原创 2020-09-19 18:13:01 · 299 阅读 · 0 评论