C语言
数组越界:有些允许,有些不允许,有可能产生错误;
数组名是数组的地址,也就是数组首元素的地址;
数组名本身是一个常量指针,不可变更地址;
数组传入参数可以用数组名arr[]
在字符串中0等同于\0;
字符串是有\0的字符数组
strlen:计算第一个\0之前的长度
在数组中arr[],传入arr[],传入的是地址大小为4,sizeof(arr)
用“”就表达是字符串
C语言字符串是以字符型数组进行存在的
char* arr=‘’dsd''实际上在前面增加了一个char cosnt *arr,这个形式的字符串不可以更改值
字符型
引用:不要返回局部变量的应用,引用可以做返回值,引用==取别名,相当于指针常量,指向不可以改变
类
类的默认权限是私有的;
结构体的默认权限是公有的
类的构造函数
只要创建一个类,就会它默认添加三个构造函数:无参,有参,拷贝
自己写有参,编译器不提供无参,写拷贝,不提供其他
类的浅拷贝和深拷贝
类的浅拷贝会造成内存重复释放(比如属性中存在指针,指针被复制过去,指向同一个地址,若释放,会重复释放),深拷贝可以解决浅拷贝的问题
也就是属性有在堆区开辟,一定要自己写一个深拷贝函数
类中类
先构造类中类,在构造自身,析构反过来
类中的静态成员
类内声明,类外初始化,所有对象共享同一份数据
储存在编译区
可以通过对象和类名访问
静态成员使用静态函数来访问,静态函数访问不了非静态成员
空对象c++编译器会分配一个内存,作为区分
this指针
存在每一个类的内置指针,区分形参和成员变量
*this指向本体,可以作返回本体用
指向被调用成员函数所属的对象
空指针可以访问成员函数,但是不能有成员变量的使用(也就是(this->)成员前默认有),空指针,没有任何东西,指向不不了成员
常函数和常对象
常函数:在类成员函数后面加const viod test() const;
常对象:在对象前加const
this本质是一个指针常量,指向不可更改,加const修饰的使this,使指向的值也不能修改,值加mutable依旧可以更改
常对象只能调用常函数,限定只读 const person p;
友元
全局函数做友元——————如访问类的私有成员
类做有元——————使类访问类的私有
成员函数做友元——————frend +类型 类::成员函数
运算符重载
对于内置的数据,编译器知道怎么计算,自定义的无法识别
函数返回引用----指向不变
类的继承-----说到底是格式复制???????
父类的所有成员都被继承,只是私有成员被隐藏
继承中先调用父类构造函数,在子类,析构相反
同名成员属性,子类会隐藏所有父类的同名函数,父类有重载也不行要加作用域区分是谁的 成员-----如果是返回值不一样算不算重名
子类直接访问的是自己的成员,加作用域访问父类的成员
多态
c++中的父子类可以转换,;
重写与重载
重写,函数类型,返回,参数列表,函数名一样
静态多态:函数和运算符重载
动态多态:派生类和虚函数实现运行时的多态
区别:静态地址早绑定——编译阶段,动态晚绑定——运行阶段绑定
多态满足条件:有继承关系,子类重写父类虚函数,父类的对应的函数要有虚函数关键字---virtual;
多态使用:父类指针或者引用指向子类对象,原理就是子类重写父类的虚函数,父类虚函数的指针指向的地址会被子类虚函数的地址覆盖
利用虚析构可以解决子类释放不完全的问题--------不用虚析构会调用父类的虚构函数,父类的虚析构和纯都要写实现与虚函数区分,因为有些函数开辟在父类中,也需要析构
普通函数:可以发生隐式转化就是int 的传入char,会转化ascall 码
模板函数:自动类型推导不能发生隐式转化(给出参数类型),用显示指定类型可以发生转化
模板函数并不是万能的,自定有类型的数据会发生错误比如类
解决方法:运算符重载,函数模板具体化(最好用这个)
类模板:
没有自动推导方法——所以要尖括号表示出来,要么模板化,类模板可以有默认参数
普通类的函数一开始就可以创建,类模板中的函数调用的时候才创建;
类模板做参数
指定传入类型 参数模板化,类模板化
继承的父类是模板类的话,子类需要模板化;
类模板成员函数类外实现要加模板参数列表;
类模板份文件编写
问题:类模板的成员函数创建时机是在调用阶段,导致份文件编写连接不到
解决:直接包含cpp文件
2:将声明和实现文件写道同一个文件中,改名后缀hpp,
stl:提高代码的复用性;分为容器,算法,迭代器,防函数,适配器,空间配置器
模板常有的
构造函数 赋值操作 数据存取
vecor:三种遍历方式:begin end for_each
看<>里面是啥,就知道迭代器是啥
stl:=赋值,也可以assighn赋值,具体看操作;
字符串拼接:+=;append;
查找替换:repalce:替换参数:3个字符,但是友四个字符“11111”,会全部替换进去
字符串对比:compare:字符串对比,主要是引文字母对比,使用ascall,;
访问字符:str.size返回字符串元素个数,str[i]:中括号访问,或者at:str.at(i);
插入删除:insert,erase;
截取子串;substr:截取字符串中想要的子串,配合find,截取;
vector
动态扩展数组,扩展不是在原有的空间扩展,而是重新招一个内存,防止旧的内存后面备用
复制操作
使用=进行复制(等号已经重载好,v=v);使用assign。
capacity:容量 size:大小,rezie:重新分配大小,分配大了,默认0补充,
小了,删除多余的数
常用的算法要包含头文件algroth
常用的容器支持随机访问的都可以使用sort进行排序,默认从大到小
容器的插入与赋值修改都有特定的接口,不能混淆,比如v[i],只能进行修改,不能进行赋值;
stack:
堆,先进后出
相当于一个杯子楼;只允许一个方向,不允许遍历,可以有empty,
queue
有两个口,一个只能进,一个只能出
list:链表
由节点组成,一个节点有数据,和指针组成,指针指向下一个节点
set和multiset容器
自动排号序列;不允许重复元素(multiset可以有);set重复插入的相同值只有一个
set默认从小到大,要改变顺序,需要在插入数据之前进行仿函数的修改,就是增加一个,bool类型的修改
排列自定义的数据类型:需要指定自定义的排序规则,——》反函数本质是类
map容器:
函数对象:仿函数,本质是类,重载了过好
可以做函数,可以记录使用次数,可以作为参数调用 ;
谓词:
仿函数:仿函数是配合STL进行使用,用于方便模板类和模板函数。
常用算法:
遍历:for_each;
查找:find
排序:sort
拷贝算法:copy
算数生成算法:accumulate
集合算法:容器的交集,并集等;
C/C++ 中的使用static(函数或者变量)
静态函数会被自动分配在一个一直使用的存储区,直到程序结束才从内存消失,避免调用函数时压栈出栈,速度快很多
其他文件可以定义相同名字的函数,不会发生冲突
静态函数不能被其它文件调用,作用于仅限于本文件
static可以限定变量或函数为静态存储。static限定的变量或函数不会和同一程序中其他文件同名的相冲突。如果用static限定内部变量,则该变量从程序一开始就用有内存,不会随其所在函数的调用和退出而分配和消失。