c++学习

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限定内部变量,则该变量从程序一开始就用有内存,不会随其所在函数的调用和退出而分配和消失。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值