2019年12月23日6时3分1C++面向对象程序设计普通高等教育“十一五”国家级规划教材中国高等院校计算机基础教育课程体系规划教材湖南工业大学计算机与通信学院2019年12月23日6时3分2课程总结与答疑1授课内容课程总结与答疑。主要内容:1)面向对象程序设计课程总结;2)课程答疑。2019年12月23日6时3分32.课程总结(1)C++基础A.基本语句。B.函数。C.数组。D.指针。E.结构体。F.程序编写。2019年12月23日6时3分42.课程总结(2)面向对象程序设计A.概念。B.特点。C.类和对象的定义。D.类的构造函数、析构函数、、静态成员。E.友元函数。F.运算重栽。G.继承与派生。I.多态性和虚函数。2019年12月23日6时3分5C++对C的函数的扩充及使用内置函数函数的重载概念,特点函数重载的主要作用是什么?函数重载时参数个数不同时,能否有缺省参数,为什么?有默认参数的函数一个函数不能既作为重载函数,又作为有默认参数的函数实参与形参的结合是从左至右顺序进行的。函数的递归调用2019年12月23日6时3分6C++变量的引用及指针的使用有两个与指针变量有关的运算符:(1)&取地址运算符。(2)*指针运算符指针作为函数参数数组与指针p=&a[0];和p=a;等价(1)p+i和a+i就是a[i]的地址(2)*(p+i)是p+i所指向的数组元素,即a[i]。返回指针值的函数类型名*函数名(参数表列);指向含n个元素的一维数组的指针变量:int(*p)[n];const指针关键字const放在指针类型前,是指向常量的指针。关键字const放在“*”号和指针名之间,是常指针。引用:数据类型&引用名=被引用的变量名引用作为函数参数分配内存与释放内存new/deletep/delete[]p2019年12月23日6时3分7类和对象面向对象程序设计的基本特征面向对象及面向过程类和结构体类型的异同在类外定义成员函数必须在函数名前面加上类名和作用域限定符“∷”。构造函数和析构函数作用,特征构造函数的种类,构造函数的重载参数初始化表对数据成员初始化调用构造函数和析构函数的顺序对象数组指向对象成员函数的指针this指针2019年12月23日6时3分8友元函数及静态成员常对象对象的常成员,包括:常数据成员和常成员函数指向对象的常指针类名*const指针变量名;指向常对象的指针const类型名*指针变量名;静态成员静态数据成员特点静态成员函数友元:什么是友元函数?为什么使用友元?定义格式:(a)友元函数是普通函数friend函数返回值类型友元函数名(参数);(b)友元函数是另一个类中的成员函数friend函数返回值类型类名∷友元函数名(参数);2019年12月23日6时3分9运算符重载什么是运算符重载,本质是什么重载运算符的规则运算符重载函数作为类成员函数和友元函数双目和单目运算符重载重载流插入运算符和流提取运算符2019年12月23日6时3分10继承与派生单继承、多继承概念派生类的构成派生类成员的访问属性派生类的构造函数和析构函数有子对象的派生类的构造函数派生类的析构函数构造函数、析构函数调用的顺序在C++中,继承的方式由哪几种?如果不显式地给出继承方式关键字,系统默认的是什么继承方式?在不同的继承方式下,派生类自身及其使用者对基类的访问控制权限是否相同?2019年12月23日6时3分11多重继承的含义、定义方法和实现多重继承引起的二义性问题虚基类的定义及其作用基类与派生类的转换(兼容赋值规则)2019年12月23日6时3分12多态性与虚函数什么是多态性?在C++中有哪些多态性?静态多态通过函数的重载实现动态多态性通过虚函数实现虚函数的定义及作用使用虚函数时要注意两点:只能用virtual声明类的成员函数,使它成为虚函数,而不能将类外的普通函数声明为虚函数。一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数。虚析构函数2019年12月23日6时3分13纯虚函数的概念、特点及应用抽象类的概念及应用2019年12月23日6时3分14输入输出流和C++工具文件系统的概念,包括文件指针和关于文件的操作;文件类的定义和相关操作的定义、使用方法进行文件的打开、关闭、读写、定位等操作2019年12月23日6时3分153.讲解的例子以前几届的期末考题为例讲解几个程序。2019年12月23日6时3分164.课堂练习1、写出下列程序的运行结果:()#includeiostream.hclassB{public:virtualintf(){return50;}};classD:publicB{public:intf(){return100;}};voidmain(){Dd;B&b=d,b2,*p;coutd.f()endl;coutb.f()endl;coutb.B::f()endl;p=&d;coutp-f()endl;p=&b2;coutp-f()endl;}10010050100502019年12月23日6时3分175.课后练习1、写出下列程序的运行结果:#includeiostream.hclassA{public:virtualvoidact1();voidact2(){act1();}};voidA::act1(){cout“A::act1()called.”endl;}classB:publicA{public:voidact1();};voidB::act1(){coutB::act1()called.endl;}voidmain(){Bb;b.act2();b.A::act1();b.B::act1();}B::act1()called.A::act1()called.B::act1()called.2019年12月23日6时3分18阅读下面的程序,写出程序运行的结果。#includeiostream.hclassA{intx;public:A(intx=0){this-x=x;cout调用构造函数Axendl;}virtualvoidf(){coutxendl;}~A(){cout调用析构函数Aendl;}};classB:publicA{inty;public:B(intx,inty=1):A(x){this-y=y;cout调用构造函数Byendl;}voidf(inta){coutyendl;}~B(){cout调用析构函数Bendl;}};voidmain(){A*pa=newB(2,3);pa-f();deletepa;}2019年12月23日6时3分19#includeiostream.hclasscount{staticintn;public:count(){n++;}voidshow(){coutnendl;}~count(){coutnendl;n--;}};intcount::n=0;voidmain(){countb[4];}2019年12月23日6时3分20判断:A.每个对象也有地址,该地址就是存储此对象数据成员的单元的首地址。()B.如果在一个类的对象之间要进行数据交换,可以使用该类的静态数据成员来完成。()C.类的析构函数一般都声明为虚函数。()√√√2019年12月23日6时3分211)关于友元函数的描述中,错误的是A.友元函数只能访问类中私有成员B.友元函数不是成员函数C.友元函数破坏隐藏性,尽量少用D.友元函数说明在类体内,使用关键字friend2)关于常成员的描述中,错误的是A.常成员包含常数据成员和常成员函数两种B.常数据成员必须是公有的C.常数据成员要使用构造函数成员初始化列表进行初始化D.常对象只能调用它的常成员函数,不能调用其它的成员函数3)对重载函数形参的描述中,错误的是A.参数的个数可能不同B.参数的类型可能不同C.参数的顺序可能不同D.参数的个数、类型、顺序都相同,只是函数的返回值类型不同ABD2019年12月23日6时3分22