计算机二级(C++)考试复习

面向对象程序设计的基本特点

抽象

指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。

包括数据抽象和行为抽象(或称为功能抽象、代码抽象)

封装

指将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机结合,形成类,其中的数据和函数都是一个类的成员。

继承

在保持原有类特性的基础上,进行更具体更详细的说明

多态

指一段程序能够处理多种类型对象的能力。

㈠ 数据类型及其运算

【考试要求】

了解基本类型及其常量的表示法;掌握变量的定义及初始化方法;掌握运算符与表达式的概念;掌握C++的自动类型转换和强制类型转换。

【主要考点】

1、数据类型的种类

基本数据类型:

boolr(1字节),1char(1字节),int(4字节),float(4字节),double(8字节)long(4字节)

常量:

(1)整型常量

八进制整常量的数字部分要以数字0开头

十六进制整常量的数字要以0x开头

整型常量可以用后缀字母L(l)表示长整型,后缀字母U(u)表示无符号型

在这里插入图片描述

signed和unsigned可以用来修饰char型和int型(包括long int),不能修饰bool、float、double和long double。
故本题答案为C。

(2)实型常量

一般形式:12.5

指数形式:0.345E+2

注:以字母E或e来代表以10为底的指数。其中,e的左边是数值部分(有效数字),可以表示成整数或小数形式,它不能省略!但是小数部分和整数部分能省略其一,eg:12.E 2或1.E-3但是不能写成E-3!!e的右边是指数部分,必须是整数形式

实型常量默认为double型,如果后缀F(f)可以使其转化为float型

在这里插入图片描述

对于整型数,如不采用后缀说明符,默认为int类型,L表示长整型;对于浮点数,不加后缀标识符默认类型为double类型,对于单精度浮点数要加"F"后缀。

(3)字符常量:用单引号引起来的一个字符

  • 普通字符

  • 转义字符

    即特殊字符常量,转移字符是C语言中表示字符的一种特殊形式,其含义是将反斜杠后面的字符转换成另外的意义。

  • ASCII码字符

即用反斜符()开头,后跟字符的ASCII码,这种方法也称为转义序列表示法,具体方法是:

(1)用字符的八进制ASCII码,表示为:\0dd.这里,0dd是八进制值(0可以省略)。

(2)使用字符的十六进制ASCII码值,表示为 \xhh或Xhh 这里hh是两位十六进制值。

eg:‘a’可以表示为’\x61’

易错:

在这里插入图片描述

答案:A。

解析:“A、’\xff’”,因为这虽然属于ASCII码字符,但是“ff”超出了(标准)ASCII码最大的“7f”,所以不合法。“B、’\65’”属于ASCII码字符,“C、’&’”属于普通字符,“D’\028’”属于ASCII码字符。

在这里插入图片描述

答案:A

解析:字母在C++语言中是以ASCII码存放的,即以整数形式存放。小写字母a对应的ASCII码是97,经过计算n对应的ASCII值是110。

注:关于’\0nnn’:如果’\0’后面跟着不是’x’的字母就代表空字符;如果’\0’后面跟着’x’并且’x’后面跟着数字,表示十六进制数,算作一个字符;如果’\0’后面跟着数字表示八进制,算作一个字符

(4)字符串常量

存放形式:按串中的字符排列的次序顺序存放,每个字符占一个字节,并在末尾添加’\0’作为结束标记。

一个字符串常量表示存储的”数组“的首地址。

例题:

在这里插入图片描述

答案:D

思考题:若 char s[]=“\t\v\\0which\n”; cout<<sizeof(s);cout<<strlen(s);

注:sizeof计算的是所占的内存空间,这里计算的值为11,注意字符串末尾还有一个’\0’!!

​ 而strlen计算的是字符串的长度以’\0’为结束标志,因此计算的结果为3

符号常量

符号常量在使用之前一定要首先声明

声明语句:

const 数据类型说明符 常量名=常量值;

数据类型说明符 const 常量名=常量值;

注:符号常量在声明时一定要赋初值,而在程序中间不能改变其值。

例题:

在这里插入图片描述

答案:B。在定义常量时(非类成员常量),必须要在定义该常量时对其进行初始化,选项B没有对常量temp进行初始化,故应选择B。

自定义类型数据

enum枚举类型

  • 对枚举类型元素按常量处理,不能对题目赋值。
  • 枚举元素具有默认值,它们依次是:0,1,2,…
  • 也可以在声明时另行定义枚举元素的值
  • 枚举值可以进行关系运算
  • 整数值不能直接赋给枚举变量,如需要将整数赋值给枚举变量,应该进行强制类型转换

在这里插入图片描述

解析:C++中,定义枚举类型时,如果不指定枚举常量的值1,则以0开始依次递加,故NAME为0,NUMBER为1,由于PLUS显式指定为5,其后面的枚举常量将在该基础上依次递加1,故MINUS=6,PRINT显式指定为10。故本题答案应为A。

2、各种数据类型的定义方法

3、运算符的种类

基本运算符:+、-、*、/、%

注:%:只能用于整型操作数

​ /:当用于两个整型数据相除时,其结果取商的整数部分,小数部分自动被舍弃(不满足四舍五入规则)

自增自减运算符:++、–

注:自增运算符的操作数必须是变量,不能是常量或表达式!!

​ **++i返回的是i本身而i++返回的是数值。**因此++(++i)是正确的而(i–)--是错误的

例题:

在这里插入图片描述

答案:A

sizeof运算符:

作用:用于计算某种类型的对象再内存中所占的字节数。

在这里插入图片描述

答案:D !!!是x*y!!!!不是xy!!!!!

4、运算符优先级和结合性

在这里插入图片描述

5、不同类型数据间的转换与运算

隐式转换:

基本原则:将低类型数据转换为高类型数据(不遵循四舍五入原则)

显式转换:

形式:类型说明符(表达式)或(类型说明符)表达式

const_cast<类型说明符>(表达式)

dynamic_cast<类型说明符>(表达式)

reinterpret_cast<类型说明符>(表达式)

static_cast<类型说明符>(表达式)

㈡ 基本语句

【考试要求】

了解C语句的概念及种类;掌握C语言常用的输入/出方式。

【主要考点】

1、表达式语句、空语句、复合语句

表达式

  • 算数表达式

  • 赋值表达式

在这里插入图片描述

答案:D。d++没赋值符号,不是赋值运算!!!

  • 逗号表达式

    表达式1,表达式2

    求解顺序:先求表达式1,再求表达式2,最终结果为表达式2的值

  • 逻辑表达式

    逻辑表达式的结果类型为bool,值只能为true或false

  • 条件表达式

    表达式1?表达式2:表达式3

2、数据的输入与输出
3、输入输出函数printf、scanf的使用

函数prinf()的格式修饰符

  • l:修饰格式符d,o,x,u时,用于输出long型数据

  • L:修饰格式符f,g,e时,用于输出long double型数据

  • h:修饰格式符d,o,x时,用于输出short型数据

  • 输出域宽m(m为整数):

    若m为正整数,当输出数据宽度小于m时,在域内向右靠齐,左边多余位补空格;当输出数据宽度大于m时,按实际宽度全部输出;

    当m为负整数,则输出数据在域内向左靠齐

    若m有前导符0,则左边多余位补0。

  • 显示精度.n(n为大于等于0的整数)

    对于浮点数,用于指定输出的浮点数的小数位数。

    对于字符串,用于指定从字符串左侧开始截取的字串字符个数。

答案:C

㈢ 选择结构程序设计

【考试要求】

熟练掌握if…else的三种语法;领会switch与break语句的作用。

【主要考点】

1、 if语句

注:未配对的else与最近的未配对的if配对

答案:A

相当于:

void main()
{
	int a=0,b=1,c=0,d=20;
	if(a)
	{d=-10;}
	else if(!b)
	{
		if(!c){d=15;}
		else{d=25;}
	}
	cout<<d<<endl;
}

“一个人从哪里跌倒就再跌倒一次…”

这里相当于:

{
    if(a<b)
    {
        if(b<0) c=0;
        else c+=1;
    }
    cout<<c<<endl;
}
2、 switch语句

注:

  • switch语句后面的表达式可以是整型、字符型、枚举型
  • 每个常量表达式的值不能相同,但次序不影响执行结果
  • 每个case分支可以有多个语句,但不用{}
  • 每个case分支最后应该加一个break,否则会从入口点一直执行到switch结构的结束点
  • 当若干分支需要执行相同的操作时可以使多个case分支共用一组语句。
3、 选择结构的嵌套

㈣ 循环结构程序设计

【考试要求】

领会程序设计中构成循环的方法;掌握for、while、do-while语句的用法;了解break、continue在循环语句中的作用。

【主要考点】

1、for循环结构

2、while和do while循环结构

3、continue语句和break语句

break只能跳出一层循环。想要跳出多层循环可以用goto(不想找骂就最好别用)或者return语句。

4、循环的嵌套

㈤ 数组的定义和引用

【考试要求】

了解一维数组、二维数组的基本概念;掌握数组类型变量的定义与引用;掌握数组元素的引用。

【主要考点】

1、一维数组和多维数组的定义和初始化

定义:

数据类型  标识符 [常量表达式1][常量表达式2]……;

初始化:

//1.给数组内所有元素赋值
int a[3]={1,1,1};
int a[]={1,1,1};
//2.给数组内部分元素赋值
float fa[5]={1.0,2.0,3.0}
//注:当指定的初值个数小于数组大小时,剩下的数组元素会被赋予0值。
//若定义数组时没有指定任何一个元素的初值,
//对于静态生存期的数组每个元素都会被赋值为0
//但对于动态生存期的数组,每个元素的初值都是不确定的
int a[2][3]={1,0,0,0,1,0};
int a[][3]={1,0,0,0,1,0};
int a[2][3]={{1,0,0},{0,1,0}};

2、数组的引用

3、字符串与字符数组

4、字符串处理函数(strlen, strcpy, strcat, strcmp)

㈥ 函数

【考试要求】

掌握函数的定义与调用;掌握函数参数的传递方式;领会变量存储类型的概念及各种存储类型变量的生存期和有效范围;领会函数的嵌套调用与递归调用

【主要考点】

1、函数的定义方法

2、函数的类型和返回值

3、形式参数与实在参数;参数值的传递

易错:

在这里插入图片描述

答案:B 这道题目关键在f1(a+b,++b),执行这句话之前a=6,b=8;函数参数自右往左执行,即先执行++b,再执行a+b,所以相当于f1(6+9,9),故答案是15+1=16

4、函数的正确调用;嵌套调用和递归调用

5、内联函数和函数重载

(1)内联函数

内联函数不是在调用时发生控制转移,而是在编译时将一个函数体嵌入在每一个调用处。

内联函数应该是比较简单的函数,结构简单(没有循环等控制语句)、语句少(一般只为输出等)

定义:

inline 类型说明符 函数名(含类型说明的形参表)
{
	语句序列
}
(2)函数重载

两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据类型和形参类型及个数的最佳匹配,自动确定调用哪一个函数。

注:重载函数的形参必须不同:个数不同或类型不同(不同类型相同个数的形参组合的时候,顺序不同也能作为依据)

6、局部变量和全局变量

(1)局部变量

局部变量只在调用它所在的函数时才会生效,一旦函数返回后就会失效。

(2)全局变量

7、变量的存储类别和作用域

存储类别
静态生存期
动态生存期
作用域
1.函数原型作用域

在函数原型声明时形式参数的作用范围就是函数原型作用域

eg:

double area(double radius);
//radius的作用范围只在形参列表的左右括号之间
2.局部作用域
3.类作用域
4.命名空间作用域

具有命名空间作用域的变量也称为全局变量

5.外部变量

在这里插入图片描述

extern是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块或其他模块中使用,故extern int b;是一个声明不是定义。

㈦ 指针

【考试要求】

了解指针与地址的概念;掌握指针变量的定义、初始化及指针的运算;掌握指针与数组、指针数组、指针实现字符串等知识;了解指针与函数的概念。

【主要考点】

1、指针变量的定义和初始化

2、指针的赋值

3、指针的运算

4、指针与数组

下标为i的元素:*(数组名+i)

5、指针与字符串

一个字符串常量表示存储的”数组“的首地址。

在这里插入图片描述

答案:B。相当于比较“bcdef”和“b”。

6、指针用作函数参数

7、引用

引用是一种特殊类型的变量,可以被认为是另一个变量的别名,通过引用名与通过被引用的变量名访问变量的效果是一样的。

注:

  • 声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象

  • 一旦一个引用被初始化后,就不能改为指向其他对象。

8、引用作函数参数

实参就是形参,形参就是实参。

㈧ 结构与联合

【考试要求】

掌握结构体和联合体类型的说明、结构体和联合体变量的定义及初始化方法;掌握结构体与联合体变量成员的引用。

【主要考点】

1、结构体和联合体类型数据的定义方法和初始化

(1)结构体定义
struct 结构体名称
{
	共有成员
	protected:
	保护型类型
	private:
	私有成员
};
(2)联合体定义
union 联合体名称
{
	公有成员
protected:
	保护型成员
private:
	私有成员
};

3、结构体和联合体类型的说明及结构体类型变量的定义

结构体变量定义
类型名  变量名  = {成员数据1初值,成员数据2初值,...};

4、结构体和联合体变量的初始化

类型名 变量名={成员数据1初值,成员数据2初值,...}

5、结构体和联合体变量的引用

6、结构体数组

7、结构体和联合体发内存存储

(1)结构体

在这里插入图片描述

原因:结构体内存分配基于内存对齐概念

(2)联合体

联合体的全部数据成员共享同一组内存单元

㈨ 基本语句

【考试要求】

了解面向对象类和对象的概念;掌握构造、析构函数的定义和使用;类的继承性。

【主要考点】

1、类的创建和引用对象

注:在类的成员函数中,既可访问目的对象的私有成员,又可以访问当前类的其他对象的私有成员

类的组合

当创建类的对象时,如果这个类具有内嵌对象成员,那么各个内嵌对象将首先被自动创建。

在创建对象时既要对本类的基本类型数据成员进行初始化又要对内嵌对象成员进行初始化

类的静态成员
(1)静态数据成员

静态数据成员具有静态生存期

声明: static 类型说明符 数据成员名

访问方法:类名::标识符

注:在类中的定义中仅仅对静态数据成员进行引用性声明,必须在命名空间作用域的某个地方使用类名限定定义性声明

int Point::count=0;
(2)静态成员函数

声明: static 类型说明符 函数名(形参列表)

访问方式:

  1. 通过对象

    Person p;p.func();
    
  2. 通过类名

    Person::func()
    

注:静态成员函数可以直接访问该类的静态数据和函数成员,而访问非静态成员,必须通过对象名。

类的友元

注:

  • 友元的关系是单向的!

你把人家当朋友,但人家不一定把你当朋友。

  • 友元关系是不能传递的

你朋友的朋友不一定是你的朋友。

  • 友元关系是不被继承的

你爸爸的朋友不一定是你的朋友。

友元函数
class A{	......	friend 函数类型  函数名 (参数列表);	......}
友元类
class A{......friend class B;//声明B为A的友元类......}
常对象

常对象必须进行初始化,而且不能被更新。

const 类型说明符  对象名;
用const修饰的类成员
常成员函数
类型说明符  函数名(参数表) const;

注:

  • const是函数类型的一个组成部分,因此在函数的定义部分也要带const关键字。
  • 如果一个对象说明为常对象,则通过常对象只能调用它的长成员函数,而不能调用其他成员函数。
  • 常成员函数不能更新目的对象的数据成员,也不能针对目的对象调用该类中没有const修饰的成员函数。
  • const关键字可以用于对重载的区分。
    • 如果仅以const关键字作为区分对成员函数的重载,那么通过非const的对象调用该函数,编译器会优先选择不带const的函数。
常数据成员

如果在一个类中说明了常数据成员,那么任何函数中都不能对该成员赋值。构造函数对该数据成员进行初始化,只能通过初始化列表

常引用

常引用所引用的对象不能被更新

const 类型说明符 & 引用名;

2、构造函数与析构函数

(1)构造函数

构造函数的函数名与类名相同,而且没有返回值;构造函数会在对象被创建的时候被自动调用

(2)复制构造函数

被调用的情况:

  1. 当用类的一个对象去初始化该类的另一个对象时
  2. 如果函数的形参就是类的对象,调用函数时,进行实参和形参结合时
  3. 如果函数的返回值是类的对象,函数执行完成返回调用者时
深拷贝和浅拷贝
(3)析构函数

析构函数的名称由类名前面加“~”构成,没有返回值,且不接收任何参数

3、派生类的定义和访问权限

派生类的定义:
class 派生类名:继承方式  基类名1,继承方式  基类名2……,继承方式  基类名n{	派生类成员声明;};
访问权限:

(1)公有继承

(2)私有继承

(3)保护继承

4、派生类的构造和析构函数

(1)构造函数

构造派生类的对象时,就要对基类的成员对象和新增成员对象进行初始化

派生类构造函数一般语法:

派生类名::派生类名(参数表):基类名1(基类1初始化参数表),……,基类名n(基类n初始化列表),成员对象名1(成员对象1初始化参数表),……,成员对象名m(成员对象m初始化参数表){	派生类构造函数的其他初始化操作;}

如果对基类初始化时,需要调用基类的带有形参表的构造函数时,派生类就必须声明构造函数。

(2)析构函数

5、单一继承与多重继承

6、类型兼容规则

  • 派生类的对象可以隐含转换为基类对象
  • 派生类的对象可以初始化基类的引用
  • 派生类的指针可以隐含转换为基类的指针

在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员

7、虚基类

虚基类声明:

class 派生类名: virtual 继承方式 基类名

虚基类及其派生类的构造函数:

class Base0{public:	Base0(int var):var0(var){}	int var0;	void fun0(){cout<<"Member Of Base0"}<<endl;};class Base1:virtual public Base0{public:	Base1(int var):Base0(var){}	int var1;};class Base2:virtual public Base0{public:	Base2(int var):Base0(var){}	int var2;};class Derived:public Base1,public Base2{public:	Derived(int var):Base0(var)/*注意这里别忘了!!!一定要调用基类的构造函数!!*/,Base1(var),Base2(var){}	int var;	void fun(){cout<<"Member Of Derived"<<endl;}};int main(){	Derived d(1);	d.var=2;	d.fun();	return 0;}

注:建立一个对象时,如果这个对象中含有从虚基类继承来的成员,则虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。而且,只有最远派生类的构造函数会调用虚基类的构造函数

8、多态性

多态需要满足三个条件:

  1. 类之间满足赋值兼容
  2. 要声明虚函数
  3. 要由成员函数来调用或者是通过指针、引用来访问虚函数
运算符重载

运算符重载有两种方式:

1.重载为类成员函数
class A{public:......返回类型 operator重载的运算符(参数表);A  operator+(const A &a2) const;A  operator-(const A &a2) const;};A A::opetator+(const A &a2) const{}//以此类推
2.重载为非类成员函数(即友元函数)
class B{	public:	......	friend 返回类型 operator运算符(参数列表);	friend B operator+(const B &b1,const B &b2);	......};
虚函数

虚函数声明只能出现在类定义的函数原型声明中,而不能在成员函数实现的时候.

虚函数必须是非静态成员函数。

虚函数一般不声明为内联函数。

一般虚函数
//1.满足赋值兼容class Base1{public:	virtual void display() const;//2.声明虚函数};void Base1::display() const{	cout<<"";}class Derived:public Base1{public:void display() const;//一定要重写父类虚函数,不然该类仍为抽象类};void Derived::display() const{	cout<<"";}int main(){	Base1 *ptr;	Derived derived;	ptr=&derived;//3.父类的指针或引用指向子类对象	ptr->display();//由成员函数来调用或者是通过指针、引用来访问虚函数}
虚析构函数

㈩ 了解C++流的概念,掌握标准设备输入/输出函数的使用

【考试要求】

了解C++流的概念;掌握标准设备输入/输出函数的使用。

【主要考点】

1、文件类型指针

2、文件的打开与关闭

文件打开

fopen(文件名,打开方式)

文件关闭

3、文件的读写

按字符读写文件
按格式读写文件
按数据块读写文件

4、输入输出的控制格式

使用插入运算符和操纵符
1.输出宽度
cout.width(10);cout<<values[i]<<endl;cout.fill('*');cout<<setw(6)<<names[i]<<sew(10)<<values[i]<<endl;//setw只管后面紧跟着的域//setw和width都不截断数值。如果数位超过了指定宽度则全部显示。
2.对齐方式
cout<<setiosflags(ios_base::left)<<<setw(6)<<names[i];//setiosflags的影响是持久的,直到用resetiosflags重新恢复默认值为止
Logo

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

更多推荐