P10数据类型-实型
和c一样的略
编译器会默认l把一个小数当成双精度(double),如果用float去接收它,那么要先把该小数转换成单精度(float)再去使用
所以要在该小数后面加一个f,这样盖小数就直接是float类型了
在c艹中,不管是单精度还是双精度,它都最多表示6位有效数字,如果想要查看更多有效数字,那么需要更多的配置
P12
水平制表符作用
12 数据类型-转义字符 P12 - 04:27
P13
13 数据类型-字符串类型 P13 - 04:55 c艹风格字符串
亲测 vs不写#include <string>也行
P15
注释CTRL+k+c
15 数据类型-数据的输入 P15 - 05:33
取消注释CTRL+k+u
因为布尔类型本质是整形,只能依靠整数转换,你输入的0.1被在编译时会被直接去掉小数点,即0.1变0。结果为flase
P55
函数的分文件编写
1.创建后缀名为.h的头文件
2.创建后缀名为.cpp的源文件
3.在头文件中写函数的声明
4.在源文件中写函数的定义
P60 const修饰指针
const修饰指针——常量指针
格式:const int* p = &a;
常量指针
特点:指针的指向可以修改,但是指针指向 的值不可以改
*p = 20 ;false 指针指向的值不可以改
p=&b;true 指针指向可以改
指针常量
格式: int * const p = &a;
特点:指针的指向不可以改,指针指向的值可以改
*p = 20;
p = &b;
P99 类和对象
1.封装
封装是C++面向对象三大特性之一。
封装的意义:
封装的意义一:
在设计类的时候,属性和行为写在一起,表现事物。
属性用一些变量来表示
行为用函数来表示
main函数里就相当于示例化一个对象
(通过一个类,创建一个对象的过程)
P100 案例
类中的属性和行为,我们统一成为:“成员”
属性 称为:“成员属性”or“成员变量”
行为 称为:“成员函数”or“成员方法”
P101 访问权限
1.公共权限——public
成员 类内可以访问 类外也可以访问
2.保护权限——protected
成员 类内可以访问 类外不可以访问
子类可以访问父类中的保护内容
3.私有权限——private
成员 类内可以访问 类外不可以访问
子类不可以访问父类的私有内容
P102 c++中class和struct的区别
struct和class唯一的区别就在于默认的访问权限不同
P103 成员属性私有化
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性
P104 案例(cube)
m_hight m是member 做标记用的
P105 案例 点和圆的关系
P106 构造函数和析构函数
对象的初始化和清理也是两个非常重要的安全问题
一个对象或者变量没有初始状态,对其使用后果是未知
同样的使用完一个对象或变量,没有即使清理,也会造成一定的安全问题
c++利用构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完全对象初始化和清理工作。
对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数是空实现。
构造函数语法:
析构的顺序和构造的顺序恰好相反(栈)(同一端进入,同一段出去,所以后进先出)
P107 函数的分类以及调用
构造函数分类
按照参数分为:有参和无参构造 无参又成为默认构造函数
按照类型分类分为:普通构造和拷贝构造
1.括号法
Person p1;
Person p2(10);
Person p3(p2);
注意事项:
调用默认构造函数时,不要加()
因为下面这行代码编译器会认为是一个函数的声明,不会认为是在创建对象
2.显示法
Person(10);
匿名对象 特点:当前行执行结束后,系统会立即回收掉匿名对象
注意事项:
不要在匿名对象里创建拷贝构造函数
3.隐式转换法
P108 拷贝构造函数调用时机
P109 构造函数调用规则
P110 深拷贝和浅拷贝
总结:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题
P111 初始化列表
P112 类对象作为类成员
当其他类对象作为本类成员,构造时候先构造类对象,再构造自身,析构的顺序与构造相反
P113 静态成员
关键字:static
静态成员变量和静态成员函数↓
30&31 类和对象-静态成员 P113 - 00:30 静态成员变量和函数
静态成员变量
如果a把静态成员变量设置为100 ,b又把该变量改成200,那a那边访问也会是200
类内声明,类外初始化操作
p2改变了m_A,再调用p1的m_A 的结果 ↓
运行结果↓
静态成员变量 不属于某一个对象上,所有对象都共享同一份数据,因此静态成员变量有两种访问方式
1.通过对象进行访问
2.通过类名进行访问
静态成员变量也是有访问权限的
类外访问不到私有静态成员变量
静态成员函数
所有对象共享同一个函数
静态成员函数只能访问静态成员变量
语法: static void func()
访问
通过对象访问
通过类名访问
第一种
第二种
类内声明,类外初始化
静态成员函数 不可以访问 非静态成员变量(不是一家人,不进一家门)
why?
30&31 类和对象-静态成员 P113 - 16:53 原因
首先这个静态成员函数在我们的内存中只有一份,这个非静态成员变量得通过创建一个对象才能访问。。。打不动了
就是这个m_B 不知道是p1的还是p2的成员变量
P114 成员变量和成员函数分开存储
静态成员变量和静态成员函数不属于某一个类的对象
非静态成员函数也不属于类的对象,它也只有一份,和静态成员变量是分开存的
空对象占用内存空间为1而不是0 是为了区分不同的空对象
省流:只有非静态成员变量属于类的对象上
P115 this指针的用途
this指针是不用声明可以直接用的,它就是专门指向成员的
this指针用处:
1.解决名称冲突
没有this的时候,形参和成员变量同名会导致混淆(这里编译器把两个都判定为形参了)
用this指针就可以解决↑
this指针指向被调用的成员函数所属的对象
如这个图中是p1在调用this 那么this就指向p1
2.返回对象本身用*this
33 类和对象-对象特性-this指针的用途 P115 - 07:40 返回对象本身用*this
如果你要返回本体(p2)要用引用的方式做一个返回,不加&会返回另一个新建的Person类(大概是拷贝构造?),可以当作p2'
33 类和对象-对象特性-this指针的用途 P115 - 12:41 为什么要加&
不加&相当于只返回值,而不是返回p2这个类
链式编程思想
P116 空指针访问成员函数
两个成员函数
showClassName()可以运行
showPersonAge()不能正常运行
因为成员变量(m_Age)是默认有一个this指向它的,但咱*p是空指针,根本没有指向一个确切的对象,这时的this指向一个空的值,你还要访问对象的年龄,所以报错了
无 中 生 有
怎么解决?
if (this == NULL){
return;
}
就可以避免访问空指针了
P117 const修饰成员函数
P118 友元 全局函数做友元
友元的关键字为 friend
友元的三种实现
抄一个声明放在类的第一排,相当于全局函数,注明friend即可
P119 友元类
格式如下:
用new来申请Building的空间是为了构造结束后再堆区创建只有程序员才能释放的空间,为了避免指针为空
P120 成员函数做友元
成员函数的友元还记得要声明是哪个类的
P121 C++运算符重载 加号运算符重载
挺简单的,不过多阐述
P127 继承 基本语法
继承是面向对象三大特性之一
定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。
P129 继承中的对象模型
《基因的选择性表达》(private选择性不表达)
我听不懂,但我大受震撼
cl/d1
前者是L 后面是数字1
P130 构造和析构顺序
P131 同名成员处理
P132 同名静态成员处理
通过子类对象访问父类对象中的静态成员数据↓
Son::Base::m_A
第一个::代表通过类名方式访问。第二个::代表访问父类作用域下
静态成员函数
通过类名访问——我连对象都不需要(字面意义)
P133 继承语法
语法: class 子类:继承方式 父类1,继承方式 父类2
父类继承同名需要加作用域(实际开发不常用,麻烦)
P134 菱形继承问题以及解决方法
继承叫“虚继承”,最大的基类叫“虚基类”
虚继承后,三个cout全为28
底层运行:
虚基类指针
P135 多态的基本语法
animal引用指向cat
函数前面加virtual 为虚函数
动态多态的使用
父类的指针或者引用 执行子类对象
不用指针就用引用
void doSpeak(Animal &animal) Animal &animal = cat;
P136 多态的原理剖析
这就是儿子把继承过来的父亲的函数用自己的替换了,再次访问继承过来的内容,就会访问替换后的。
P137 案例1 计算器类
要触发多态得用父类指针或者引用指向子类对象
用父类类型定义一个指针,用new
P138 纯虚函数和抽象类
纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0 ;
当类中有了纯虚函数,这个类也称为抽象类
P140 虚析构和纯虚析构
问题原因
在子类析构中加一个virtual 就可以走子类析构了
纯虚析构
虚析构和纯虚析构只能有一个
纯虚析构在后面需要代码的实现
下面为纯虚析构的代码实现↓
虚析构和纯虚析构都是为了解决在子类中的析构调用不到的问题
语法↓
总结↓
P185 STL的基本概念
面向对象的三大特性:封装,继承,多态
STL从广义上分为:容器,算法,迭代器
STL六大组件
STL中容器、算法、迭代器
每个容器都有自己专属的迭代器
迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针
P186 vector存放内置数据类型
vector 类似于一个数组
头文件: #include<vector>
创建一个vector容器
vector<int> v;
向容器中插入数据
v.push_back(10);
v.push_back(20);
通过迭代器访问容器中的数据
vector<int>::iterator itBegin = v.begin()
begin()是起始迭代器 指向容器中的第一个元素
vector<int>::iterator itEnd = v.end();
end()是结束迭代器 指向容器中最后一个元素的下一个位置
记住:v.begin() 和 v.end() 是指针 取值要加*
第一种遍历方式
while (itBegin != itEnd){
cout<<*itBegin << endl;
itBegin++;
}
这种比较麻烦
第二种遍历方式
for(vector<int>::iterator it = v.Begin();it != v.end(); it++){
cout<< *it <<endl;
}
第三种遍历方式:利用STL提供遍历算法(for_each)
头文件: #include <algorithm>
标准算法的头文件
首先创建一个函数
void myPrint(int val)
{
cout<< val <<endl;
}
然后把函数的函数名放进去
for_each(v.begin(), v.end(), myPrint);
这里的myPrint做回调函数
回调函数:回调就是一种利用函数指针进行函数调用的过程。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。
本质还是一个for循环
P187 vector存放自定义数据类型
存放自定义类型和前面基本一样
↑这是自定义函数的vector遍历
P188 容器嵌套容器
创建嵌套容器
创建小容器
向小容器中添加数据
将小容器插入到大容器中
通过大容器,把所有数据遍历一遍
最后的运行效果
P189 string容器-构造函数
string构造函数原型:
四种不同的构造方式
P190 string容器-赋值操作
赋值的函数原型:
具体实现
运行结果
P191 string容器-字符串拼接
函数原型:
具体实现
P192 string容器-字符串查找和替换
函数原型
1.查找
find()返回的是找到的子字符串中的首元素的位置,如上图中返回的是d的位置,即3(从0开始计数)
如果子字符串不存在则返回-1 (如“df”)
find()是从左往右找,rfind()是从右往左找,但都是返回子字符串的首元素位置
区别是:如果子字符串不止出现一次的话,find找到的是最左边那个,rfind找到的是最后边的那个
2.替换
replace(a,b,"str"):把从第a个元素开始(从0计算)往后的b个元素替换成"str"
是的,b和str的字符个数可以不一样,str是全部都加进去的
P193 string容器-字符比较
函数原型:
总结:字符串对比主要是用于比较两个字符串是否相等,判断谁大谁小的意义并不是很大
P194 string容器-字符存取
两种获取单个字符方式↓
P195 string容器-字符串插入和删除
函数原型
删除后变回“hello”
P196 string容器-字串获取
截取子串“bcd”
P228 pair使用-pair对组的创建
两种创建方式
例子
P229 set容器-内置类型指定排序规则
P231 map容器-构造和赋值
map中所有元素都是pair
pair第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
注意:value值是都可以有重复的
map构造和赋值
map中是对组,所以获取值需要写first和second,上面是两种获取方式
#include <iostream>
using namespace std;
#include <map>
void printMap(map<int, int>& m) {
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
cout << (*it).first << " " << it->second << endl;
}
}
void test01() {
map<int, int>m;
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(2, 20));
m.insert(pair<int, int>(3, 30));
m.insert(pair<int, int>(4, 40));
printMap(m);
}
int main(void) {
test01();
return 0;
}
最后输出是按key从小到大输出的,会自动排一次序
拷贝构造
赋值
总结:map中所有元素都是成对出现,插入数据时候要使用对组
P232 map容器-大小和交换
函数原型
P233 map容器-插入和删除
erase(key)是按照key的方式删除整个对
关键词新娘入场广东工厂关键词2022医护关键词南岔关键词优化英国站关键词uc密令关键词seo关键词案淄博seo关键词视频关键词添加视频 展示关键词tiktok 关键词福利关键词张家亮光电的关键词关键词字段查询福州关键词系统旅行关键词搜索宠物售卖关键词关键词集成appseo 关键词 长尾建筑实物 关键词明星成长关键词搜索关键词就是中国现状 关键词哈尔滨搜索关键词霜降由来关键词关键词能省钱头像壁纸关键词软件内关键词定向和关键词关键词设定几个祝融号关键词投石科技关键词glow开车关键词美联关键词淘宝扶持关键词初中关键词赏析关键词无限画廊自我关键词标签关键词图片解析部门预算关键词小灰灰关键词弹窗广告关键词辽阳关键词高考关键词听力关键词型数据奥特曼标题关键词midjourney特殊关键词圆的关键词商品便宜关键词关键词的伴唱绘画关键词30机械用品关键词关键词弹唱伴奏怎么踩到关键词动物保护关键词鸡肉的关键词前言关键词英文抓手指关键词网页关键词 叠加midjourney关键词蝴蝶关键词营销目标忽悠转让关键词imvu和风关键词梗本关键词meglr手表关键词搜索目标 关键词绿色衣服关键词拦截哪些关键词个性书包关键词ai客厅关键词关键词文本朗读毛绒挂件关键词instagram关键词假发桃江关键词排名宿迁关键词大全房票关键词部门预算关键词关键词排名更高休闲搜索关键词小板鞋关键词lstm+关键词如何教关键词关键词过滤免费关键词 创维集团长安幻想关键词悉尼的关键词阿里关键词收录降解餐盒关键词关键词系统繁忙长沙关键词诈骗高唐关键词优化婚后关键词测试学生疫情关键词讨厌的关键词怎么热门关键词pcrow漫画关键词鞋类关键词工具instagram广告关键词成都宣言关键词片哥关键词关键词写作顺序关键词女服装sle饮食关键词修改关键词技巧阿里关键词收录广州高考关键词关键词的排查销售质检关键词浩瀚星空关键词关键词分析内容关键词夏老师2023关键词银行关键词吴彦祖王晶池州关键词优化文章关键词分析星球ai关键词体育营销关键词搜搜关键词淘宝烟油关键词小说关键词引流aa漫画关键词石首关键词竞价南昌各区关键词莒县关键词优化运营关键词总结java关键词记住ai物件关键词关键词千川关键词 like匹配ebay主关键词av关键词排名关键词矩阵简历关键词查询公式情感关键词违规80 90 关键词mj特效关键词淘宝麻黄关键词买卖关键词公司现货投资关键词杀戮都市关键词tiktok美女关键词赞美策划关键词情感教育关键词车辆关键词大全怎么搭配关键词住房公积金 关键词seo关键词记录韩国黄牛关键词工矿设备关键词关键词文案网站公司季度关键词郭鹞关键词google搞笑关键词交通文明关键词联合抗日关键词国家新关键词妈咪关键词全集bm短袖关键词王者歌曲关键词索诺关键词违禁关键词专利省钱关键词冰块新乡安顺关键词阿里标王关键词校长演讲关键词风铃关键词描述泰国女装关键词亚马逊关键词摆放关键词分解动作星座关键词皮肤论文关键词下载闽南疫情关键词聚焦关键词教学蓝色紫色关键词民法常用关键词济源seo关键词京东帽子关键词军营关键词大全关键词 相遇 电影关键词民警介绍关键词拼贴模板漓江的关键词淘宝假发关键词小店违规关键词农场品关键词关键词插画练习夏季减肥关键词重庆关键词策略关键词黄岩蜜桔JS反查关键词香水行业关键词团日活动关键词纯牛奶关键词黄色关键词文案关键词清唱钢琴0热度关键词漓江的关键词团队评优关键词亚马逊关键词计划vagaa的关键词