《C++程序设计》期末复习完全手册(直接使用版)_第1页
《C++程序设计》期末复习完全手册(直接使用版)_第2页
《C++程序设计》期末复习完全手册(直接使用版)_第3页
《C++程序设计》期末复习完全手册(直接使用版)_第4页
《C++程序设计》期末复习完全手册(直接使用版)_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《C++程序设计》期末复习完全手册(直接使用版)第一部分:考试题型与分值分布(通用)题型题量分值主要考查范围策略选择题20-25题20-30分语法规则、面向对象概念、访问控制、函数重载与覆盖辨析概念,牢记规则填空题10-15题10-15分程序完善、类成员定义、初始化列表、运算符重载形式根据上下文和功能要求填入完整语句程序阅读题3-5题15-20分构造函数调用顺序、继承与多态、虚函数机制、STL操作逐句模拟,画对象生命周期图程序填空题2-3题10-15分类定义、运算符重载、模板实现关注语法细节:分号、const、引用等编程题2-3题20-30分类的设计与实现、继承多态应用、运算符重载、模板先搭类框架再细化函数,注意const正确性第二部分:C++基础与C的扩展2.1C++程序基本结构#include<iostream>

usingnamespacestd;

intmain(){

cout<<"Hello"<<endl;

return0;

}头文件:<iostream>,<string>,<vector>等(不带.h)输入输出:cin和cout,配合>>和<<2.2命名空间避免名字冲突。使用usingnamespacestd;可省略std::。2.3新的数据类型与初始化C++新特性示例说明bool类型boolflag=true;取值为true或false引用(&)inta=10;int&b=a;b是a的别名,修改b即修改a,常用于函数参数变量随用随定义for(inti=0;i<10;i++)允许在循环内定义变量作用域限定符::::x访问全局变量当局部变量与全局变量同名时使用强制类型转换static_cast<int>(3.14)推荐替代C风格的(int)3.14第三部分:函数扩展速查3.1函数重载条件:函数名相同,参数列表不同(个数、类型或顺序),与返回值无关。intadd(inta,intb);

doubleadd(doublea,doubleb);3.2带默认参数的函数intsum(inta,intb=10);//默认值从右向左连续指定3.3内联函数在函数前加inline,提示编译器在调用点展开函数体,减小调用开销。通常适用于短小的函数。第四部分:类和对象(核心考点)4.1类定义与访问控制classClassName{

private://默认private

intx;

public:

voidsetX(intval);

intgetX()const;//常成员函数,不修改对象状态

};访问控制:private:仅类内部和友元可访问。public:任意位置可访问。protected:类内部、派生类和友元可访问。4.2构造函数与析构函数函数特点典型声明构造函数类名作为函数名,无返回值;对象创建时自动调用,可重载Student(intid,stringname);析构函数~类名(),无参数无返回值;对象销毁时自动调用,一般用于释放资源~Student();拷贝构造函数用同类对象初始化新对象时调用;参数为const类名&Student(constStudent&s);初始化列表:Student(intid,stringname):id(id),name(name){}

//效率高,尤其对于const成员、引用成员、对象成员必须使用构造顺序:基类构造→成员对象构造→本类构造体执行。析构与构造顺序相反。4.3拷贝构造函数的调用时机(常考)用已有对象初始化新对象:Students2=s1;值传递方式给函数传递对象参数。函数返回值为对象时(视编译器优化而定)。4.4this指针类的成员函数中隐含的指针,指向调用该函数的对象本身。常用于区分成员变量与参数重名:voidsetX(intx){this->x=x;}4.5静态成员静态成员说明静态数据成员所有对象共享,类外初始化:intClass::count=0;静态成员函数只能访问静态成员,通过类名调用:Class::func();4.6常成员与常对象常成员函数:intgetX()const;不能修改成员变量(除非mutable)。常对象:constStudents;只能调用常成员函数。4.7友元友元函数:非成员函数,可访问类的private和protected成员。声明在类内加friend。友元类:一个类是另一个类的友元,可访问其私有成员。第五部分:继承与派生速查5.1继承方式classDerived:publicBase{...};继承方式基类public成员基类protected成员基类private成员public继承仍为public仍为protected不可直接访问protected继承变为protected变为protected不可直接访问private继承变为private变为private不可直接访问最常用public继承,体现“是一个”关系。5.2派生类构造函数调用顺序基类构造函数→派生类新增成员对象构造函数→派生类构造函数体。5.3类型兼容规则派生类对象可以赋值给基类对象、基类指针或基类引用(即可以用基类指针指向派生类对象)。这是多态的基础。第六部分:多态与虚函数(重中之重)6.1虚函数基类中用virtual声明的函数,派生类中可重新定义(覆盖)。通过基类指针或引用调用时,根据实际对象类型调用相应函数版本。classBase{

public:

virtualvoidshow(){cout<<"Base";}

};

classDerived:publicBase{

public:

voidshow()override{cout<<"Derived";}//override可省略,但建议写

};注意:基类析构函数应声明为虚函数,防止派生类析构不完全。6.2纯虚函数与抽象类virtualvoidarea()=0;//纯虚函数包含纯虚函数的类是抽象类,不能实例化。派生类必须实现所有纯虚函数才能成为具体类。6.3虚函数表(原理了解)编译器为每个包含虚函数的类生成一个虚函数表(vtable),对象内含有一个指向该表的指针(vptr)。多态调用时通过vptr找到对应的函数地址。第七部分:运算符重载速查7.1重载规则只能重载已有的运算符,不能创造新运算符。不能改变操作数个数、优先级和结合性。一般作为类的成员函数(左操作数为当前对象),或友元函数(例如<<重载)。7.2常用重载形式运算符成员函数形式友元函数形式+,-,*,/Aoperator+(constA&other)const;friendAoperator+(constA&a,constA&b);=(赋值)A&operator=(constA&other);注意自赋值检查只能为成员函数[]int&operator[](intindex);只能为成员函数++前置/后置前置:A&operator++();后置:Aoperator++(int);可友元<<,>>(流)成员形式左右操作数反了,通常用友元friendostream&operator<<(ostream&,constA&);第八部分:模板与STL速查8.1函数模板template<typenameT>

Tmax(Ta,Tb){

returna>b?a:b;

}调用:max<int>(3,5);或max(3,5);自动推导。8.2类模板template<classT>

classArray{

T*data;

public:

Array(intsize);

T&operator[](inti);

};实例化:Array<int>arr(10);8.3STL常用容器与操作容器特点常用操作vector动态数组,随机访问快push_back(),pop_back(),size(),clear(),[],at()string字符串,操作丰富length(),substr(),find(),replace(),+,==list双向链表,插入删除快push_back(),push_front(),insert(),remove()map<K,V>键值对,按键自动排序insert(make_pair(k,v)),[key],find(),erase()set集合,元素唯一排序insert(),erase(),find(),count()迭代器:vector<int>v={1,2,3};

for(autoit=v.begin();it!=v.end();++it)

cout<<*it;

//范围for:for(intx:v)cout<<x;第九部分:输入输出流速查9.1标准输入输出inta;cin>>a;

cout<<"a="<<a<<endl;状态控制:cin>>遇到空白(空格、回车等)停止。读取一行:getline(cin,str);读取单个字符:cin.get(ch);9.2格式化输出(需头文件<iomanip>)函数/操控符作用示例setw(n)设置输出宽度cout<<setw(5)<<123;setprecision(n)设置浮点精度cout<<setprecision(3)<<3.1415;fixed定点小数显示cout<<fixed<<3.1415;left/right左/右对齐cout<<left<<setw(10)<<"abc";9.3文件流#include<fstream>

ofstreamfout("data.txt");//写文件

fout<<"Hello"<<endl;//类似cout

fout.close();

ifstreamfin("data.txt");//读文件

stringline;

while(getline(fin,line))

cout<<line<<endl;

fin.close();第十部分:高频选择题题库(40题)模块一:基础与扩展题号题目选项A选项B选项C选项D答案1C++中,用于标准输入的对象是coutcincerrclogB2下列哪个不是C++新增的关键字intclassvirtualfriendA3在C++中,函数重载取决于返回值类型不同参数个数和类型不同函数名不同形参名字不同B4下列正确的引用定义是int&r;int&r=10;inta=5;int&r=a;int*r=&a;C5在C++中,关于bool型变量的正确说法是占用4个字节只有0和1两种取值取值为true和false不能参加算术运算C模块二:类与对象题号题目选项A选项B选项C选项D答案6类的构造函数被自动调用的时机是定义类时创建对象时调用成员函数时程序结束时B7关于析构函数,说法正确的是不能有参数可以有多个可以有返回值必须用户定义A8对常成员函数的正确描述是只能修改常数据成员不能修改任何数据成员可以修改静态数据成员只能被常对象调用B(除非数据成员是mutable)9静态数据成员初始化必须在构造函数内类体内类外进行主函数中C10拷贝构造函数在以下哪种情况下不会被调用用一个对象初始化另一个对象对象作为函数参数按值传递函数返回对象对象作为函数参数按引用传递D11this指针的类型是指向类的常指针指向类的指针类的引用类本身A(ClassName*constthis)模块三:继承题号题目选项A选项B选项C选项D答案12在public继承中,基类的protected成员在派生类中变为private变为protected变为public不可访问B13派生类对象构造时,执行顺序是派生类构造→基类构造基类构造→派生类构造成员对象构造→基类构造无固定顺序B14派生类可以访问基类中的public和protected成员private成员所有成员仅public成员A模块四:多态与虚函数题号题目选项A选项B选项C选项D答案15实现运行时多态必须使用函数重载虚函数+基类指针或引用模板继承B16关于虚函数描述正确的是不能是析构函数在派生类中必须重新定义在基类中用virtual声明不能用基类指针调用C17含有纯虚函数的类称为虚基类抽象类具体类友元类B18要使派生类通过基类指针正确释放,基类析构函数应不写声明为虚函数声明为纯虚函数声明为静态B模块五:运算符重载与友元题号题目选项A选项B选项C选项D答案19下列运算符中,只能重载为成员函数的是+=<<>B20重载流插入运算符<<一般使用成员函数友元函数全局普通函数内联函数B模块六:模板与STL题号题目选项A选项B选项C选项D答案21函数模板定义时使用的关键字是classtypenametemplate以上两项对D(template或template)22vector容器的特点不包括动态大小随机访问在任意位置快速插入删除尾部添加元素快C23要使用string类需要包含的头文件是<string.h>C24map容器中存储的元素是单一值键值对(pair)链表节点树节点B第十一部分:程序阅读题示例例题1(构造与析构顺序):#include<iostream>

usingnamespacestd;

classA{public:

A(){cout<<"A";}

~A(){cout<<"~A";}

};

classB:publicA{public:

B(){cout<<"B";}

~B(){cout<<"~B";}

};

intmain(){

Bb;

return0;

}输出:AB~B~A例题2(虚函数多态):#include<iostream>

usingnamespacestd;

classBase{public:

virtualvoidf(){cout<<"Base";}

};

classDerived:publicBase{public:

voidf(){cout<<"Derived";}

};

voidshow(Base&b){b.f();}

intmain(){

Derivedd;

show(d);

return0;

}输出:Derived例题3(静态成员):#include<iostream>

usingnamespacestd;

classC{public:

staticintcount;

C(){count++;}

};

intC::count=0;

intmain(){

Ca,b,c;

cout<<C::count;

return0;

}输出:3例题4(运算符重载):#include<iostream>

usingnamespacestd;

classPoint{intx,y;public:

Point(inta,intb):x(a),y(b){}

Pointoperator+(constPoint&p){

returnPoint(x+p.x,y+p.y);

}

voidshow(){cout<<x<<","<<y;}

};

intmain(){

Pointp1(1,2),p2(3,4);

Pointp3=p1+p2;

p3.show();

return0;

}输出:4,6例题5(模板函数):#include<iostream>

usingnamespacestd;

template<typenameT>

Tadd(Ta,Tb){returna+b;}

intmain(){

cout<<add(3,4)<<""<<add(3.1,2.9);

return0;

}输出:76(注意3.1+2.9=6.0,cout默认不带小数末尾零,可能输出6)第十二部分:程序填空题示例例题1:设计一个圆类,计算面积classCircle{

private:

doubleradius;

public:

Circle(doubler):radius(r){}

doublearea()____①____{return3.14*radius*radius;}

};答案:①const例题2:用继承实现动物类及其叫声classAnimal{

public:

____①____voidspeak()=0;

};

classDog:publicAnimal{

public:

voidspeak()____②____{cout<<"Woof";}

};答案:①virtual②override例题3:重载加法运算符classVector{

intx,y;

public:

Vector(inta,intb):x(a),y(b){}

Vectoroperator+(constVector&v){

return____①____;

}

};答案:①Vector(x+v.x,y+v.y)例题4:模板排序函数(升序)template<____①____>

voidsort(Tarr[],intn){

for(inti=0;i<n-1;i++)

for(intj=i+1;j<n;j++)

if(____②____){

Ttemp=arr[i];

arr[i]=arr[j];

arr[j]=temp;

}

}答案:①typenameT或classT②arr[i]>arr[j]第十三部分:编程题示例例题1:设计一个学生类,包含姓名和成绩,计算平均分#include<iostream>

#include<string>

#include<vector>

usingnamespacestd;

classStudent{

stringname;

doublescore;

public:

Student(stringn,doubles):name(n),score(s){}

doublegetScore()const{returnscore;}

};

intmain(){

vector<Student>cls;

cls.push_back(Student("张三",85));

cls.push_back(Student("李四",92));

cls.push_back(Student("王五",78.5));

doublesum=0;

for(constauto&stu:cls)

sum+=stu.getScore();

cout<<"平均分:"<<sum/cls.size()<<endl;

return0;

}例题2:实现一个简单的继承多态——形状面积#include<iostream>

usingnamespacestd;

classShape{

public:

virtualdoublearea()const=0;

virtual~Shape(){}

};

classCircle:publicShape{

doubler;

public:

Circle(doubler):r(r){}

doublearea()constoverride{return3.14159*r*r;}

};

classRectangle:publicShape{

doublew,h;

public:

Rectangle(doublew,doubleh):w(w),h(h){}

doublearea()constoverride{returnw*h;}

};

voidprintArea(constShape&s){

cout<<"面积:"<<s.area()<<endl;

}

intmain(){

Circlec(2.0);

Rectangler(3.0,4.0);

printArea(c);

printArea(r);

return0;

}例题3:运算符重载——复数类#include<iostream>

usingnamespacestd;

classComplex{

doublereal,imag;

public:

Complex(doubler=0,doublei=0):real(r),imag(i){}

Complexoperator+(constComplex&c)const{

returnComplex(real+c.real,imag+c.imag);

}

friendostream&operator<<(ostream&os,constComplex&c){

os<<c.real<<"+"<<c.imag<<"i";

returnos;

}

};

intmain(){

Complexa(1,2),b(3,4);

cout<<a+b<<endl;//4+6i

return0;

}第十四部分:考前速记纸═══════════════════════════════════════════

C++程序设计考前速记

═══════════════════════════════════════════

【C++基础扩展】

bool(true/false)引用(&别名)重载(参数不同)

输入输出:cin>>cout<<getline(cin,str)

命名空间:usingnamespace

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论