C++复习提纲及习题集下Word格式文档下载.docx
《C++复习提纲及习题集下Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C++复习提纲及习题集下Word格式文档下载.docx(27页珍藏版)》请在冰点文库上搜索。
case12:
break;
default:
i=i+1;
}
A.11B.13C.12D.14
4.若有条件表达式(exp)?
x--:
--x,则下列表达式中能完全等价于表达式(exp)的是()
A.(exp!
=0)B.(exp!
=1)C.(exp==0)D.(exp==1)
5.语句while(!
e);
中的条件!
e等份于()
A.e==0B.e!
=1C.e!
=0D.~e
6.下面关于for循环的正确描述是()
A.for循环只能用于循环次数已经确定的情况
B.for循环是先执行循环语句,后判定表达式
C.在for循环中,不能用break语句跳出循环体
D.for循环体语句中,可以包含多条语句,但要用花括号括起来
7.以下程序段()
A.是死循环B.循环体执行二次
C.循环体执行一次D.有语法错误
x=1;
do{x=x*x;
}while(!
x);
8.下面程序的输出是()
#include<
iostream.h>
voidmain()
{
inty=9;
for(;
y>
0;
y--)
if(y%3==0)
{
cout<
<
--y;
continue;
}
}
9.下列程序,描述正确的是()
#include<
intx=3;
do
{
cout<
(x-=2);
}while(!
(--x));
10.以下程序段执行后,输出“*”的个数为( )
#include<
inti,j;
i=0,j=0;
while(i++<
5)
j=0;
do
"
*"
;
}while(++j<
4);
A.15B.10C.20D.25
11.语句while(!
e==0);
什么时候将会陷入死循环()
=0C.e!
=1D.e!
=-1
12.对for(表达式1;
;
表达式3)可理解为()
A.for(表达式1;
0;
表达式3)
B.for(表达式1;
1;
C.for(表达式1;
表达式1;
D.for(表达式1;
表达式3;
13.下面程序的运行结果是( )
inti;
for(i=1;
i<
=5;
i++)
if(i%2)
@"
else
continue;
#"
cout<
$\n"
A.
#@#$B.#
#@$
C.
#$D.#
#$
13.下列数组声明错误的是( )
A.#definen5B.constintn=5;
chara[n]={"
Good"
};
chara[n]={"
C.intn=5;
D.constintn=5;
chara[n+2]={"
14.下列数组与初始化正确的是( )
A.inta[2][3]=={1,2,3,4,5,6};
B.inta[][2]={7,8,9};
C.floatb[3][2]={{1.5,2.0},{3.5},{5,6,7}};
D.floatb[][3]={1,2,3,4,5,6,7};
15.若有以下定义,则对a数组元素错误的引用是( )
inta[5]={1,2,3,4,5};
A.a[0]B.a[2]C.a[a[4]-2]D.a[5]
16.若有以下定义,则数组元素b[2][2]的值是()
intb[][3]={{1},{2,3},{4,5,6},{7}};
A.0B.3C.5D.6
17.若有以下定义,则数组arr所占的空间为( )
chars[]="
Bei_jing"
A.7个字节B.8个字节C.9个字节D.10个字节
18.下列是为字符数组赋字符串的语句组,其中错误的是()
A.chars[10];
s="
program"
B.chars[]="
C.chars[10]="
Hello"
D.chars[10];
strcpy(s,"
hello"
);
19.下列字符串初始化正确的是()
A.chars[]="
B.chars[3]="
Bei"
C.chars[2][]={"
blue"
"
green"
D.chars[2][6]={"
red"
20.下列程序运行结果是( )
A.5B.7C.8D.9
string.h>
chars1[10]="
abcd"
s2[]="
1234"
s3[]="
abc"
strlen(strcat(strcpy(s1,s2),s3));
21.下列程序的运行结果是()
A.ABC123B.123abcC.123ABCD.123ABCde
abcde"
123"
ABC"
strcat(s2,strcpy(s1,s3));
22.下面有关字符数组与字符串的说法中,正确的是( )
A.字符数组中存放的一定是一个字符串
B.所有的字符数组都可以被当作字符串处理
C.对存放字符串的字符数组可以像一般数组一样对数组中单个元素进行操作
D.一个字符数组可以认为就是一个字符串
23.下列对字符串的说法中,错误的是( )
A.字符串就是一个字符数组
B.字符串可以整体输入输出
C.字符串可以比较大小
D.存贮字符串所需的内存空间等于字符串的长度
二.填空题
1.下列程序的运行结果是
#defineM1.5
#defineA(a)M*a
intx(5),y(6);
A(x+y)<
endl;
2.下列程序的运行结果是
inti
(1);
i++;
++i<
if(i==7)break;
}while(i==3);
ok!
\n"
3.下列程序的运行结果是
intx(5);
switch(x%2)
case1:
x--;
case0:
x++;
x--;
x<
}while(x>
0);
4.有以下程序,其功能是将从键盘上输入的小写字母转换成大写字母输出,当输入为‘#’时,结束转换,请在下划线处填上合适的内容。
charc;
cin.get(c);
while()
if(c>
='
a'
&
c<
z'
)
cout.put(c);
cin.get(c);
5.下述程序的输出结果是
inti,j,row,col,m;
intarray[3][3]={{100,200,300},{8,72,-30},{-850,2,6}};
m=array[0][0];
for(i=0;
3;
for(j=0;
j<
j++)
if(array[i][j]<
m)
{
m=array[i][j];
row=i;
col=j;
}
m<
'
\t'
row<
col<
6.在C++语言中,二维数组元素在内存中的存放顺序是
7.下面程序的运行结果是
charch[]="
inti,s=0;
ch[i]>
0'
ch[i]<
9'
s=10*s+ch[i]-'
s<
第五章函数、函数与运算符的重载
一.函数
1.函数概述
函数是结构化程序中的模块,从OOP的角度,对应于OOP技术中的方法,它封装了一些程序逻辑代码和数据,实现了更高级的抽象,用户关心的是函数的接口。
所有的函数都不存在隶属关系,只存在主调与被调的关系。
2.函数的分类
用户使用的角度:
库函数、自定义函数
参数的角度:
无参函数、有参函数
函数返回值的角度:
void函数与有返回值的函数
二.函数的说明与使用
1.C++函数调用的必要条件:
⏹提供函数的定义
⏹提供函数的原型
⏹调用函数
本章学习的最终目的:
⏹学会如何定义一个函数
⏹如何给函数传递信息
⏹如何从函数中获得信息
2.函数的定义
⏹无参函数的定义
⏹有参函数的定义
⏹函数头描述了函数与调用它的函数之间的接口
⏹函数体描述了函数功能的实现过程
⏹形参列表描述的是从主调函数传递给被调函数的信息或被调函数传递给主调函数的信息。
3.函数的调用
⏹函数调用的必要条件
⏹如何提供函数的原型
⏹函数调用执行过程
4.函数的返回值及其类型
⏹void类型意义
⏹main()函数的类型
⏹函数返回值的途径
⏹void类型中return语句的用法
5.函数的参数
形参的概念
实参的概念及形式
实参与形参结合的原则
6.函数的嵌套调用与递归调用
⏹递归的两个要素:
递推规律与回归的条件
⏹不失一般性,对于以下递归函数的执行过程:
typenamefun(形参列表)
{
statements1;
if(test)
fun(实参列表);
statements2;
⏹若if语句中的test为true,每次递归调用都将按调用的顺序执行statements1,而不会执行statements2。
⏹若if语句中的test为false时,当前递归调用将执行statements2。
当调用结束后,程序控制权将返回给上次递归调用,而上次递归调用又将执行其statements2,然后结束本次递归调用,依次类推。
⏹结论:
statement1是按递归调用的顺序执行的,而statements2是按递归调用的相反的顺序执行的,程序将沿进入的路径返回。
⏹要求掌握递归调用的典型范例及简单范例,如阶乘的递归算法、求Fibonacci数列某项的递归算法、求两个整数的最大公约数的递归算法等。
三.C++函数的扩展
1.引用型变量
⏹对引用的操作,实质上是对其引用目标的操作
⏹引用在定义时必须进行初始化
⏹可以用某个引用给一个变量赋值,该变量的值便是被引用的变量的值
⏹引用主要的用途是用来作函数的形参和函数的返回值,不失一般性,使用引用作函数的形参时,调用函数的实参要用变量名,将实参变量名赋予形参的引用,相当于在被调函数中使用了实参的别名,则在被调函数中,对引用的改变,实质是就是直接通过引用来改变实参变量的值
⏹通过引用型参数,使得函数获得两个以上的反馈信息
⏹如果实参与引用参数不匹配,C++将生成临时变量,仅当形参为const引用时,则在下面两种情况下生成临时变量,用实参初始化临时变量,而将引用作为临时变量的别名:
1)实参的类型正确,但不是左值
2)实参的类型不正确,但可以转换为正确的类型(赋值兼容)
⏹用const关键字限制的引用称为常引用,它非const引用的区别就在于不允许通过常引用改变其目标变量的值
⏹返回引用值的函数
格式:
类型名&
函数名(形参列表)
函数体
⏹返回引用值函数的讨论:
1)通常,函数的返回值的机制是将return语句中的表达式的值复制到临时存储单元,随后调用函数访问该区域
2)返回引用的被调函数,则意味着主调函数将直接访问被返回的引用变量,而不需要拷贝
3)若函数的返回类型为引用,则函数调用可作为左值,这对于赋值算符的重载提供实现的途径
4)当函数返回的引用的对象,其原则是在该函数调用结束时,此被引用的对象继续存在。
最简单的方式是函数返回作为参数传递给它的引用(主调函数的变量)或指针,要么返回用new分配的存储单元或静态存储属性的单元。
2.内联函数
⏹内联函数与非内联函数的主要区别不在于编写方式,而在于其调用方式。
内联函数是在编译阶段,由编译器将相应内联函数的代码(函数体)替换其函数的调用。
其代价是增加了目标程序代码量,增加了内存的开销,但提高了程序的执行效率。
⏹可在定义时或在原型声明用关键字inline将一函数声明为内联函数
⏹内联函数体内不允许用循环语句或分支语句(函数体简单)
⏹内联函数不允许递归
⏹若发生以上情况,即使用inline关键字进行声明,编译器也不会把其处理成内联函数,但也不会出错
⏹内联函数的定义必须出现在内联函数第一次被调用之前
⏹类说明内部定义的函数都属于内联函数
⏹注意内联与宏的区别
3.函数的默认参数
⏹默认参数是C++的新增特性。
它是指当函数调用中省略了实数时,对应的形参自动使用的值
⏹默认参数不是编程方面的重大突破,而只是提供了一种调用的便捷方式及灵活性。
当给函数的原型指定了参数的默认值,则函数定义与没有默认参数时完全相同
⏹函数参数默认值可通过函数的原型声明或函数的定义进行设置
⏹允许给一个或多个参数指定默认值,但必须按照从左向右添加默认值的原则。
亦即,要为某个参数设置默认值,则必须为它右边的所有参数提供默认值
⏹在给某个参数指定默认值时,不仅可以是一个数值,而且还可以是任意复杂的表达式
4.函数重载(多态性)
⏹函数多态是C++新增功能。
默认参数允许使用不同数目的参数调用同一个函数,而函数多态(重载)则允许使用多个同名函数。
即可定义多个同名函数,一个同名函数可以对应多个不同的实现
⏹函数重载的关键是函数的参数列表-也称为函数的特征标。
C++允许定义名称相同,但特征标不同的函数
⏹重载函数在进行调用时,由编译器根据函数参数的数目及类型来确定执行那个程序代码
⏹调用重载函数时,一定要在函数调用中使用正确的参数类型
⏹注意,编译器将类型引用与类型本身视为同一个特征标
⏹const引用与非const引用视为不同的特征标
四.运算符的重载
1.导出数据类型-结构体
⏹结构体类型的定义
⏹结构体变量或对象的定义及初始化(三种形式)
⏹结构体数组的定义及初始化
⏹结构体对象成员的引用
⏹注意:
结构体的引用对象只能是结构体变量或对象的成员,而对两个结构变量之间可进行赋值操作,结构体变量也可作为函数的参数,但结构体变量作函数的参数通常是引用类型
2.枚举数据类型
⏹枚举类型的实质是C++的enum工具提供了另一种创建符号常量的方式,这种方式可以替代const常量,其特点为将允许定义新的类型
⏹枚举类型的定义及枚举量的设置
⏹枚举变量的定义及初始化
⏹在不进行强制类型转换的情况下,只能将定义枚举类型时的枚举量赋给枚举变量
⏹对于枚举类型,系统仅仅定义了赋值操作
⏹枚举量是整型,在参与算术运算时,被提升为整型
⏹将整型赋给枚举变量时,要进行强制类型转换
⏹枚举常量被用来定义相关的符号常量,而不是新的类型。
如果只使用枚举常量,而不创建枚举类型的变量,则在定义枚举类型时,可以省略枚举类型名称
⏹记住,在VC++中,枚举变量被解释为int存储单元
3.运算符重载
⏹运算符重载是另一种形式的C++多态,将重载的概念扩展到运算符上,允许赋予运算符多种含义
⏹除了下列算符外,C++中几乎所有的算符都可重载
●求字节算符:
sizeof算符
●成员运算符:
•
●成员指针运算符:
•*
●作用域运算符:
:
:
●条件运算符:
?
⏹运算符重载实现的途径是通过operator函数实现的。
Operator函数定义了运算符重载所实现功能的具体操作
⏹记住:
●重载后的运算符必须至少有一个操作数是用户自定义类型,这是为了防止用户为标准类型重载运算符
●运算符重载时,不能改变运算符操作数的个数
●运算符重载时,不能改变运算符的优先级别
●运算符重载时,不能改变运算符的结合性
●运算符重载时,不能改变运算符的语法结构
●运算符重载时,不能定义新的运算符
●运算符重载时,含义必须明确,不能存在二义性
⏹自增、自减算符是单目算符,但它们有前缀和后缀运算两种,为区分前缀与后缀,将后缀视为双目算符,因此其前缀形式为:
类型名operator@(类型名形参变量名);
其后缀形式为:
类型名operator@(类型名形参变量名,int)
五.函数的模板
1.函数模板的概念
C++编译器实现了C++新增的一项特性-函数模板。
函数模板是通用的函数描述,其技术通过使用通用类型来定义函数,也就是将类型作为参数传递给模板,当发生函数调用时,使编译器生成该类型的模板函数(函数的重载)。
由于模板允许以通用类型编写程序,因此也称通用编程。
由于类型是用参数表示的,因此模板特性也称参数化类型。
2.函数模板的定义及简单应用
记住:
●函数的模板并不创建任何函数,只是通知编译器如何定义函数
●模板中可以带有多个参数类型
●模板的参数类型可以是一个已存在的数据类型
●模板中可以带有模板参数表中未给出的、已存在的数据类型的参数
●函数的模板允许重载
六.名称(变量)的存储属性(作用域与存储类别)
1.名称的作用域与链接性
⏹作用域描述(体现)名称(标识符)在文件中的多大范围内是可见的,即是可访问的
⏹从C++标识符作用域可分为:
●局部变量(块作用域变量)
●全局变量
●函数原型作用域
●类作用域
●名称空间作用域
●C++函数的作用域是整个类或全局的,不能是局部的
⏹链接性描述了名称在不同单元之间能否共享的问题。
C++名称的链接性分为:
●外部链接性:
名称可在文件之间共享
●内部链接性:
名称只能在文件中的函数之间共享
●无链接性:
名称不能共享
2.名称的存储持续(类别-名称的生命周期
⏹自动存储持续-自动变量
●在函数定义或函数体内块语句中声明的变量(包括形参)的存储类别在默认的情况下为自动的。
它们在程序开始执行其所属的函数或代码块时被创建,在执行完函数或代码块时,它们使用的内存被释放
●自动变量的作用域为局部的,没有链接性
●在代码块中定义的变量,则该变量的存在时间和作用域将被限制在代码块内
●块语句定义的自动变量若与局部变量发生冲突时,则用同名覆盖解决冲突
●自动变量未初始化时,其初值为不确定
●自动变量在进行初始化时,初值的形式可为已知值的任意表达式
●用register声明的寄存器变量为自动变量
⏹静态存储持续-静态变量
●用关键字static声明的局部变量和在函数定义外定义的变量的存储持续为静态的,它们在整个程序运行过程中都存在。
C++为静态存储持续变量提供了三种链接性:
外部链接性、内部链接性、无链接性
●静态变量由编译器分配固定的内存单元,在整个程序运行期间都存在,且具有以下初始化特征:
I.未被初始化的静态变量的所有位都设置为0
II.只能使用常量表达来初始化静态变量,常量表达式可以使用字面值常量、const常量、enum常量及sizeof操作符
●静态持续、外部链接性-外部变量(全局变量)
●静态持续、内部链接性-用static声明的外部变量
●静态持续、无链接性-用static声明的局部变量
●记住:
若定义了与自动变量同名的外部变量,则在自动变量的可见范围内,自动变量将隐藏同名的外部变量。
若在自动变量的作用域范围内,要访问同名的外部变量,可在外部变量前加作用域运算符:
3.函数与链接性
⏹所有函数的存储持续都自动为静态的
⏹在默认的情况下,函数的链接性为外部的,即可在文件间共享
⏹可使用关键字static将函数的链接性设置为内部的,即只能在所属的文件内使用。
记住,要求同时在原型和函数定义中使用关键字static
⏹在定义静态函数的文件中,静态函数将覆盖外部定义
⏹记住C++“单定义规则”,即对于每个非内联函数,程序中只能包含一个定义。
对于链接性为外部的函数来说,在多文件的程序中,只能有一个文件包含该函数的定义,但使