0、c++期末总结
- 重点已经用黑体和高亮表示,属于记忆理解部分,可收藏使用
- 后面考完找时间分享下
c++面向对象程序设计课后习题答案(谭浩强版)
与C++题库
刷题部分! - 题库与答案链接:题库与答案链接,设置为0积分下载,如果还不可下载请下方留邮箱,虽然各个学校情况各异,但是知识点是一样的,而且基本高校内C++考的也基本都是这些,大差不差吧~
- 学校考试一般比较简单,更多在于概念和语法的考察,包括一些细节知识点在选择判断等。
- 是根据老师的PPT与自己所学进行总结的,基本不涉及偏难怪知识点,重点是为了期末考试。
- 全文长10400多字,基本可以囊括90%的考试知识点
- 个人感觉知识掌握了就是多做做习题,毕竟考试偏应试,想提高分请一定多做题!!!!
- 想打印的伙伴可以下方留言邮箱,看到会发pdf打印版。
- 考试加油!!!!
- 只是知识点总结,请一定要理解记忆,由于博主这学期也要考,时间有限,难免有不全有误之处,望谅解。
- 最后祝大家考试加油!
10.时间充足者可以按如下顺序学习,更有利于掌握。
- 《黑马程序员》C++基础入门(一)
- 《黑马程序员》通讯录管理系统实战
- 《黑马程序员》通讯录管理系统源码
- 《黑马程序员》C++核心编程(二)
- 《黑马程序员》职工管理系统实战
- 《黑马程序员》职工管理系统源码
- 《黑马程序员》C++提高编程(三)
- 《黑马程序员》演讲比赛管理系统实战
- 《黑马程序员》演讲比赛管理系统源码
- 《黑马程序员》演讲比赛管理系统成品
0.1、程序的构成
- 一个C++程序可以由一个程序单位或多个程序单位构成。每一个程序单位作为一个文件。在程序编译时,编译系统分别对各个文件进行编译,因此,一个文件是一个编译单元。
0.2、程序的编写与实践
- 用高级语言编写的程序称为“源程序”,C++的源程序是以
.cpp
作为后缀的 - 对源程序(.cpp)进行编译 ➡ 目标程序(.obj) ➡ 二进制文件(.exe)
- 编写C++程序一般需要经过的几个步骤是:编辑➡编译➡连接➡调试
1、数据类型
1.1、整型
作用:整型变量表示的是整数类型的数据
- int - 占4个字节
- unsigned int - 无符号整型,占4个字节
1.2、sizeof关键字
作用:利用sizeof关键字可以统计数据类型所占内存大小
1.3、浮点型
作用:用于表示小数
浮点型变量分为两种:
- 单精度float ➡占4个字节,提供6位有效数组
- 双精度double ➡占8个字节,提供15位有效数字
1.4、数值型常量
1.4.1数值常量
一个整型常量可以用3种不同的方式表示:
- 十进制整数。如1357,-432,0等
- 八进制整数。在常数的开头加一个数字0,就表示这是以八进制数形式表示的常数。
- 十六进制整数。在常数的开头加一个数字0和一个英文字母X(或x),就表示这是以十六进制数形式表示的常数
1.4.2浮点数的表示方法
一个浮点数可以用两种不同的方式表示:
- 十进制小数形式。如21.456,-7.98等。
- 指数形式(即浮点形式)
1.5、字符型常量
作用:字符型变量用于显示单个字符
语法:char ch = 'a';
注意1:在显示字符型变量时,用单引号将字符括起来,不要用双引号
注意2:单引号内只能有一个字符,不可以是字符串
-
C和C++中字符型变量只占用1个字节。
-
字符常量只能包括一个字符,如
′AB′
是不合法的 -
字符常量区分大小写字母,如
′A′
和′a′
是两个不同的字符常量 -
字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元
1.6、字符串型常量
作用:用于表示一串字符
两种风格
- C风格字符串:
char 变量名[] = "字符串值"
char str1[] = "hello world";
注意:C风格的字符串要用双引号括起来
- C++风格字符串:
string 变量名 = "字符串值"
string str = "hello world";
注意:C++风格字符串,需要加入头文件==#include==
字符串常量为双引号
常考:字符串 "abc"
在内存中占几个字节?
答:占4个字节,而不是3个字节,编译系统会在字符串最后自动加一个′\0′
作为字符串结束标志。但′\0′
并不是字符串的一部分,它只作为字符串的结束标志
常考: 字符串常量″abc\n″
包含几个字符?
答:不是5个而是4个字符,其中“\n”
是一个转义字符,但它在内存中占5个字节
1.7、布尔类型bool
作用:布尔数据类型代表真或假的值
bool类型只有两个值:
- true — 真(本质是1)
- false — 假(本质是0)
bool类型占1个字节大小
1.8、数据的输入输出
关键字:cin、cout
语法: cin >> 变量1>>变量2>>....>>变量n
、cout<<表达式1<<表达式2<<...<<表达式n
cout<<a,b,c; //错误,不能一次插入多项
cout<<a+b+c; //正确,这是一个表达式,作为一项
cin>>a>>b>>c>>d;
1.9、变量命名规则
- C++规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线
- 不能是关键字
- 区分大小写
1.10、局部变量
- 在一个函数内部定义的变量是局部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的
- 形参也是局部变量
1.11、全局变量
- 在函数之外定义的变量是外部变量,称为全局变量
2、运算符
2.1、算数运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 负号 | -3 | -3 |
+ | 加 | 10 + 5 | 15 |
- | 减 | 10 - 5 | 5 |
* | 乘 | 10 * 5 | 50 |
/ | 除 | 10 / 5 | 2 |
% | 取模(取余) | 10 % 3 | 1 |
++ | 前置递增 | a=2; b=++a; | a=3; b=3; |
++ | 后置递增 | a=2; b=a++; | a=3; b=2; |
– | 前置递减 | a=2; b=–a; | a=1; b=1; |
– | 后置递减 | a=2; b=a–; | a=1; b=2; |
注意:
- 两个整数相除结果依然是整数(这里不进行四舍五入,直接舍去小数点后面数字)
- C++中两个小数可以相除
- 运算的两个数中有一个数为float型数据,则运算的结果是double型,因为C++在运算时对所有float型数据都按double型数据处理
- 只有整型变量可以进行取模运算,两个小数不可以取模
- 在除法运算中,除数不能为0
- 取模运算时,除数也不能为0
常考:
-
前置后置运算符单独使用没有什么区别
-
前置递增先对变量进行++,再计算表达式
-
后置递增先计算表达式,后对变量进行++
-
请详细看下方代码并理解
//递增
int main() {
//后置递增
int a = 10;
a++; //等价于a = a + 1
cout << a << endl; // 11
//前置递增
int b = 10;
++b;
cout << b << endl; // 11
//区别
//前置递增先对变量进行++,再计算表达式
int a2 = 10;
int b2 = ++a2 * 10;
cout << b2 << endl; //110
//后置递增先计算表达式,后对变量进行++
int a3 = 10;
int b3 = a3++ * 10;
cout << b3 << endl; //100
system("pause");
return 0;
}
2.2、赋值运算符
作用:用于将表达式的值赋给变量
- 请详细看表格即可
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
= | 赋值 | a=2; b=3; | a=2; b=3; |
+= | 加等于 | a=0; a+=2; | a=2; |
-= | 减等于 | a=5; a-=3; | a=2; |
*= | 乘等于 | a=2; a*=2; | a=4; |
/= | 除等于 | a=4; a/=2; | a=2; |
%= | 模等于 | a=3; a%2; | a=1; |
2.3、比较运算符
作用:用于表达式的比较,并返回一个真值或假值
- 请详细看表格即可
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
== | 相等于 | 4 == 3 | 0 |
!= | 不等于 | 4 != 3 | 1 |
< | 小于 | 4 < 3 | 0 |
> | 大于 | 4 > 3 | 1 |
<= | 小于等于 | 4 <= 3 | 0 |
>= | 大于等于 | 4 >= 1 | 1 |
注意:C和C++ 语言的比较运算中, “真”用数字“1”来表示, “假”用数字“0”来表示。
2.4、逻辑运算符
作用:用于根据表达式的值返回真值或假值
- 请详细看表格即可
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
! | 非 | !a | 如果a为假,则!a为真; 如果a为真,则!a为假。 |
&& | 与 | a && b | 如果a和b都为真,则结果为真,否则为假。 |
|| | 或 | a || b | 如果a和b有一个为真,则结果为真,二者都为假时,结果为假。 |
!
非为三者中运算符最高的
3、流程结构
3.1、选择结构
3.1.1、if语句
- if语句较为简单,常常搭配else使用,且可以嵌套使用
3.1.2、三目运算符
作用: 通过三目运算符实现简单的判断
语法:表达式1 ? 表达式2 :表达式3
如果表达式1的值为真,执行表达式2,并返回表达式2的结果;
如果表达式1的值为假,执行表达式3,并返回表达式3的结果。
- 此处常出程序阅读题!!!!
3.1.3、switch语句
作用:执行多条件分支语句
语法:
switch(表达式)
{
case 结果1:执行语句;break;
case 结果2:执行语句;break;
...
default:执行语句;break;
}
- switch语句中表达式类型只能是整型或者字符型
- case里如果没有break,那么程序会一直向下执行
3.2、循环结构
3.2.1、while
作用:满足循环条件,执行循环语句
语法:while(循环条件){ 循环语句 }
解释:只要循环条件的结果为真,就执行循环语句
3.2.2、do…while
作用: 满足循环条件,执行循环语句
语法: do{ 循环语句 } while(循环条件);
注意:与while的区别在于do…while会先执行一次循环语句,再判断循环条件(这里常考两者区别,记住无论怎样,do…while都会必然执行一次循环语句)
3.2.3、for
- for循环中的表达式,要用分号进行分隔
int main() {
for (int i = 0; i < 10; i++)
{
cout << i << endl;
}
system("pause");
return 0;
}
3.3、跳转语句
3.3.1、break
作用: 用于跳出选择结构或者循环结构
3.3.2、continue
作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环
注意:continue并没有使整个循环终止,而break会跳出循环
4、数组
数组:所谓数组,就是一个集合,存放相同类型的数据元素
- 数组中的每个数据元素都是相同的数据类型
- 数组是由连续的内存位置组成的
4.1、一维数组
一维数组定义的三种方式:
数据类型 数组名[ 数组长度 ];
(常用,了解其余两种即可)数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};
数据类型 数组名[ ] = { 值1,值2 ...};
int score[10];
int score2[10] = { 100, 90,80,70,60,50,40,30,20,10 };
int score3[] = { 100,90,80,70,60,50,40,30,20,10 };
- 数组中下标是从0开始索引
- 在对全部数组元素赋初值时,可以不指定数组长度
- 直接打印数组名,可以查看数组所占内存的首地址
- 对数组名进行sizeof,可以获取整个数组占内存空间的大小
- 以上三种方式并不要求都会,但是需要都见过,防止在程序改错中乱改
4.1.1、一维数组初始化
- 在定义数组时分别对数组元素赋予初值。例如
int a[10]={0,1,2,3,4,5,6,7,8,9};
- 可以只给一部分元素赋值。例如
int a[10]={0,1,2,3,4};
- 如果想使一个数组中全部元素值为1,可以写成
int a[10]={1,1,1,1,1,1,1,1,1,1};
int a[10]={1*10}; // 错误写法,不能给数组整体赋初值
- 在对全部数组元素赋初值时,可以不指定数组长度
int a[5]={1,2,3,4,5};
// 可以写成
int a[]={1,2,3,4,5};
4.2、二维数组
二维数组定义的四种方式:
数据类型 数组名[ 行数 ][ 列数 ];
数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2 } ,{数据3,数据4 } };
数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4};
数据类型 数组名[ ][ 列数 ] = { 数据1,数据2,数据3,数据4};
int arr[2][3];
int arr2[2][3] =
{
{1,2,3},
{4,5,6}
};
int arr3[2][3] = { 1,2,3,4,5,6 };
int arr4[][3] = { 1,2,3,4,5,6 };
- 以上4种定义方式,利用第二种更加直观,提高代码的可读性
- 如果对全部元素赋初值,定义数组时对第一维的长度可以不指定,但是第二维的长度不能省略
4.3、字符数组
- 用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符
定义:
char c[10] = {′I′,′ ′,′a′,′m′,′ ′,′h′,′a′,′p′,′p′,′y′};
赋值:
只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值
char c[5];
c={′C′,′h′,′i′,′n′,′a′}; //错误,不能对整个数组一次赋值
C[0]=′C′; c[1]=′h′; c[2]=′i′; c[3]=′n′; c[4]=′a′; //对数组元素赋值,正确
int a[5],b[5]={1,2,3,4,5};
a=b; //错误,不能对整个数组整体赋值
a[0]=b[0]; //正确,引用数组元素
4.4、字符串函数
-
字符串连接函数
strcat
-
字符串复制函数
strcpy
-
字符串比较函数
strcmp
-
字符串长度函数
strlen
5、函数
作用:将一段经常使用的代码封装起来,减少重复代码
5.1、函数定义
函数的定义一般主要有5个步骤:
1、返回值类型
2、函数名
3、参数表列
4、函数体语句
5、return 表达式
语法:
返回值类型 函数名 (参数列表)
{
函数体语句
return表达式
}
- 返回值类型 :一个函数可以返回一个值。在函数定义中
- 函数名:给函数起个名称
- 参数列表:使用该函数时,传入的数据
- 函数体语句:花括号内的代码,函数内需要执行的语句
- return表达式: 和返回值类型挂钩,函数执行完后,返回相应的数据
示例:定义一个加法函数,实现两个数相加
//函数定义
int add(int num1, int num2)
{
int sum = num1 + num2;
return sum;
}
5.2、函数调用
功能:使用定义好的函数
语法:函数名(参数)
int result = add(10,20);
-
函数定义里小括号内称为形参,函数调用时传入的参数称为实参
-
例如此处的
num1,num2
为形参,10,20
为实参 -
函数不能嵌套定义但是可以嵌套调用(常考)
5.3、函数声明
- 函数的声明可以多次,但是函数的定义只能有一次
//声明可以多次,定义只能一次
//声明
int max(int a, int b);
int max(int a, int b);
//定义
int max(int a, int b)
{
return a > b ? a : b;
}
int main() {
int a = 100;
int b = 200;
cout << max(a, b) << endl;
system("pause");
return 0;
}
5.4、值传递
- 所谓值传递,即单向传递,就是函数调用时实参将数值传入给形参,而不能由形参传回来给实参。
- 值传递时,如果形参发生改变,并不会影响实参(值传递时,形参是修饰不了实参的),请务必理解并记住,此处因篇幅就不进行讲解了!
5.5、函数默认参数
在C++中,函数的形参列表中的形参是可以有默认值的。
语法:返回值类型 函数名 (参数= 默认值){}
int func(int a, int b = 10, int c = 10) {
return a + b + c;
}
//1. 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值
//2. 如果函数声明有默认值,函数实现的时候就不能有默认参数
int func2(int a = 10, int b = 10);
int func2(int a, int b) {
return a + b;
}
int main() {
cout << "ret = " << func(20, 20) << endl;
cout << "ret = " << func(100) << endl;
system("pause");
return 0;
}
- 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值
- 如果函数声明有默认值,函数实现的时候就不能有默认参数
5.6、函数占位参数
C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置
语法: 返回值类型 函数名 (数据类型){}
//函数占位参数 ,占位参数也可以有默认参数
void func(int a, int) {
cout << "this is func" << endl;
}
int main() {
func(10,10); //占位参数必须填补
system("pause");
return 0;
}
5.7、函数重载
作用:函数名可以相同,提高复用性
函数重载满足条件:
- 函数名称相同
- 函数参数类型不同 或者 个数不同 或者 顺序不同
注意: 函数的返回值不可以作为函数重载的条件
//函数重载需要函数都在同一个作用域下
void func()
{
cout << "func 的调用!" << endl;
}
void func(int a)
{
cout << "func (int a) 的调用!" << endl;
}
void func(double a)
{
cout << "func (double a)的调用!" << endl;
}
void func(int a ,double b)
{
cout << "func (int a ,double b) 的调用!" << endl;
}
void func(double a ,int b)
{
cout << "func (double a ,int b)的调用!" << endl;
}
//函数返回值不可以作为函数重载条件
//int func(double a, int b)
//{
// cout << "func (double a ,int b)的调用!" << endl;
//}
int main() {
func();
func(10);
func(3.14);
func(10,3.14);
func(3.14 , 10);
system("pause");
return 0;
}
5.8、重载运算符规则
C++中有以下五个运算符不能重载
成员访问运算符 | 成员指针访问运算符 | 域运算符 | 长度运算符 | 条件运算符 |
---|---|---|---|---|
. | .* | :: | sizeof | ?: |
重载运算符规则:
- 重载不能改变运算符运算对象(即操作数)的个数
- 重载不能改变运算符的优先级别
- 重载不能改变运算符的结合性
- 运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可以是既非类的成员函数也不是友元函数的普通函数
什么时候应该用成员函数方式,什么时候应该用友元函数方式?二者有何区别呢?()
- 一般将单目运算符重载为成员函数,将双目运算符(二元运算符)重载为友元函数
- 重载为类的成员函数 -
operator
函数有一个参数 - 重载为类的友元函数 -
operator
函数有两个参数 - 只能将重载
“>>”
(流插入运算符)和“<<”
(流提取运算符)的函数作为友元函数或者普通函数重载,而不能将它们定义为成员函数,因为参数为两个 - 类型转换运算符只能作为成员函数重载
- 重载为类的成员函数 -
单目运算符:只有一个操作数,如 !,-(负号),&,*,++,–
双目运算符:*,/,%,+,-,==,!=,,=,&&,||
5.9、内联函数
- 指定内置函数的方法很简单,只需在函数首行的左端加一个关键字inline即可。
inline int max(int a,int b);
- 使用内置函数可以节省运行时间
- 只有那些规模较小而又被频繁调用的简单函数,才适合于声明为inline函数。
5.10、函数模板
语法:
template<typename T>
函数声明或定义
解释:
template — 声明创建模板
typename — 表面其后面的符号是一种数据类型,可以用class代替
T — 通用的数据类型,名称可以替换,通常为大写字母
只适用于函数体相同、函数的参数个数相同而类型不同的情况,如果参数的个数不同,则不能用函数模板。
6、指针
指针的作用: 可以通过指针间接访问内存
6.1、指针变量
指针变量定义语法: 数据类型 * 变量名;
- 请看下方代码示例,理解指针变量的定义与使用,期末一般不会出太难指针的题,但是基本用法一定要会!!
int main() {
//1、指针的定义
int a = 10; //定义整型变量a
//指针定义语法: 数据类型 * 变量名 ;
int * p;
//指针变量赋值
p = &a; //指针指向变量a的地址
cout << &a << endl; //打印数据a的地址
cout << p << endl; //打印指针变量p
//0073F8BC
//0073F8BC
//2、指针的使用
//通过*操作指针变量指向的内存
cout << "*p = " << *p << endl;
// *p = 10
system("pause");
return 0;
}
指针变量和普通变量的区别
- 普通变量存放的是数据,指针变量存放的是地址
- 指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用
总结1: 我们可以通过 & 符号 获取变量的地址
总结2:利用指针可以记录地址
总结3:对指针变量解引用,可以操作指针指向的内存
总结4:所有指针类型在32位操作系统下是4个字节(了解)
6.2、const修饰指针
const修饰指针有三种情况
- const修饰指针 — 常量指针
- const修饰常量 — 指针常量
- const既修饰指针,又修饰常量
int main() {
int a = 10;
int b = 10;
//const修饰的是指针,指针指向可以改,指针指向的值不可以更改
const int * p1 = &a;
p1 = &b; //正确
//*p1 = 100; 报错
//const修饰的是常量,指针指向不可以改,指针指向的值可以更改
int * const p2 = &a;
//p2 = &b; //错误
*p2 = 100; //正确
//const既修饰指针又修饰常量
const int * const p3 = &a;
//p3 = &b; //错误
//*p3 = 100; //错误
system("pause");
return 0;
}
技巧:看const右侧紧跟着的是指针还是常量, 是指针就是常量指针,是常量就是指针常量
6.3、指针和数组
作用:利用指针访问数组中元素
- C++规定,数组名就是数组的起始地址
- 数组的指针就是数组的起始地址
- 数组名可以作函数的实参和形参,传递的是数组的地址
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int * p = arr