p.s.本文仅为个人复习笔记,主要写的是自己不熟练的知识,一些比较基础的知识点的可能没有涉及到
*整型:短整型,整型,长整型
*字符型
*浮点型:单精度型,双精度型,长双精度型
*指针类型
*枚举类型
*数组类型
*结构体类型
*共用体类型
*类类型
*带符号的最高位存符号
*float提供6位有效数字,double提供15位有效数字
十进制:不需要特殊表示
八进制:常数开头加数字0
十六进制:常数开头加x
十进制小数形式:3.14
指数形式:314e-2
在内存存储方式:+ | .314 | 1 (数字部分<1, 指数部分必须为整数)
只包括一个字符
区分大小写
转义字符:
*没赋初值变量值不确定
*加const以后变量值不能改变(函数参数)
*++i 和i++
*小赋给大可能丢数据(溢出)
*强制类型转换(类型名)(表达式(括完整))
*两整数相除结果为整数,取整方向不确定
*算数运算符,逗号运算符自左向右结合,赋值运算符从右向左结合
*浮点数不能做%运算(可以强制转换为整型再%)
*x%=y+3 -> x%=(y+3)
*赋值运算符左值不能为表达式or长变量,左值都能作为右值
*逗号表达式:1,2,......,n 整个表达式的值是n的值(a=3,a×4 -> a=12)
*关于结合性的例题:(1.从左向右解析 -> 从右向左算 2.赋值运算符return回去的变量值替代原来的变量值)
*算法+数据结构=程序
*算法的分类
数值算法:求数值解
非数值算法:其他
*算法表示:
自然语言
流程图
伪代码
计算机语言
*每一个程序单位由三部分组成
预处理指令:#include,#define等
全局声明:函数外做的定义
函数
声明语句
执行语句:
控制语句: 九种(if语句,三种循环,continue,break,switch,goto,return)
函数和流对象调用语句:sort(a,b) cout<<"Hello"
表达式语句
空语句:只有一个分号的语句(;)
复合语句:用{}括起来的一些语句
<< : 流插入运算符,>> : 流提取运算符 ->
*执行cout语句时直到缓冲区满或者遇到endl才输出
*用cin输入时系统会根据变量的类型从输入流中提取相应长度字节
*分割变量:Tab 空格 回车
*格式控制符():
(默认右对齐)
*putchar():向终端输出一个字符
可以输出转义字符(putchar(' ')输出换行符)
putchar(数字)输出对应ASCⅡ码的符号 -> 也就是输出不了数字
*getchar():从终端输入一个字符
也是以ASCⅡ码存
*:从上到下依次执行
*关系表达式:用关系运算符将两个表达式连接起来的句子
*逻辑表达式:两个关系表达式用逻辑运算符连接
*逻辑运算优先顺序:!> && > ||
*判断逻辑量标准:0 -> false, 其他 ->true('c'&&'d' -> true[ASCⅡ] 4&&0||2 -> true )
* if(表达式),表达式结果非0则执行下面的语句
*条件运算符:a?b:c 判断a真假,真就执行b,否则执行c
*switch(表达式):
别漏了default
除了defaul,每条语句后加break
各个case和default顺序不影响结果
*
while()
do... while();
for(循环变量初值a;循环继续条件b;循环变量增值c):abc每个都可省略,abc可以是逗号表达式
*break&conyinue:
break: 跳出这个循环
continue:跳出这次循环
从用户角度:库函数,自定义函数
从系统角度:无参函数,有参函数
无参函数
有参函数
定义函数时括号内的变量
不占存储单元
不能为表达式
调用函数时括号内变量
占用存储单元
可以是表达式
类型应与形参兼容
调用时:实参 ——> 形参(单向值传递)
函数可以有一个以上返回值,执行到哪个return,哪个return语句起作用
return后面可以跟表达式
如果函数值类型跟return中表达式值不一致,以函数类型为准,即函数类型决定返回值类型
函数语句:单独作为一个语句 ->
函数表达式:出现在一个表达式中 ->
函数参数:作为实参 ->
定义:对函数功能确立,包括指定函数名,函数类型,形参及其类型
声明:不包括函数体,可以省略形参名,只给形参类型
根据main()位置选择是否声明
在编译时将所调用函数代码嵌入到主函数中,用关键字 表示
可以在声明和定义都加 ,也可以只在声明时加
一般将小规模(5行以下),使用频繁的函数声明为内置函数
声明只是建议,不一定被编译器采纳
可重载的形式:参数类型不同,参数数量不同,参数顺序不同(至少有一者不同)
不能只有函数类型不同而参数个数跟类型相同 ->
关键字
然后可以这样调用
如果不想取这个默认值可以通过实参给出
指定部分默认参数的话默认参数要放形参列表最右端
函数调用前要声明or定义默认值(让编译器知道)
一个函数不能既作为重载函数又作为有默认参数的函数
局部变量作用范围内同名全局变量被屏蔽
变量定义建立存储空间,变量声明不建立存储空间
extern
提前声明
找其他文件里这个变量
auto
动态存储,可省略
/
static
静态存储,函数结束不释放,不赋值默认为0或‘/0’
/
register
局部变量存cpu里,少,快
/
内部函数:只能被本文件其他函数调用,关键字
外部函数:默认都是外部函数,也可以显式声明
头文件包括以下内容:
对类型声明
函数声明
内置函数定义
宏定义
全局变量定义
外部变量声明
根据需要包含其他头文件
不允许对数组长度做动态定义(其实现在编译器很多都可以QWQ)
定义成全局变量初始值为0,否则初值不确定
给一部分元素赋值完其他元素默认值为0
对全部元素赋初值时可以不指定数组长度
不能对两个数组用 '=' 赋值
内存里按行存放
对行部分元素赋值用{ }
对全部元素赋初值,第一维长度可以不指定,但是第二维长度不能省略
跟变量作实参差不多
如果函数实参是数组名,形参也要是数组名
数组名代表数组首元素地址
声明形参数组可以不带元素个数
用数组名作实参时,如果改变形参数组元素的值将同时改变实参数组元素的值(指针)
默认为空字符
不能对两个数组用 '=' 赋值
遇到 '/0' 就表示字符串结束,结束输出
一些函数(const应该都能省略)
可以 这样赋值
字符串连接用加号
比较可以直接用关系运算符
字符串数组:每一个元素都是一个字符串
不允许对数组长度做动态定义(其实现在编译器很多都可以QWQ)
定义成全局变量初始值为0,否则初值不确定
给一部分元素赋值完其他元素默认值为0
对全部元素赋初值时可以不指定数组长度
不能对两个数组用 '=' 赋值
内存里按行存放
对行部分元素赋值用{ }
对全部元素赋初值,第一维长度可以不指定,但是第二维长度不能省略
跟变量作实参差不多
如果函数实参是数组名,形参也要是数组名
数组名代表数组首元素地址
声明形参数组可以不带元素个数
用数组名作实参时,如果改变形参数组元素的值将同时改变实参数组元素的值(指针)
默认为空字符
不能对两个数组用 '=' 赋值
遇到 '/0' 就表示字符串结束,结束输出
一些函数(const应该都能省略)
可以 这样赋值
字符串连接用加号
比较可以直接用关系运算符
字符串数组:每一个元素都是一个字符串
一个变量的地址称为这个变量的指针
如果有一个变量专门用来存放地址,称之为指针变量
'*' 是取值运算符,'&'是取地址运算符
用法:形如
不能用整数给指针变量赋值
指针变量只能指向同类型的指针变量
输出a,b值是交换过后的值
不能定义野指针
为了使在函数中被改变的变量值能被main所用,
不能通过改变形参指针变量的值使实参指针变量的值改变
若p已经指向数组一个元素,则p+1指向这个数组下一个元素
用数组名做参数的函数,传递的是数组首元素的地址
函数的入口地址称为函数的指针
函数类型(*变量名)(形参表)
必须转化为指定一个确定的数据类型的数据才能访问实际存在的数据
意味着使用void指针变量时要对他进行类型转化
加减一个整数:参考数组
赋值
p=NULL
两个指针变量指向同一个数组元素,则他们的差值是两个指针之间元素的个数
比大小:指向同个数组,靠前元素指针变量小
相当于起别名
引用只有声明,没有定义
声明引用同时必须初始化
声明一个引用之后不能让它再作为其他变量的引用
不能建立引用数组
不能建立引用的引用
没有引用的指针
每个成员也称为结构体当中的一个域,成员表又称作域表
引用结构体成员-> ' . '(成员运算符,优先级最高)
结构体数组:存结构体的数组
指向结构体变量的指针:
引用:
用结构体构成链表:见ACM整理(😜)
结构体作为函数参数:
枚举里的元素是常量,第一个是0
可以在声明时自己指定枚举元素的值 没有指定的默认为前一个值加一
面向对象程序设计四个主要特点:封装,抽象,继承和多态
封装:把对象内部实现和外部行为分开
抽象:表示同一类事物的本质
类是对象的抽象,对象是类的特例
多态:由继承产生的不同派生类,其对象会对同一消息做出不同反应
定义对象:
可以在声明类同时定义对象->跟结构体差不多
也可以不出现类名直接定义对象(少用)
类外定义成员函数:
如果类中定义函数不包括循环等控制结构,自动划分为内置函数,类外定义要显式声明,并且把类定义和成员函数定义写一起(.hpp)
不同对象执行同样代码时识别不同对象中数据:this指针,调用哪个对象就指向那个对象(隐式)
访问对象成员:
指针访问对象成员:
一个c++程序由三部分组成:
类声明头文件(.h)
类实现头文件(.cpp)
主文件
不能在类声明数据成员的时候初始化(类是抽象实体,不占据储存空间)
构造函数名字跟类名相同,不具有任何类型,无返回值
也可以在类外定义构造函数,要加 ' :: '
构造函数不需要用户调用也不能被用户调用
一般声明构造函数为public
如果用户没有自己定义构造函数,系统会自动生成一个空构造函数
如果数据成员是数组,则应当在构造函数体中赋值而不能在参数初始化列表中初始化
构造函数可以重载
构造函数可以使用默认参数,如果类外定义则在类内声明时就要指定默认值
类中定义了全部是默认参数的构造函数后不能再重载构造函数(歧义)
作用:在撤销对象占用内存之前完成清理工作,使这部分内存可以分配给新对象使用
什么情况下调用析构函数:
1.函数内局部对象调用结束
2.静态局部对象在函数调用结束时不释放,等到main函数结束后或调用exit结束程序后再调用析构函数
3.全局对象等到main结束或者exit后再调用析构函数
4.new建立对象等到delete时调用析构函数
析构函数不能被重载,一个类只能有一个
先构造的后析构,后构造的先析构
如果构造函数只有一个参数可以
有多个参数的话就要
对象前加上const指定为,必须有初值且无法修改数据成员的值,只能调用该对象的常成员函数
函数后面加const定义为,可以访问常对象中数据成员但不允许修改
:用const声明,值无法改变,只能通过构造函数初始化表对长数据成员初始化
原则:当希望在调用函数时对象的值不被修改,应把形参定义为指向常对象的指针变量,并用对象的地址做实参(对象可以是const也可以不是)
一个对象的值可以赋给另一个同类的对象
复制构造函数(系统自动实现,了解即可)
如果希望同类的个对象中数据成员值一样,就可以把他定义为static,所有对象都可引用
静态成员的值对每个对象都一样,如果改变则在各个对象中的值也都改变
不能用构造函数的参数初始化表对静态成员初始化
可以在类外通过对象名访问公有static成员也可以通过类名引用
成员函数前加static成为,无this指针,主要用来访问静态数据成员
关键字friend,类的友元函数可访问类私有成员
友元类:在类定义里声明另一个类为友元类,则成员函数互为友元(关系是单向的,且不能传递)
实质是函数的重载
一般格式
运算符重载后原有功能仍然保留(+重载后依然可以当作普通加号用)
只能对c++原有运算符重载
不能重载的运算符:'.' '*' '::' 'sizeof' '?:'
重载不能改变运算符操作数个数
重载不能改变运算符优先级别
重载不能改变运算符结合性
重载的运算符不能有默认参数
重载的参数不能全都是标准类型(至少一种类对象(的引用),不然重载干啥嘞😐)
'=' 和 '&'不必用户重载
如果将运算符重载函数作为成员函数,它可以通过this指针(隐式)访问本类数据成员,因此可以少写一个参数
将双目运算符重载为友元函数,由于友元函数不是该类的成员函数,因此形参列表中要有两个参数
规定:
= ,[] ,() ,-> 必须作为成员函数重载
<<,>>只能作为友元函数
一般将单目运算符和复合运算符重载为成员函数
一般将双目运算符重载为友元函数
返回当前对象值
重载形式:
只能作为友元函数
转换构造函数只有一个形参
一般形式
类型转换函数只能作为成员函数,因为转换的主体是本类对象
一个新类从已有类那里获得其已有特性称为类的继承
已有的类产生一个新的子类称为类的派生
一个派生类只从一个基类派生称为单继承,一个派生类有两个以上基类称为多继承
派生类是基类的具体化,基类是派生类的抽象
基类公有成员和保护成员在派生类中保持原有访问属性,私有成员仍为基类私有
基类公用成员和保护成员在派生类访问属性变为私有,基类私有成员仍为基类私有
保护成员可以被派生类成员函数引用
希望在派生类访问基类'私有'成员,应声明为保护
直接基类,间接基类
直接派生类,间接派生类
形式
基类构造函数是实参,不用写参数名
也可以在类中声明,类外定义,声明格式跟普通的构造函数一样,定义的时候再写上面那种格式
多层派生的话只要写出上一层(直接基类)的构造函数即可
如果在基类中没有定义构造函数,或者定义了没有参数的构造函数那么在定义派生类构造函数时不用写基类构造函数(系统隐式调用)
如果基类没定义构造函数,派生类成员也不用初始化,可以不写构造函数
😁
形式
构造函数
多重实继承引用数据成员或者函数最好指明作用域(防止重名出现歧义)
虚基类:在继承共同间接基类时只保留一份数据成员
虚基类是在声明派生类时指定继承方式的时候声明的
声明虚基类
为保证虚基类在派生类只继承一次,应当在虚基类所有直接派生类都声明虚继承
虚基类初始化:构造函数初始化表,子类中不仅要对直接基类初始化,也要用虚基类构造函数对虚基类初始化
可以用公有派生类对象给基类对象赋值(多->少✔)
不能用基类对象为子类对象赋值,同一基类不同派生类之间不能相互赋值
派生类对象可以替代基类对象向基类对象的引用赋值或初始化
如果函数参数是基类对象(的引用),相应的实参可以用子类对象(也就是可以对子类用基类的函数)
指向基类的指针变量也可以指向派生类对象,但此时只能访问派生类中继承的成员无法访问新增数据成员
定义:向不同的对象发送同个信息,不同对象在接受时产生不同做法
多态性分为两类:静态多态性和动态多态性
静态多态性:通过函数重载实现,编译时决定,速度快效率高但缺乏灵活性
动态多态性:通过虚函数实现,运行时决定
虚函数作用:允许派生类重新定义与基类同名函数,并且可以通过基类指针或引用来访问
当把基类某成员函数声明为虚函数后,允许其在派生类中对该函数重新定义赋予新功能,并且可以通过指向基类的指针指向同一类族中不同类的对象,从而调用其中的同名函数
虚函数使用方法:
1.在基类中用 声明成员函数为虚函数,在类外定义虚函数时不用加virtual
2.在派生类重新定义此函数,函数要素要相同,一个成员函数被声明为虚函数之后派生类同名函数自动成为虚函数,所以可以不加virtual(但习惯加),如果派生类无重定义,则简单继承基类虚函数
3.定义一个指向基类的指针变量,并使它指向同一类族中需要调用该函数的对象
4.通过该指针变量调用次虚函数,此时调用的就是指针变量指向的对象的同名函数
什么时候可以定义成虚函数:做基类,具体功能给派生类实现,通过指针或引用访问
构造函数不能声明为虚函数
一般形式
纯虚函数只是告诉编译系统,在这里声明一个虚函数,留给派生类定义
不用来定义对象只作为基本继承类型的类-抽象类,凡是包含纯虚函数的类都叫抽象(基)类
c++的输入输出包括三个方面
1.标准IO,从键盘输入数据,输出到显示器屏幕
2.文件IO,以外存为对象进行输入输出
3.串IO,对内存指定空间进行IO
c++的输入输出流指由若干字节组成的字节序列,缓冲区中的数据就是流
流库的基类:ios类和streambuf类(处理缓冲区)
常用流类:
iostream中定义四种流对象
cout输出时加endl清空缓冲区,加' '不清空
格式控制符
格式状态
文件可分为二进制文件和ASCⅡ文件,ASCⅡ码文件每个字节放一个ASCⅡ码代表一个字符,二进制文件把内存中数据按其在内存中储存形式原样输出到磁盘上存放,对于字符信息没差,数值信息二者不同
打开磁盘文件
关闭磁盘文件
打开时要指定为ios::binary,,可以是既能输入又能输出的文件(跟ASCⅡ不同)
读写二进制文件:
与文件指针有关的流成员函数
一般情况下读写是顺序进行的,即逐个字节进行读写。但是对于二进制数据文件来说,可以利用上面的成员函数移动指针,随机地访问文件中任一位置上的数据,还可以修改文件中的内容。
异常处理机制由三部分组成:检查(try),抛出(throw)和捕捉(catch)
catch必须紧跟try后面,不能单独使用,但是可以只有try无catch
一个try-catch块只能有一个try,但是可以有多个catch用来捕捉不同类型的异常
如果 则表示这个catch块可以处理任意类型的异常
在catch块中包含throw表示'把这个异常丢给上级处理'