C第二版复习资料和模拟试题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1章C++的初步知识
1、cout必须与“<<”一起使用;cin要与“>>”配合使用。
2、用const定义常变量
const 数据类型常量名= 值;
3、在C++中,函数调用在前定义在后,必须进行原型说明。
函数类型函数名(参数表);
4、函数重载能实现编译时多态性
重载函数必须具有不同的参数个数,或不同的参数类型。
5、函数模板
template <typename T>
通用函数的定义
6、有默认参数的函数
如果一个函数有n个默认参数,则其调用方式就有n+1种。
若函数的定义在函数调用之前,应在函数定义中给出默认值;
若函数定义在函数调用之后,要在函数调用之前进行原形声明并指定默认参数。
7、变量的引用
int a; int &b = a; // b是变量a的“引用”,即a的别名
当引用作为函数的参数、函数的返回类型或作为类的数据成员时,说明引用时不可初始化。
引用与被引用的变量共享同一内存。
不能建立void类型的引用;不能建立引用的数组。
8、说明内置函数的关键字:inline
9、C++提供了string类型。
10、动态分配/撤销内存的运算符new和delete
int * pn = new int (123); delete pn
int * pnArr = new int [8]; delete [ ] pcArr;
第2章类和对象
1、任何一个对象都应当具有两个要素:属性和行为。
对象由一组属
性和一组行为构成。
在C++中,每个对象都是由数据和函数组成的。
2、面向对象程序设计语言应具有的要素:封装、继承、多态与抽象。
3、类是对象的抽象,对象是类的具体实例。
类是抽象的,不占内存。
对象是具体的,占有内存。
4、在C++中声明类的关键字是class。
在类中关键字private、protected
和public分别表明成员为私有的、保护的和公有的。
在C++中,声明类也可以使用关键字struct。
类的定义只是定义了一种结构,所以类中的任何数据成员均不能使用关键字extern、auto或register限定其存储类型。
定义类只是定义了一种数据类型,并不为类分配存储空间,所以,在类中定义数据成员时,不能对数据成员进行初始化。
5、对象= 算法+ 数据结构
程序= (对象+ 对象+ 对象+ …)+ 消息
6、在类体中定义的函数被自动当作内联成员函数。
说明成员函数为
内联函数的关键字是inline。
7、类成员的属性与可访问性
8、成员函数的代码不占用对象的存储空间。
9、对象成员的引用
Student sO, * pO = &sO;
Student & rs = sO;
cout << sO.Number( ) << ( ) << pO->Address( );
第3章关于类和对象的进一步讨论
1、构造函数
不能有返回值,不能指定函数类型;
可以带参数,可以重载,可以使用默认参数;
构造函数名为“类名”;
在构造对象时由系统自动调用;
构造函数的作用:在创建对象时,用给定的值对“对象”进行初始化。
2、局部对象、静态对象、全局对象的初始化
在定义局部对象时,每次都要调用构造函数;
对于静态对象,只在首次定义时调用构造函数;
对于全局对象,在main函数执行之前调用构造函数。
3、特殊的构造函数
默认构造函数:ClassName::ClassName( );
拷贝构造函数:ClassName :: ClassName( ClassName & );
转换构造函数:只有一个参数的构造函数
4、析构函数
函数名为“~类名”;
不能带参数,不能有返回值;
不能指定函数类型;
一个类最多只能定义一个析构函数;
在撤消对象时由系统自动调用。
5、构造函数和析构函数的调用顺序
先构造的后析构,后构造的先析构。
对于有对象成员的派生类,先调用基类的构造函数,然后调用对象成员的构造函数,最后调用本派生类的构造函数。
6、建立对象数组时,如果没有默认构造函数,就必须对各数组元素
初始化。
7、指向对象成员的指针
定义指向类中数据成员的指针变量:
<type> ClassName::* PointerName;
定义指向类中成员函数的指针变量:
<type> (ClassName::* PointerName)(<ArgsList>);
指向对象成员的指针变量不是类的成员。
8、this指针
9、建立动态对象要使用new运算符,会引起构造函数的调用;释放
动态对象要使用delete运算符,会引起析构函数的调用。
10、对象的赋值
对象名1 = 对象名2;
11、对象的复制
类名对象2(对象1);
类名对象2=对象1;
会调用拷贝构造函数。
12、静态成员
说明静态成员的关键字是static;
类的静态成员不专属于类的某个对象;
调用方式:类名::静态成员
类的静态数据成员是静态分配存储空间的,而其它数据成员是动态分配存储空间的。
必须在文件作用域内,对静态数据成员作一次且只能作一次定义性说明。
当静态成员函数的实现部分放在类声明之外时,它的前面不能加static。
不能把静态成员函数定义为虚函数。
13、友元函数
是一种在类中说明但定义在类外的能访问类中私有成员和保护成员的函数。
友元函数不是类的成员函数。
说明友元函数或友元类的关键字是friend。
友元函数必须在类中说明,其函数体放在类中定义或类外定义均可。
友元函数不受类中访问权限关键字的限制。
14、说明类模板的头与说明函数模板的头是相同的。
template <class T>
class TAnyTemp { /*…*/ };
TAnyTemp<int> iObject(实参表);
第4章运算符重载
1、运算符重载实际上是运算符函数的重载。
2、运算符重载函数的函数名为“operator 运算符”
<函数类型> operator <运算符> (形参表);
3、在C++中不允许重载的运算符
. .* :: sizeof ?:
4、运算符函数可以重载为类的成员函数或友元函数。
<类名> operator <运算符> (<参数表>);
friend <类型说明> operator <运算符> (<参数表>);
只能重载为类成员函数的运算符:= ( ) [ ] ->
运算符重载函数不能使用默认参数。
“=”和“&”运算符不必重载。
5、对于双目运算符,重载为成员函数时只有一个参数,另一个被隐
含;重载为友元函数时有两个参数,没有隐含参数。
6、重载单目运算符++、--
ClassName operator ++ ( );
ClassName operator ++ (int);
friend ClassName operator -- (ClassName);
friend ClassName operator -- (ClassName, int);
ClassName cO(…);
“++cO”被系统解释为“cO.operator ++( )”。
“--cO”被系统解释为“operator -- (cO)”
7、流插入运算符和流提取运算符只能重载为友元运算符
friend ostream & operator >> (ostream &, 类名&);
friend istream & operator >> (istream &, 类名&);
8、类型转换函数只能是成员函数。
转换函数的操作数是对象。
ClassName :: operator <type> ( );
第5章继承与派生
1、派生类从基类那里获得了基类的已有特性的现象称为类的继承
继承机制是重复利用程序资源的一种途径。
从已有的类(基类)产生一个新的类(派生类),称为类的派生。
2、派生类的声明方式
class 派生类名: [继承方式] 基类名
{ 派生类新增加的成员};
3、派生类成员的访问属性
1)公有派生时,基类的public成员在派生类中仍然是公有的;基
类的protected成员在派生类中仍然是保护的;基类的private
成员在派生类中是不可访问的。
2)私有派生时,基类中的公有成员和保护成员在派生类中均变为
私有的;基类中的私有成员在派生类中是不可访问的。
3)保护派生时,基类中的公有成员和保护成员在派生类中均变为
保护的;基类中的私有成员在派生类中是不可访问的。
4、可以对派生类所做的变化
1)可以继承基类的成员
2)可以增加新的成员
3)可以重新定义已有的成员函数
4)可以改变现有成员的属性
5、简单的派生类的构造函数
派生类构造函数名(总参数表) :基类构造函数名(参数表)
{ /*派生类中新增数据成员初始化语句*/ }
6、有子对象的派生类的构造函数
派生类构造函数名(总参数表)
: 基类构造函数名(参数表), 子对象名(参数表) { /*派生类中新增数据成员初始化语句*/ }
7、多层派生时的初始化顺序
1)先初始化间接基类的数据成员;
2)再初始化直接基类的数据成员;
3)最后初始化派生类的数据成员。
8、如果在基类中没有定义构造函数或定义了无参数的构造函数,则
可在派生类构造函数的初始化表中不写基类的构造函数名。
9、派生类不能继承基类的构造函数和析构函数。
10、声明多重继承类:
class D : public A, private B, protected C
{ /*类D新增加的成员*/ }
11、多重继承可能引起二义性;可用成员名限定消除二义性
12、要消除共同基类中多份继承的成员,可以使用虚基类
class 派生类名: virtual 继承方式基类名
如果在虚基类中定义了带参数的构造函数,而且没有定义默认构造函数,则必须在所有的派生类中通过构造函数的初始化表对虚
基类进行初始化。
13、赋值兼容规则
在公有派生的情况下,一个派生类的对象可以作为基类对象来使用的地方。
1)派生类的对象可以赋给基类的对象
2)派生类的对象可以初始化基类的引用
3)派生类的对象的地址可以赋给指向基类的指针
14、类的组合
在一个类中以其他类的对象作数据成员的情况称为类的组合。
第6章多态性与虚函数
1、编译时的多态性是通过函数重载实现的;而运行时多态性要借助
于虚函数。
2、可以在程序运行时通过调用同名函数以实现不同功能的函数称为
虚函数
virtual <type> FuncName(<ArgList>);
3、虚函数允许在派生类中重新定义与基类同名的函数,并且可以通
过基类的指针去访问派生类中的同名函数。
当在基类中把成员函数定义为虚函数时,在其派生类中定义的虚函数必须与基类中的虚函数同名,参数的类型、顺序、参数
的个数必须一一对应,函数返回值的类型也要相同。
若函数名
相同,但参数的个数不同或者参数的类型不同时,则属于函数
的重载而非虚函数。
必须使基类类型的指针变量指向派生类对象,并通过该指针调用它所指向的虚函数才能实现运行时的多态性。
虚函数必须是类的一个成员函数,不能是友元函数,也不能是静态成员函数。
可将析构函数定义为虚函数,但不能将构造函数定义为虚函数。
调用虚函数比调用一般成员函数的执行速度要慢一些。
4、纯虚函数
virtual <类型> <纯虚函数名> (<参数表>) = 0;
5、抽象类
包含纯虚函数的类称为抽象类;
抽象类的唯一用途是作为基类去派生其他类;
纯虚函数的作用是作为派生类中成员函数的基础,并实现动态多态性;
不能说明抽象类的对象。
第7章输入输出流
1、C++的I/O操作是可扩展的,可以用于用户自定义类型的数据。
2、在内存中为每一个数据流开辟一个内存缓冲区
当用cout和流插入运算符“<<”向显示器输出数据时,先将这些数据送到程序的输出缓冲区保存,直到输出缓冲区满或遇到endl时,才将缓冲区中的全部数据送到显示器显示出来。
在输入的时候,从键盘输入的数据先放到键盘缓冲区,当按回车键时,键盘缓冲区中的数据输入到程序的输入缓冲区,形成cin流,然后用流提取运算符“>>”从输入缓冲区中提取数据送给相应的变量。
3、格式输出
1)使用控制符控制输出格式;(表7.3)
2)用流对象的成员函数控制输出格式。
(表7.4和表7.5)
4、遇到无效字符或遇到文件结束符时,输入流cin就处于出错状态,
对cin流的所有提取操作都将终止。
5、输入流cin的成员函数
get getline eof peek putback gnore …
6、文件流类:ifstream ofstream fstream
7、使用文件流对象的open函数打开文件,关闭则用close
ifstream infile;
infile.open("myfile1.txt");
infile.close();
ofstream outfile;
outfile.open("myfile2.txt");
outfile.close();
fstream file1, file2;
file1.open("file1.txt", ios::in);
file2.open("file2.txt", ios::out);
——文件输入输出方式设置值参考表7.6。
8、对ASCII文件的操作
将文件类对象看成键盘和显示器:
outfile << x; outfile.put(ch);
infile >> x; infile.get(ch);
9、对二进制文件的操作
用成员函数read和write读写二进制文件;
与文件指针有关的流成员函数:
输入文件:tellg seekg 输出文件:tellp seekp infile.seekg(int, ios::_dir); outfile.seekp(int, ios::_dir);
_dir: beg-文件头cur-当前位置e nd-文件尾
第8章C++工具
1、程序中常见的错误:语法错误和运行错误
2、C++处理异常的机制是采用try-catch结构
try
{ 被检查的语句}
catch(异常信息类型[变量名])
{ 进行异常处理的语句}
3、使用命名空间可以避免同名冲突
4、命名空间是一个由程序设计者命名的内存区域
namespace myNameSpace
{
…
}
5、使用命名空间成员的方法:命名空间::命名空间成员名
6、使用标准命名空间std:using namespace std;
题型
1、选择填空(20×1=20分)
2、单项选择(5×2=10)
3、改错(2×5=10分)
4、分析程序输出(4 5=20)
5、完成程序(10+15+15=40)
例题
1、指出并改正下列类说明中的错误。
class ClassN
{
private:
int nmember;
ClassN pmember;
public:
ClassN( );
int ClassN(int x);
}
2、指出并改正下面程序中的错误。
void main()
{
char c[] = new char [20];
delete c;
}
3、分析下面的程序并给出运行结果。
#include <iostream>
using namespace std;
class MyN
{
private:
int x;
public:
MyN(int y) { x=y; }
operator int( ) { return x; }
};
void main()
{
MyN obj(188);
int i = obj;
i += 100;
cout<<i+obj<<endl;
}
4、分析下列程序,写出程序的运行结果。
#include <iostream>
using namespace std;
class CN
{
private:
int n;
public:
CN(int a=0)
{
n=a;
}
virtual void Show( ) const { cout<<"In CN n="<<n<<endl; } };
class CD:public CN
{
private:
int n;
public:
CD(int a, int b=0) : CN(a), n(b) { }
void Show( ) const { cout<<"In CD n="<<n<<endl; }
};
void main()
{
CN ca, cb(11), *pco;
CD da(12, 13);
pco = &ca;
pco->Show( );
pco = &cb;
pco->Show( );
pco = &da;
pco->Show( );
pco->CN::Show(); }。