以下问题为学生所提出的关于类与对象和继承性两章的问题及解答
1、 对象的理解及分类
在面向对象程序设计中,出现了类这个词,在C++中用class这个单词作为关键字来定义一个类,具体如何定义参见类定义的一般格式。在实际的应用过程中,为了方便我们的理解,可以这样对比来看:如果我们定义了一个就像在C语言程序设计中用struct关键字定义了一个结构,然后可以定义该结构的变量。
例如:我们定义这么一个结构,strcut mystruct {
//结构体;
}
那么,在程序或函数中,我们可以定义结构变量:
mystrcut t1,t2;在随后的程序中,可以操作该变量。
对类有类似的理解,我们定义了一个类,等同于定义了一个新的数据类型,其地位等同于内置数据类型如:int,char等。然后我们可以定义该数据类型的变量并在随后的程序或函数中使用该变量。
例如:定义类 class myclass {
//该类的数据成员和成员函数;
}
等价于我们定义了一个新的数据类型myclass,然后可以定义该数据类型的变量,如 myclass c1,c2,并在以后的程序中使用该变量。
在C++中,我们称该变量为类的实例或对象,换句话说,对象只是变量的另一个(面向对象)说法。
关于对象没有分类的说法。
2、多重继承如何理解,如何应用
在类的继承中,有单继承和多继承的概念,所谓单继承即派生类只有一个基类,而多继承中有两种说法,一种是多重继承,即有多个基类的派生方式,另一种是多层继承,所谓继承其实在单继承和多重继承均存在,即基类可以产生派生类,而该派生类又可以作为基类继续派生,产生其它的派生类,如此继续下去,一直到满足应用需求为止,这样形成的层次结构,称为多层继承。
关于继承的应用问题,重点在派生类的生成,即如何产生派生类。一旦派生类生成之后,该派生类的使用和一般定义的类的使用完全相同。
3、数据成员可以为公有吗?成员函数可以为私有吗?
数据成员可以为公有,其用法和公有成员函数相同,可以直接存取。在这样使用没有任何问题,但是在实际的应用中,我们的习惯用法是把数据成员作为私有,然后定义相应的成员函数对这些数据进行读取或设置,目的只有一个,完全实现数据的隔离,使外部对象或函数不能操作类的数据部分,使程序结构比较清晰。
私有的成员函数很常用,该成员函数只该类的内部使用,不对外开放。
4、拷贝构造函数何时被调用?
当生成新的对象时调用相应的构造函数。
5、拷贝构造函数与赋值运算符有何不同?
首先一点最重要的区别在于:一个是函数,一个是运算符。函数的调用过程比赋值过程要消耗更多系统资源。
第二点,可以使用已存在对象通过赋值形式产生新对象,此时调用的是该类的拷贝构造函数。
6、public和private的作用,公有类型和私有类型成员有何区别?
这两个关键字用于定义类的公有成员部分和私有成员部分,最终实现数据的封装,达到数据隐藏的目的。
公有成员和私有成员的区别在于:公有成员可以被该类的对象访问,而私有成员只能被该类的成员函数访问,外部对象不允许访问私有成员。访问私有部分的途径可通过定义该
类的友元函数或友元类来实现。
7、如果类A是类B的友元,类B是类C的友元,类D是类A的派生类,那么类B是类A的友元吗?类C是类A的友元吗?类D是类B的友元吗?
该问题的简单图示如下:
class B { class C { class D : public A {
friend A friend B //类D的其它成员
//其它成员; //其它成员; }
} }
关于友元问题,有一条规则可以全部概括,即:友元(不管是友元函数还是友元类)均不能传递,不可逆,不能继承,所以该问题的答案应该是很明确的。
8、静态成员变量可以为私有吗?
我们的习惯做法是把数据部分作为私有,静态成员变量也是如此。静态成员变量是相对于类而存在,它的初始化方式和使用方法也只针对于类名,与该类的对象名无关。
9、具有指针的构造函数怎样建立?
在构造函数中如果存在指针,其建立方式没有什么特别的地方,只是需要注意指针的操作,没有特别要求。另外,需要注意的是,如果构造函数中存在指针,特别以指针方式分配内存时,析购函数要重新定义对指针进行处理,不能使用缺省的析购函数。
10、构造函数和析构函数的区别?
该问题这两个函数的用途的理解以及用法。
结构体数组不能作为参数传递给函数从语法上讲,在构造函数内部可以完成相应的复杂操作,这种用法不会出现什么编译问题。但从习惯上,我们一般不要让构造函数太复杂的工作,而只是做一些初始化以及系统资源等相关问题。把复杂的计算工作提取出来作为成员函数来处理。构造函数可以根据重载函数的规则进行重载。
析购函数实现与构造函数相反的工作,主要完成一些系统清理与资源回收工作。由于析购函数不允许带参数,所以不能对析购函数进行重载。
根据情况,如果不需要进行特殊的初始化和资源分配,可以使用缺省的构造函数和析购函数,缺省情况的构造函数和析购函数由编译系统自动添加。一旦缺省情况满足不了要求,就要对这两个函数进行重新实现。
11、关于类与对象一章的总结
12、.CPP和.HPP的区别
.cpp C++标准的源程序后缀名
.hpp C++标准的头文件后缀名
13、在类的定义时,如何确定是要放在.h or .hpp or .cpp?它们分别代表什么意思?
.h C语言标准的头文件后缀名,另两个见问题12。
关于如何存放问题,没有规定,只有习惯做法。
一般做法:
如果正在开发的是很小的系统,没有必要分成多个文件存放,可以把类的声明及实现以及主程序放在同一个程序中,该程序以后缀名.cpp结尾。
如果正在从事相对比较大的系统开发,特别是在一个项目组中从事该项目的一部分工作时,在这种情况下,一些由该项目组所有成员公用的类的声明以及常量和全局变量的定义工作,由系统分析员完成并保存在相应的一个或多个(根据功能分类)以.hpp结尾的头文件中,由该项目组所有成员共享使用。使用方法:美个项目组成员在自己的系统模块中用include指令把所有有关的头文件包含进来。需注意的是使用时的语法问题,用#include <头文件名.hpp>这种方式使用,表示在开发系统(比如VC)标准的include路径中搜索相应的头文件,如使用”头文件名.hpp”方式,该头文件必须当前工作目录,否则,编译系统不到该文件。
相应的类的实现部分,在测试完成后,编译成相应的.obj文件,以库文件的方式存在,也可
以添加到标准的库文件当中去,但不建议这么做,最好形成自己的库文件,单独命名,保存到自己的当前工作目录,同时要对系统库的链接路径进行调整,或者对链接命令的命令行参数进行修改,以便在链接时能到自己专用的库文件。
最后,各成员即可在自己的模块中使用相应的头文件和库文件。
14、链表的相关知识
15、类的作用与结构
类主要用于实现对数据的封装,最终达到信息隐藏的目的。
16、友元成员(函数)、友元类的问题
类的私有成员不允许外部对象和函数进行访问,但是如果在某些特殊情况下(比如出于系统运行效率的考虑),确实需要外部函数访问类的私有成员,为了满足这些特殊需求,C++提供了友元函数和友元类来解决这个问题。在声明时,友元函数和可以放在宿主类的任何部分,存放位置对友元函数(类)的作用没有影响,因为设置它们的目的在于,这些
友元函数或友元类可以访问宿主类的任何部分的成员而不受存取权限的限制,但是友元函数和友元类不是宿主类的一部分,它们仍然是外部的,只是通过这种做法,赋予了它们特殊的权限而已。
17、静态成员有什么实际作用
静态成员有两个概念,一个是静态数据成员,另一个是静态成员函数,静态数据成员的含义是,表示在整个类中唯一的一份拷贝,该拷贝可以被同类的所有对象所共享,这是静态数据成员的作用。对静态数据成员来讲,由于只存在一份拷贝,所以在程序代码文件中提供其清楚的定义,其定义格式是:类名::静态数据成员名。也可以在定义时为其赋初值。在类成员函数内部存取静态数据成员与存取一般数据成员没什么区别。
静态数据成员的定义位置一般在类的声明之后预祝函数之前这个中间地带。
如果类的成员函数不存取任何非静态数据成员,可以把该函数声明为静态成员函数,声明方式是在函数名前加上static 关键字。静态成员函数同静态数据成员一样,不依赖于任何类的对象,它的调用方式是:类名::静态成员函数(参数表)。
另外,如果在类的声明外部定义静态成员函数,不需在前面再写关键字static。
18、关于派生方面,经过公有派生或私有派生,具体由哪些成员和函数可访问?哪些不可访问?
公有派生:基类的公有成员可被派生类的对象访问。
私有派生:基类的公有成员在派生类中变为私有,所以派生类的对象不能访问基类的任何成员,但是派生类的内部成员可以访问基类的公有成员。
19、类在定义时关键字public和private是否可以少写一个?
缺省时,按私有类型处理,所以私有部分可以省略private关键字。
20、C++的封装原理
C++的封装原理同任何面向对象技术的封装原理相同,都是为了实现信息隐藏。区别在于C++的实现语法,详细见建立类的一般格式。
21、将一个对象赋值给另一个对象时,多数情况下都是成功的,为何有指针时却出错?
最有可能的是,指针的处理不当。
22、两个对象之间的赋值,仅仅使这些对象中数据相同,而为什么两个对象仍然是分离的?
同普通变量的赋值类似,这两个对象所在的位置不同。
23、类的自引用
所谓类的自引用,即在声明类的成员的同时,某个或某些成员是该类的对象,这种使用方法在链表的声明与定义中经常见到。类似于对象成员,只不过其初始化调用的是自身的构造函数而已。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论