C++基础
文章平均质量分 62
c++笔记
Forest_1010
笔记记笔记
展开
-
C++ unique_ptr笔记
转载于unique_ptrC++11引入了unique_ptr智能指针,主要用于替代不安全的auto_ptr。因此 C++11 标准中的 unique_ptr 模板类没有提供拷贝构造函数,只提供了移动构造函数。std::unique_ptr<int> p1(new int);std::unique_ptr<int> p2(p1);//错误,堆内存不共享std::unique_ptr<int> p2(std::move(p1));//正确,调用移动构造函数对于原创 2021-03-19 15:21:00 · 106 阅读 · 0 评论 -
C++ auto_ptr笔记
auto_ptr C++11已弃用编译阶段显示没问题运行阶段会报错简单分析对比一下,执行26行代码之后,智能指针baoma此时已经为空指针,再执行第27行代码肯定会报错(引用非法内存的指针)。这是因为auto_ptr要求其对“裸”指针(这里指car)的完全占有性。也就是说一个”裸“指针不能同时被两个以上的auto_ptr所拥有。那么,在拷贝构造或赋值操作时,我们必须作特殊的处理来保证这个特性。auto_ptr的做法是“所有权转移”,即拷贝或赋值的源对象(这里指baoma)将失去对原创 2021-03-19 14:51:48 · 132 阅读 · 0 评论 -
C++中左值引用和右值引用的区别
01 什么是左值和右值?左值: 就是有确定的内存地址、有名字的变量,可以被赋值,可以在多条语句中使用;右值: 没有名字的临时变量,不能被赋值,只能在一条语句中出现,如:字面常量和临时变量。02 如何区分左值与右值?看能不能对表达式取地址能否用“取地址&”运算符获得对象的内存地址。对于临时对象,它可以存储于寄存器中,所以是没办法用“取地址&”运算符;对于常量,它可能被编码到机器指令的“立即数”中,所以是没办法用“取地址&”运算符;这也是C/C++标准的规定。返回原创 2021-02-19 15:31:29 · 1536 阅读 · 0 评论 -
虚析构函数
抽象基类:至少有一个纯虚函数的类;抽象基类不能产生该类的对象,但可以有该类的指针或引用;在子类中必须将父类的纯虚函数实现,不然该子类也是抽象基类;上图说明,虚析构是解决用基类指针指向派生类对象,如果没有虚析构函数,其派生类就无法正确析构。...原创 2021-01-02 23:20:50 · 143 阅读 · 0 评论 -
string容器
01 string基本概念本质:string本质上是一个类与char的区别:1)char是一个指针2)string是一个类,类的内部封装了char*,管理这个字符 串,是char*型的容器,所以底层还是char*特点:1)string类内部封装了很多成员方法,例如查找find,拷贝copy,删除delete,插入insert2)string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部负责02 string构造函数string();string(cont ch原创 2020-12-10 00:36:25 · 218 阅读 · 0 评论 -
list容器
01 list基本概念功能:将数据进行链式存储;链表是一种物理存储单元上非连续的存储空间,数据元素的逻辑顺序是通过链表中的指针实现的;链表的组成:链表由一系列结点组成;结点的组成:数据域+指针域(存储下一个结点地址)STL中的链表是一个双向循环链表;list中的迭代器只支持前移和后移,属于双向迭代器;优缺点优点:采用动态存储分配,不会造成内存浪费和溢出;链表执行插入和删除操作十分方便,修改指针即可;缺点:链表灵活,但是空间和时间额外消耗大;list有一个重要的性质,插入原创 2020-11-06 19:22:17 · 78 阅读 · 0 评论 -
STL常用算法:遍历、查找、排序、拷贝、替换
概述算法主要是由头文件< algorithm> < functional> < numeric>组成;< algorithm>是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历、复制、修改等待;< functional>体积很小,只包括几个在序列上面进行简单数学运算的模板函数;< numeric>定义了一些模板类,用以声明函数对象;常用遍历算法for_each //遍历容器transform //搬运原创 2020-10-18 17:33:21 · 541 阅读 · 0 评论 -
左移运算符重载
作用:可以输出自定义的数据类型;一般,不会利用成员函数来重载左移运算符;#include<iostream>using namespace std;class Person{public: int m_A; int m_B;};//本质operator<<(cout,p)可简写为cout<<postream &operator<<(ostream &cout,Person &p)//cout标准输出流对象,全局.原创 2020-10-09 18:27:50 · 166 阅读 · 0 评论 -
加号运算符重载
运算符重载:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型;如果不坚持和闲鱼有什么区别不是加急加加字和对象对象等幅含是说这个这个就是就是收到的基本的 和事实上就是这个说的吗呢这个的话这个intm_bp....原创 2020-10-09 16:39:10 · 609 阅读 · 0 评论 -
STL——函数对象(仿函数)
概念:重载函数调用操作符的类,其对象称为函数对象;函数对象使用重载时,行为类似函数调用,也叫仿函数;本质:函数对象(仿函数)是一个类,不是一个函数;特点:函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值;函数对象超出普通函数的概念,函数对象可以有自己的状态;函数对象可以作为参数传递;#include<iostream>#include<string>using namespace std;//仿函数//1、函数对象在使用时,可以原创 2020-10-04 13:27:12 · 209 阅读 · 0 评论 -
STL实例——员工分组
案例描述:招聘10个员工,入职后,需要指派员工在哪个部门工作;员工信息:姓名,工资;部门分为:策划、美术、研发;随机给10名员工分配部门和工资;通过multimap进行信息的插入:key(部门编号),value(员工);分部门显示员工信息;思路:创建10名员工,放到vector中;遍历vector,取出每个员工,进行随机分组;分组后,将员工部门编号作为key,具体员工为value,放到multimap中;分部门显示员工信息;#include<iostream>#i原创 2020-10-04 12:53:33 · 132 阅读 · 0 评论 -
map/multimap容器用法
基本概念map中所有元素都是pair;pair中第一个元素为key值(键值),起到索引作用,第二个元素为value(实值);所有元素都会根据元素的键值自动排序;本质:属于关联式容器,底层是用二叉树实现;优点:可以根据key值快速找到value值;区别:1)map不允许容器中有重复的key值元素;2)multimap允许容器中有重复的key值元素;常用接口构造函数:map<T1,T2>m;map(const map &map);赋值:map& op原创 2020-10-04 00:06:12 · 123 阅读 · 0 评论 -
set/multiset容器
基本概念所有元素都会在插入式被自动排序;set/multiset属于关联式容器,底层结构是用二叉树实现;区别:1)set不允许容器中有重复的元素;2)multiset允许容器中有重复的元素;常用接口构造函数:set s;set(const set &s);赋值操作:set& operator=(const set &s);#include<iostream>#include<set>using namespace std;原创 2020-10-03 18:31:50 · 125 阅读 · 0 评论 -
queue容器用法简单入门
基本概念队列是一种特殊的线性表,是一种先进先出(FIFO)的数据结构。它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。queue常用接口构造函数:queue q;//默认queue(const queue &que);//拷贝赋值操作:queue& operator=(const queue &que);//重载等号操作符数据存取:原创 2020-10-03 12:21:58 · 405 阅读 · 0 评论 -
stack容器用法简单入门
基本概念stack(堆栈)是一种先进后出的数据结构;只能在一端(称为栈顶(top))对数据项进行插入和删除。stack常用接口构造函数:stack s;//默认stack(const stack &stk);//拷贝赋值操作:stack& operator=(const stack &stk);//重载等号操作符数据存取:push(ele);//向栈顶添加元素pop();//从栈顶移除一个元素top();//返回栈顶元素大小操作:emp原创 2020-10-03 11:57:57 · 348 阅读 · 0 评论 -
STL实例——评委打分
案例描述有5名选手:ABCDE,10个评委分别对每一名选手打分,去除最高分和最低分,取平均分;实现步骤创建五名选手,放到vector中;遍历vector容器,去除每一个选手,执行for循环,把十个评分存到deque容器中;sort算法对deque容器中分数排序,去除最高分和最低分;遍历deque容器,累加取平均值;#include<iostream>#include<vector>#include<deque> #include<string原创 2020-10-03 11:17:36 · 184 阅读 · 0 评论 -
deque容器用法
基本概念功能:双端数组,可以对头端进行插入删除操作,也可以对尾部;deque和vector区别:vector对于头部的插入删除效率较低,数据量越大,效率越低;vector访问元素是的会比deque快,这和两者内部实现有关;...原创 2020-10-03 00:41:57 · 179 阅读 · 0 评论 -
error C4996: ‘scanf‘: This function or variable may be unsafe C++使用传统库函数报错问题
error C4996: ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.由于微软在VS2013及后续的版本中不建议再使用C/C++传统库函数scanf、strcpy、sprintf等,所以直接使用会报以上的错误;而且编译器也提供了解决方法,如采用带_s的函数,scanf_s、strc原创 2020-10-01 21:45:12 · 149 阅读 · 0 评论 -
vector容器笔记详细
vector存放内置的数据类型STL中最常用的容器为vector,可以理解为数组,下面写个例子,如何向这个容器中插入数据,并遍历这个容器;#include<iostream>#include<vector>#include<algorithm> //标准算法头文件using namespace std;/*****vector存放内置的数据类型*****///回调函数void myPrint(int val){ cout << v原创 2020-09-29 20:20:32 · 152 阅读 · 0 评论 -
STL简单入门
初识STLSTL是一种泛型编程。面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法。它们之间的共同点是抽象和创建可重用代码,但它们的理念截然不同。STL基本概念STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能;从根本上说,STL 是一些容器、算法和其他一些组件的集合;STL从广义上分为:容器、算法和迭代器,容器和算法之间通过原创 2020-09-29 09:03:59 · 172 阅读 · 0 评论 -
C++提高篇——模板
模板的概念模板就是建立通用的模具,大大提高复用性;模板的特点:1)模板不能直接使用,它只是一个框架;2)模板的通用并不是万能的;C++另一种编程思想称为泛型编程,主要利用的技术就是模板;C++提供两种模板机制:函数模板和类模板;函数模板函数模板的作用:建立一个通用函数,其函数返回值和形参类型可以不具体指定,用一个虚拟的类型来代表;1)语法template< typename T >函数声明或定义 //函数模板template:声明创建模板;typename:原创 2020-09-25 16:54:59 · 204 阅读 · 0 评论 -
C++基于多态的职工管理系统超详细
主要利用C++来实现一个基于多态的职工管理系统;(需要综合运用封装、继承和多态,以及文件的读写操作等知识;)管理系统需求公司中职工为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名、职业岗位、以及职责;普通员工职责:完成经理交给的任务;经理职责:完成老板交给的任务,并下发任务给员工;老板职责:管理公司所有事物;管理系统中需要实现的功能如下:1)退出管理程序:退出当前管理系统;2)增加职工信息:实现批量添加职工功能,将信息录入到文件中,职工信息为:职工编号、姓名、部门.原创 2020-09-22 22:08:11 · 3725 阅读 · 0 评论 -
C++文件操作
程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放;通过文件可以将数据持久化;C++中对文件操作需要包含头文件 #include< fstream>文件类型分为两种:1)文本文件:文件以文本的ASCII码形式存储在计算机中;2)二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们;操作文件的三大类:1)ofstream:写操作2)ifstream:读操作3)fstream:读写操作文本文件写文件写文件步骤如下:1)包含头文件: .原创 2020-09-12 18:53:17 · 177 阅读 · 0 评论 -
C++多态知识点
多态的基本概念多态是C++面向对象三大特性之一;多态分为两类:静态多态:函数重载和运算符重载都属于静态多态,复用函数名;动态多态:派生类和虚函数实现运行时多态;静态多态和动态多态的区别:静态多态的函数地址早绑定,编译阶段确定函数地址;动态多态的函数地址晚绑定,运行阶段确定函数地址;#include<iostream>using namespace std;//动物类class Animal{public: void speak() { cout <原创 2020-09-10 22:34:07 · 337 阅读 · 0 评论 -
C++继承知识点
继承的基本语法继承是面向对象的三大特性之一;好处:将公共部分抽象出来,减少重复代码;父类也称为基类,子类也称为派生类;基本语法:class A:public B;class 子类:继承方式 父类#include<iostream>using namespace std;//公共页面class BasePage{public: void header() { cout << "首页 公开课" << endl; } void foot原创 2020-09-09 17:05:05 · 223 阅读 · 0 评论 -
C++类和对象——友元
友元的目的就是让一个函数或者类访问另一个类中私有成员;友元的关键字为friend;友元的三种实现1)全局函数做友元;2)类做友元;3)成员函数做友元;全局函数做友元全局函数做友元可以访问另一个类中的私有成员,写法就是把全局函数复制粘贴放到类中,前面再加一个关键字friend;#include<iostream>#include<string>using namespace std;class Building //房屋类{ //GoodFriend全.原创 2020-08-31 10:01:18 · 206 阅读 · 0 评论 -
C++类和对象——const修饰成员函数
常函数:成员函数后加const后我们称为这个函数为常函数;常函数内不可以修改成员属性;成员属性声明时加关键字mutable后,在常函数中依然可以修改;常对象:声明对象前加const称该对象为常对象;常对象只能调用常函数;常函数#include<iostream>using namespace std;class Person{public: //this指针的本质是 指针常量,指针的指向是不可以修改的 //在成员函数后面加const,修饰的是this指向,原创 2020-08-30 01:05:55 · 261 阅读 · 0 评论 -
C++类和对象——空指针访问成员函数
C++中空指针也是可以访问成员函数的,但是也要注意有没有用到this指针;如果用到this指针,需要加以判断保证代码的健壮性。#include<iostream>using namespace std;class Person{public: void showClassName() { cout << "this is Person ClassName" << endl; } void showPersonAge() { //报错原.原创 2020-08-30 00:31:03 · 175 阅读 · 0 评论 -
C++类和对象——this指针
在C++中成员变量和成员函数是分开存储的;每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码;那么,这一块代码是如何区分哪个对象调用自己的呢?C++通过提供特殊的对象指针,this指针,解决上述问题;this指针指向被调用的成员函数所属的对象;this指针是隐含每一个非静态成员函数内的一种指针;this指针不需要定义,直接使用即可;this指针的用途:1)当形参和成员变量同名时,可用this指针来区分;2)在类的非静态成员函数中返回对象本身,可使用retur.原创 2020-08-27 23:49:26 · 387 阅读 · 0 评论 -
C++对象模型
1.成员变量和成员函数分开存储在C++中,类内的成员变量和成员函数分开存储;只有非静态成员变量才属于类的对象上。一个空对象所占用的内存空间是多少#include<iostream>using namespace std;class Person{};void test(){ Person p; cout << "sizeof p = " << sizeof(p) << endl;}int main(){ test();原创 2020-08-27 22:23:28 · 117 阅读 · 0 评论 -
C++类和对象——类对象作为类成员
C++类中的成员可以是另一个类的对象,我们称该成员为对象成员。class A { }class B{ A a; //B类中有对象A作为成员,A为对象成员}#include <iostream>#include <string>using namespace std;//类对象作为类成员 //手机类class Phone {public: Phone(string pName)//构造函数 { m_PName = pName; } strin原创 2020-08-25 23:08:28 · 553 阅读 · 0 评论 -
C++类和对象——初始化列表
作用:C++提供了初始化列表语法,用来初始化属性;语法:构造函数( ):属性1(值1),属性2(值2)… { }#include <iostream>#include <string>using namespace std;class Person{public: //初始化列表:初始化属性 Person() :m_A(10), m_B(20), m_C(30) { } int m_A; int m_B; int m_C;};void test.原创 2020-08-25 22:38:02 · 362 阅读 · 0 评论 -
C++深拷贝与浅拷贝
浅拷贝:简单的赋值拷贝操作;深拷贝:在堆区重新申请空间,进行拷贝操作;1)浅拷贝#include <iostream>using namespace std;class Person{public: int m_Age;//年龄 int* m_Height;//身高,将该数据开辟到堆区,所以用指针 //默认构造函数 Person() { cout << "默认构造函数的调用" << endl; } //有参构造函数 Person(.原创 2020-08-22 01:14:41 · 210 阅读 · 0 评论 -
C++构造函数的分类及调用
构造函数的分类及调用两种分类方式:按参数分为:有参构造和无参构造(默认构造);按类型分为:普通构造和拷贝构造。三种调用方式:括号法显示法隐式转换法1)括号法(常用)#include <iostream>using namespace std;class Person{public: int age; //构造函数:没有返回值,不写void,函数名与类名相同,可以有参数 //无参构造函数 Person() { cout << "无参构原创 2020-08-21 23:51:18 · 224 阅读 · 0 评论 -
C++构造函数和析构函数
对象的初始化和清理C++的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置;一个对象或者变量没有初始状态,对其使用后果是未知的;使用完一个对象或变量,没有及时清理,也会造成一定的安全问题。构造函数和析构函数前言C++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作;对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供它自己提供的构造函数和析构函数是空实现。作用原创 2020-08-19 21:47:59 · 131 阅读 · 0 评论 -
C++实例8——设计立方体类
设计一个立方体类,求出立方体的面积和体积#include <iostream>#include <string>using namespace std;class Cube{private: //成员属性私有化 //长、宽、高 double m_Long; double m_Width; double m_High;public: //设置长 void setLong(double L) { m_Long = L; } //设置宽 void原创 2020-08-18 23:01:18 · 979 阅读 · 0 评论 -
C++类和对象——封装
C++认为万事万物都皆为对象,对象上有其属性的行为;具有相同性质的对象可以抽象为类,例如:人类,树类…C++面向对象的三大特性:封装、继承、多态封装意义:将属性和行为作为一个整体,表现生活中的事物;将属性和行为加以权限控制1)将属性和行为作为一个整体实例化,通过一个类创建一个对象的过程;设计一个圆类,求圆的周长;#include <iostream>using namespace std;const double PI = 3.14;//设计一个圆类,求圆的.原创 2020-08-18 21:26:44 · 202 阅读 · 0 评论 -
C++函数重载
函数重载概述作用:函数名可以相同,提高复用性;条件:1)函数名相同;2)同一个作用域下;3)函数参数类型不同 / 个数不同 / 顺序不同。注意:函数的返回值不可以作为函数重载的条件(函数返回值为void)。#include <iostream>using namespace std;//两个函数,函数名相同,但是函数参数类型不同void fun(int a){ cout << "调用1" << endl;}void fun(double a)原创 2020-08-18 12:17:56 · 281 阅读 · 0 评论 -
C++函数的默认参数和占位参数
函数的默认参数在C++中,函数的形参列表中的形参是可以有默认值的;语法:返回值类型 函数名 (参数=默认值){ }1)函数形参没有默认值时#include <iostream>using namespace std;//函数没有设置默认参数int fun(int m, int n){ return m * n;}int main(){ cout << fun(10,20) << endl; system("pause"); return原创 2020-08-18 11:49:55 · 440 阅读 · 0 评论 -
const
1.const修饰指针——常量指针const int *p=&a;特点:指针的指向可以修改,但是指针指向的值不可以修改。2.const修饰常量——指针常量int * const p=&a;特点:指针的指向不可以修改,但指针指向的值可以修改。3.const既修饰指针,也修饰常量const int * const p=&a;特点:指针的指向和值都不可以修改(都被限定)。...原创 2020-08-18 01:11:08 · 68 阅读 · 0 评论