
C++
文章平均质量分 53
L&Li
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
线程的临界区
临界区解决线程冲突问题,多个线程操作同一个变量,会引发这样对待问题。原创 2022-09-15 15:58:06 · 278 阅读 · 1 评论 -
让一个对象只在栈(堆)上分配内存
在c++中,类的对象建立分为两种,一种是静态建立,比如A a;另一种是动态建立,比如是由编译器为对象在栈空间中分配内存,通过移动栈顶指针挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。这种方式是。是用new关键字将对象建立在堆空间上,这个过程分两步走。首先是执行,在堆空间上搜索合适的内存并分配;第二步是调用构造函数构造对象,初始化这片内存空间。这种方式是。Heap(堆):堆的大小并不固定,可动态调整。其分配由malloc()、new()等这类实时内存分配函数来实现。原创 2022-05-09 17:55:48 · 285 阅读 · 0 评论 -
找出两个字符串中最大子字符串,如“abractyeyt“,“dgdsaeactyey“的最大子串为“actyey“
找出两个字符串中最大子字符串,如"abractyeyt",“dgdsaeactyey"的最大子串为"actyey”#include <iostream>#include <string>using namespace std; string MaxSameStr(string str1,string str2){ string result; int max=0,first; int len=0;//相同字符串的长度 int k,q;原创 2021-08-29 15:50:46 · 156 阅读 · 0 评论 -
前缀、中缀、后缀表达式转换
1、中缀表达式转后缀表达式的两种方法:假定有中缀表达式A:1 + (( 2 + 3)* 4 ) – 5,请将它转化为后缀表达式。方法一:直接转换法(1)首先确定表达式表达式A的运算顺序,然后加括号:((1 + (( 2 + 3)* 4 )) – 5 )(2)从最里面的一层括号开始运算,转换成后缀表达式的方法为:(忽略括号)数字在前,符号在后。 1)( 2 + 3) => 23+ 2) (( 2 + 3)* 4 ) => 23+4*原创 2021-08-29 15:28:24 · 592 阅读 · 0 评论 -
C++中的boolalpha
1.头文件#include <iostream>2.功能boolalpha: 把bool值显示为true或falsenoboolalpha: 取消 boolalpha流的格式标志3.例子void test_boolalpha(){ std::cout << "true is " << true << std::endl; std::cout << "false is " << false << std::原创 2021-08-24 22:17:19 · 654 阅读 · 0 评论 -
C++智能指针
智能指针的作用C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高 了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易 造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。头文件:#include < memory>C++11 中推出了三种智能指针,unique_ptr、shared_ptr 和 weak_ptr,原创 2020-07-28 17:43:39 · 226 阅读 · 1 评论 -
C++异常
异常是一种程序控制机制,与函数机制独立和互补 函数 是一种以 栈结构 展开的上下函数衔接的程序控制系统,异常 是另一种控制结构,它依附于栈结构,却可以同时设置多个异常类型作为网捕条件,从而以类型匹配在栈机制中 跳跃回馈1)C++的异常处理机制使得异常的引发和异常的处理不必在同一个函数中,这 样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调 用者可以再适当的位置设计对不同类型异常的处理。 2)异常是专门针对抽象编程中的一系列错误处理的,C++中不能借助函数机 制,因为栈结构的本质原创 2020-07-19 02:01:05 · 94 阅读 · 0 评论 -
C++设计模式(一)四种法则
设计模式(一)软件设计模式的种类面向对象设计原则面向对象设计原创表开闭原则迪米特法则依赖倒转原则合成复用原则软件设计模式的种类GoF提出的设计模式有23个,包括:创建型(Creational)模式: 如何创建对象;结构型(Structural )模式: 如何实现类或对象的组合;行为型(Behavioral)模式: 类或对象怎样交互以及怎样分配职责。设计模式目前种类: GoF的23种 + “简单工厂模式” = 24种。设计模式的基础是:多态。面向对象设计原则面向对象设计原则为支持可维护性复用原创 2020-07-13 17:24:44 · 297 阅读 · 0 评论 -
C++几个常用的排序
C++排序冒泡排序排序目的:把无序的数据元素排成有序的数据元素排序的稳定性:如果在序列中有两个数据元素r[i]和r[j],它们的关键字k[i] ==k[j],且在排序之前,对象r[i]排在r[j]前面。如果在排序之后,对象r[i]仍在r[j]前面,则称这个排序方法是稳定的,否则称这个排序方法是不稳定的。即两个相等的数据元素原来在前面的,排序后还是在前面比较和交换是排序的基本操作多关键字排序与单关键字排序无本质区别排序的时间性能 是区分排序算法好坏的主要因素时间性能:关键性能差异体现在比较和原创 2020-07-11 16:58:05 · 394 阅读 · 0 评论 -
C++类型转换
c风格的强制类型转换,不管什么是什么类型,统统都是Type b = (Type)a;c++风格的类型转换提供了4种类型转换操作符来应对不同场合的的应用static_cast<> 父子 继承关系的指针或引用dynamic_cast<> 只能转换有继承关系的指针或引用,只能由子类转父类(基类)const_cast<> 增加或去除 对象的constreinterpret_cast<> 强行转换类型,用于没有任何关联之间的转换//1 static_c原创 2020-07-19 00:39:40 · 118 阅读 · 0 评论 -
左值与右值、左值引用与右值引用
左值和右值:左值 是=左边可被赋值的值;必须要在内存中有实体;右值 是=右边取出值赋给其他变量的值;可在内存或寄存器。一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址。“可以取地址的,有名字的,非临时的就是左值;”“不能取地址的,没有名字的,临时的就是右值;”引用引用的本质还是靠指针来实现的(常指针)。引用相当于变量的别名。引用可以改变指针的指向,还可以改变指针所指向的值。声明的时候必须初始化,一经声明绑定,不可变更绑定其他对象可对引用,再次引用。多次引用的原创 2020-07-07 20:07:21 · 519 阅读 · 0 评论 -
C++设计模式(四)行为型
设计模式(三)行为型模式模板方法模式命令模式策略模式观察者模式行为型模式模板方法模式定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。优点:(1)在父类中形式化地定义一个算法,而由它的子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序。(2)模板方法模式是一种代码复用技术,它在类库设计中尤为重要,它提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为,它鼓励我们恰当原创 2020-07-06 22:22:08 · 580 阅读 · 0 评论 -
C++设计模式(三)结构型
设计模式(二) 结构型模式代理模式装饰模式外观模式适配器模式结构型模式让类和类进行组合,获得更大的结构。代理模式为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。优点:(1)能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。(2)客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性缺点:代理实现较为复杂。适用场景为原创 2020-07-06 21:59:42 · 299 阅读 · 0 评论 -
C++设计模式(二)创建型
设计模式软件设计模式的种类面向对象设计原则面向对象设计原创表创建型模型软件设计模式的种类GoF提出的设计模式有23个,包括:创建型(Creational)模式: 如何创建对象;结构型(Structural )模式: 如何实现类或对象的组合;行为型(Behavioral)模式: 类或对象怎样交互以及怎样分配职责。设计模式目前种类: GoF的23种 + “简单工厂模式” = 24种。设计模式的基础是:多态。面向对象设计原则面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式中原创 2020-07-06 21:59:20 · 275 阅读 · 0 评论 -
multimap案例_员工分组
//multimap 案例//公司今天招聘了 5 个员工, 5 名员工进入公司之后,需要指派员工在那个部门工作//人员信息有: 姓名 年龄 电话 工资等组成//通过 Multimap 进行信息的插入 保存 显示//分部门显示员工信息 显示全部员工信息#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <vector>#include <map>#include <string>原创 2020-07-03 17:58:25 · 269 阅读 · 0 评论 -
STL的常用容器
常用容器string 容器string 的特性string 常用 APIvector 容器vector特性vector常用APIdeque 容器deque 特性deque常用APIstring 容器string 的特性1)Char是一个指针,String是一个类string封装了char,管理这个字符串,是一个char*型的容器。2)String封装了很多实用的成员方法查找find,拷贝copy,删除delete ,替换replace,插入insert3)不用考虑内存释放和越界string管原创 2020-07-03 18:02:23 · 521 阅读 · 0 评论 -
STL常用的算法概述
算法概述算法概述常用遍历算法for_each练习代码:transform练习代码:常用查找算法find算法案例常用排序算法常用拷贝和替换算法常用算数生成算法常用集合算法算法概述算法主要是由头文件< algorithm > < functional > < numeric >组成。< algorithm>是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等…< numeric>体积很小,只原创 2020-07-11 17:02:29 · 247 阅读 · 0 评论 -
C++的继承和派生基础知识
继承和派生类与类之间的关系继承的方式派生类成员的标识和访问继承中的构造和析构父类与子类的构造,析构函数的关系继承中构造析构调用原则继承和组合并存,构造和析构原则继承中同名成员变量处理方法派生类中的static关键字类与类之间的关系类的继承定义:类的继承,是新的类从已有类那里得到已有的特性。或从已有类产生新类的过程就是类的派生。原有的类称为基类或父类,产生的新类称为派生类或子类。派生与继承,是同一种意义两种称谓。 isA 的关系。 派生类的组成派生类中的成员,包含两大部分,一类是从原创 2020-07-04 23:03:25 · 323 阅读 · 0 评论 -
纯虚函数 抽象类
基本概念纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何 派生类都定义自己的版本 纯虚函数为个派生类提供一个公共界面(接口的封装和设计、软件的模块功能划分) =0,不是赋值,是语法一个具有纯虚函数的基类称为抽象类。 面向抽象层编程,意义何在?依赖倒转原则,可以解决main函数与实际类型的耦合度减少,维护度高,不用关心其他接口函数,拓展性强在构造函数中,只能初始化一些固定的变量,需要额外初始化的一些变量,不要放在构造函数中,在抽象类中,提供一个显示的初始化函数抽象原创 2020-07-18 01:51:44 · 158 阅读 · 0 评论 -
函数模板与类模板
泛型(Generic Programming)即是指具有在多种数据类型上皆可操作的含意。泛型编程的代表作品 STL 是一种高效、泛型、可交互操作的软件组件。 泛型编程初诞生于C++中,目的是为了实现C++的STL(标准模板库)。 其语言支持机制就是模板(Templates)模板的精神其实很简单:参数化类型。 换句话说, 把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来 做成模板参数 T所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不 具体指定,用一个虚拟的类型来代表原创 2020-07-18 23:55:21 · 150 阅读 · 0 评论 -
C++多态基础知识
多态C++中所谓的多态(polymorphism)是指,由继承而产生的相关的不同的类,其对象 对同一消息会作出不同的响应。多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。可以减轻 系统 升级,维护,调试的工作量和复杂度.C++中通过virtual关键字对多态进行支持使用virtual声明的函数被重写后即可展现多态特性 多态成立的条件多态是设计模式的基础,多态是框架的基础静态联编和动态联编1、联编是指一个程序模块、代码之间互相关联的过程。 2、静态联编(static b原创 2020-07-18 01:41:51 · 207 阅读 · 0 评论 -
多继承 虚继承
多继承一个类有多个直接基类的继承关系称为多继承虚函数如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则 在对该基类中声明的名字进行访问时,可能产生二义性 多继承中二义性问题虚继承virtual¬ 如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性¬ 如果在多条继承路径上有一个公共的基类,那么在继承路径的某处汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象¬要使这个公共基类在派生类中只产生一个原创 2020-07-18 01:43:36 · 118 阅读 · 0 评论 -
deque容器_打分案例
#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <vector>#include <deque>#include <algorithm>#include <string>#include <time.h>#include <stdlib.h>using namespace std;//评委打分案例(sort 算法排序)//创建 5 个原创 2020-07-03 17:57:40 · 153 阅读 · 0 评论 -
STL的综合案例_学校演讲比赛
学校演讲比赛介绍1)某市举行一场演讲比赛( speech_contest ),共有24个人参加。比赛共三轮,前两轮为淘汰赛,第三轮为决赛。2)比赛方式:分组比赛,每组6个人;选手每次要随机分组,进行比赛;第一轮分为4个小组,每组6个人。比如100-105为一组,106-111为第二组,依次类推,每人分别按照抽签(draw)顺序演讲。当小组演讲完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。第二轮分为2个小组,每组6人。比赛完毕,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。第原创 2020-07-06 19:18:55 · 438 阅读 · 0 评论 -
STL函数对象 内建函数 函数对象适配器
函数对象函数对象的概念谓词概念内建函数对象函数对象适配器函数对象的概念重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用。注意:1.函数对象(仿函数)是一个类,不是一个函数。2.函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。一元仿函数”(unary functor):重载的 operator()要求获取一个参数;二元仿函数”(b原创 2020-07-13 13:16:01 · 131 阅读 · 0 评论 -
C++对象动态建立和释放new和delete
在C语言中是利用库函数malloc和free来分配和撤 销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代 malloc和free函数虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用 malloc和free函数,而用new和delete运算符。 int *p = new int;delete p;int *array_p = new int[10];delete[] array_p;malloc不会调用类的构造函数,而new会调用类原创 2020-07-20 00:37:56 · 321 阅读 · 0 评论 -
C++运算符重载提高
运算符重载提高赋值运算符重载 (operator=)数组下标运算符 (operator[])自定义数组类函数调用符号 (operator () )不可重载 && 和 || 操作符自定义字符串类赋值运算符重载 (operator=)用一个己有对象,给另外一个己有对象赋值。两个对象均己创建结束后,发 生的赋值行为。#define _CRT_SECURE_NO_WARNINGS#include <iostream>using namespace std;class原创 2020-07-18 01:06:42 · 236 阅读 · 0 评论 -
C++运算符重载
运算符重载友元重载 成员重载重载规则双目运算符重载单目运算符重载输入输出运算符重载友元还是成员所谓重载,就是重新赋予新的含义运算符重载的本质是函数重载。 友元重载 成员重载重载规则(1)C++不允许用户自己定义新的运算符,只能对已有的 C++运算符进行重载。 (2)C++允许重载的运算符 不能重载的运算符只有 4 个:(3)重载不能改变运算符运算对象(即操作数)的个数。 (4)重载不能改变运算符的优先级别。 (5)重载不能改变运算符的结合性。 原创 2020-07-17 23:55:57 · 147 阅读 · 0 评论 -
C++友元函数友元对象
友元采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成 员,成员函 数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需 要定义一些函数,这 些函数不是类的一部分,但又需要频繁地访问类的数据成员, 这时可以将这些函数定义为该 函数的友元函数。除了友元函数外,还有友元类, 两者统称为友元友元的作用是提高了程序的运行效率(即减少了类型检查和 安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。友元可以是一个函数,该函数被称原创 2020-07-18 01:09:44 · 364 阅读 · 0 评论 -
C++静态成员变量和成员函数
静态成员变量和成员函数类的静态成员,属于类,也属于对象,但终归属于类。 静态成员变量总结:静态成员函数静态成员占大小从上面可得出,求类的大小,static成员不包含在内C++类对象中的成员变量和成员函数是分开存储的成员变量:普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式静态成员变量:存储于全局数据区中成员函数:存储于代码段中。 this指针int getK( ) const //成员函数尾部出现const,修饰的原创 2020-07-18 01:09:06 · 71 阅读 · 0 评论 -
C++对象的构造和析构
对象的构造和析构构造函数析构函数拷贝构造函数构造函数的分类使用拷贝构造函数的几种场合构造函数C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做 构造函数. 在对象被创建的时候,用来初始化对象的函数自动调用:一般情况下C++编译器会自动调用构造函数.手动调用:在一些情况下则需要手工调用构造函数. 析构函数C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的成员函数叫做 析构函数.析构函数的作用,并不是删除对象,而在对象销毁前完成的一些清理工作。析构函原创 2020-07-17 01:46:16 · 813 阅读 · 0 评论 -
C++面向对象
面向对象封装和访问控制struct封装的访问属性面向对象封装和访问控制struct当单一变量无法完成描述需求的时候,结构体类型解决了这一问题。可以将多个类型打包成一体,形成新的类型。这是 c 语言中封装的概念对C语言中结构体的操作,都是通过外部函数来实现的。封装的访问属性struct 中所有行为和属性都是 public 的(默认)。C++中的 class 可以指定行为和属性的访问方式。 封装,可以达到,对内开放数据,对外屏蔽数据,对外提供接口。protected 保护控制权原创 2020-07-17 00:43:47 · 266 阅读 · 0 评论 -
C++函数重载
C++函数重载重载规则调用准则重载底层实现函数重载与函数默认参数函数重载和函数指针结合函数重载(Function Overload):用同一个函数名定义不同的函数,当函 数名和不同的参数搭配时函数的含义不同。重载规则返回值类型不是构成重载的条件调用准则1.如果能够严格匹配调用完全匹配的2.如果没有完全匹配,调用隐式转换3.如果都匹配不到,调用失败重载底层实现C++利用 name mangling(倾轧)技术,来改名函数名,区分参数不同的同 名函数。实现原理:用v c原创 2020-07-17 00:33:36 · 280 阅读 · 0 评论 -
C++基础知识
C++基础知识namespace命名空间引用引用规则引用的意义引用本质引用作为函数的返回值指针引用const 引用inline内联函数内联函数vs宏函数默认参数和占位参数默认参数规则占位参数namespace命名空间namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。 C++中声明头文件时不使用后缀带.h的,为了和C区别开,当使用< iostream >的时候,该头文件没有定义全局命名空间,必须使用namespac原创 2020-07-17 00:33:17 · 425 阅读 · 0 评论 -
STL容器深浅拷贝 容器共性机制
STL 容器共性机制STL 容器所提供的都是值(value)寓意,而非引用(reference)寓意,也就是说当我们给容器中插入元素的时候,容器内部实施了拷贝动作,将我们要插入的元素再另行拷贝一份放入到容器中,而不是将原数据元素直接放进容器中,也就是说**我们提供的元素必须能够被拷贝。** 除了queue 和stack 之外,每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。 通常STL不会抛出异常,需要使用者传入正确参数。 每个容器都提供了一个默认的构造函数和默认的拷贝原创 2020-07-13 11:44:47 · 151 阅读 · 0 评论 -
STL的基本概念
STL基本概念STL 基本概念STL 三大组件介绍容器迭代器算法总结STL 基本概念STL(Standard Template Library,标准模板库),STL从广义上分为: **容器(container) 算法(algorithm) 迭代器(iterator),**容器和算法之间通过迭代器进行无缝连接STL具有高可重用性,高性能,高移植性,跨平台的优点。高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。关于模原创 2020-06-28 18:05:44 · 1324 阅读 · 0 评论 -
C/C++ 内存5大分区
C/C++中内存分5大区:栈,堆,全局/静态存储区,常量存储区,代码区栈(stack):指那些由编译器在需要的时候分配,不需要时⾃动清除的变量所在的存储区,效率高,分配的内存空间有限,形参和局部变量分配在栈区,栈是向地地址生长的数据结构,是一块连续的内存堆(heap):由程序员控制内存的分配和释放的存储区,是向高地址生长的数据结构,是不连续的存储空间,堆的分配(malloc)和释放(free)有程序员控制,容易造成二次删除和内存泄漏静态存储区(static):存放全局变量和静态变量的存储区,初始化的变原创 2020-08-05 14:59:00 · 465 阅读 · 0 评论