您好,欢迎访问三七文档
C++简答题(1)叙述机器语言、汇编语言、高级语言的特点。答:机器语言是计算机直接执行的语言,有二进制的0和1构成的一系列指令组成;汇编语言是机器语言的助记符;高级语言是接近人的自然语言习惯的编程语言,通过编译变成机器语言。(2)结构化语言与面向对象语言是截然分开的吗?答:不是截然分开的,面向对象的程序设计中也包含过程,含有结构化的思想。(3)如何讲一个C++源程序变成可执行程序?产生的各类文件的扩展名是什么?答:通过编译变成带扩展名.obj目标文件;再通过链接变成带扩展名.exe的可执行文件。(1)类和数据类型有何关系?答:类相当于一种包含函数的自定义数据类型,它不占内存空间,是一个抽象的“虚”体,使用已定义的类建立对象就像用数据类型定义变量一样。对象建立后,对象占据内存,变成了一个“实”体。类和对象的关系就像数据类型和变量的关系一样。其实,一个变量就是一个简单的不含成员函数的数据对象。(2)类和对象的内存分配关系如何?答:为节省内存,编译器在创建对象时,只为个对象分配用于保存各对象的数据成员初始化的值,并不为各对象的成员函数分配单独的内存空间,而是共享类的成员函数定义,即类中成员函数的定义为该类的所有对象所共享,这是C++编译器创建对象的一种方法,在实际应用中,我们仍然要将对象理解为有数据成员和函数成员两部分组成。(3)什么是浅拷贝、深拷贝?二者有何异同?答:构造函数用于建立对象时给对象赋初始值以初始化新建立对象。如果有一个现存的对象,在建立新对象时希望用现存对象作为新建对象的初始值,即用一个已存在的对象去初始化一个新建立的对象。C++提供的拷贝构造函数由于在建立对象时将以存在对象的数据成员值复制给新对象,以初始化新对象。拷贝构造函数在用类的一个对象去初始化该类的另一个对象时调用,以下3种情况相当于用一个已存在的对象去初始化新建立对象,因此,调用拷贝构造函数:①当用一个类的对象去初始化该类的另一个对象时。②如果函数的形参是类的对象,调用函数时,将对象作为函数实参传递给函数的形参时。③如果函数的返回值是类的对象,函数执行完成,将返回值返回时。原因在于默认的拷贝构造函数实现的只能是浅拷贝,即直接将原数据成员的值依次复制给新对象中对应的数据成员,并没有为新对象另外分配内存资源。这样,如果对象的数据成员是指针,两个指针对象实际上指向的是同一块内存空间。当类数据成员中有指针类型时,我们就必须定义一个特定的拷贝构造函数,该拷贝构造函数不仅能够实现原对象和新对象之间数据成员的复制,而且可以为新对象分配单独的内存资源,这就是深拷贝构造函数。(4)什么是this指针?它的作用是什么?答:一个类成员函数中,有时希望引用调用它的对象,对此,C++采用隐含的this指针来实现。This指针是一个系统预定义的特殊指针,指向当前对象,表示当前对象的地址。系统用this指针明确指出成员函数当前操作的数据成员所属的对象。实际上,当一个对象调用其成员函数时,编译器先将该对象的地址赋给this指针,然后调用成员函数,这样成员函数对对象的数据成员进行操作时,就隐含使用了this指针。一般而言,通常不直接使用this指针来引用对象成员,但在某些少数情况下,可以使用this指针,如重载某些运算符以实现对象的连续赋值等。This指针不是调用对象的名称,而是指向调用对象的指针的名称。This的值不能改变,它总是指向当前调用对象。(5)C++中静态成员有何作用?它的特点?答:C++提供了静态成员,用以解决同一个类的不同对象之间数据成员和函数共享问题。静态成员的特点是:不管这个类创建了多少对象,其静态成员在内存中只保留一份副本,这个副本为该类的所有对象所共享。面向对象方法中还有类属性(classattribute)的概念,类属性是描述类的所有对象的共同特征的一个数据项,对于任何对象实例,它的属性值是相同的,C++通过静态数据成员来实现类属性。(6)友元关系有何性质?答:①友元关系是不能传递的,不能被继承。如B类是A类的友元,C类是B类的友元,C类和A类之间,如果没有声明,就没有任何友元关系,不能进行数据共享。②友元关系是单向的,不具交换性。如果声明B类是A类的友元,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有和保护数据。(1)派生类如何实现对基类私有成员的访问?答:无论使用任何一种继承方式,基类的私有成员都不允许被外部函数直接访问,也不允许派生类的成员函数直接访问,但是可以通过基类公有成员函数间接访问该类的私有成员。(2)什么是赋值兼容?它会带来什么问题?答:类型兼容是指在公有派生的情况下,一个派生类对象可以作为基类的对象来使用。类型兼容又称为类型赋值兼容后类型适应。在C++中,类型兼容主要指一下3种情况:①派生类对象可以赋值给基类对象。②派生类对象可以初始化基类的引用。③派生类对象的地址可以赋值给指向基类的指针。由于派生类对象中包含基类子对象,所以这种引用方式是安全的,但是这种方法只能引用从基类继承的成员。如果试图通过基类指针引用那些只有在派生类中才有的成员,编译器将会报告语法错误。(3)多重继承时,构造函数和析构函数的执行顺序是如何实现的?答:多继承时,构造函数的执行顺序是:先执行基类的构造函数,再执行对象成员构造函数,最后执行派生类的构造函数。在多个基类之间则严格按照派生类声明时从左到右的顺序来执行各基类的构造函数,而析构函数的执行顺序则正好与构造函数的执行顺序相反。(4)继承与组合之间的区别与联系是什么?答:继承描述的是一般类与特殊类的关系,类与类之间体现的是“isakindof”,即如果在逻辑上A是B的一种,允许A继承B的功能和属性。例如汽车(automobile)是交通工具(vehicle)的一种,小汽车(car)是汽车的一种。那么类automobile可以从类vehicle派生,类car可以从类vehicle派生。组合描述的是整体与部分的关系,类与类之间体现的是“isapartof”,即如果在逻辑上A是B的一部分,则允许A和其他数据成员组合为B。例如发动机、车轮、电池、车门、方向盘、底盘都是小汽车的一部分,它们组合成汽车。而不能说汽车式发动机的一部种。在C++中,类的继承与类的组合很相似,继承和组合既有区别,也有联系,主要表现在描述的关系不同。某些比较复杂的类,既需要使用继承,也需要使用组合,二者一起使用。在某些情况下,继承与组合的关系还可以互换。在多继承时,一个派生类有多个直接类,派生类实际上是所有基类属性和行为的组合。派生类是对基类的扩充,派生类成员一部分是从基类中来,因此派生类组合了基类。既然这样,派生类也可以通过组合类实现。什么时候使用继承,什么时候使用组合,要根据问题中类与类之间的具体关系,顺其自然,权衡考虑。(1)在C++中,能否声明虚构造函数?为什么?能否声明虚析构函数?为什么呢?答:在C++中,不能定义虚构造函数,因为当开始调用构造函数时,对象还未完成实例化,只有在构造完成后,对象才能成为一个类名副其实的对象;但析构函数可以是虚函数,而且通常声明为虚函数,既虚析构函数。(2)什么是抽象类?抽象类有何作用?可以声明抽象类对象吗?为什么?答:抽象类是一种特殊类,是为了抽象的目的而建立的,建立抽象类,就是为了通过它多态地使用其中的成员函数,为一个类组提供统一的操作界面。抽象类处于类层次的上层,一个抽象类自身无法实例化,也就是说我们无法声明一个抽象类的对象,而只能通过继承机制,生成抽象类的非抽象派生类,然后再实例化。(4)多态性和虚函数有何作用?答:虚函数(virtualfunction)允许函数调用与函数体之间的联系在运行时才建立,是实现动态联编的基础。动态联编则在程序运行的过程中,根据指针与引用实际指向的目标调用对应函数,也就是在程序运行时才决定如何动作。虚函数经过派生派生后,可以在类组中实现运行时的多态,充分体现了面向对象程序设计的动态多态性。(5)什么是纯虚函数?它有何作用?答:纯虚函数(purevirtualfunction)是一个在基类中声明的虚函数,它在该基类中没有定义具体实现,要求各派生类根据实际需要定义函数实现。纯虚构函数的作用是为派生类提供一个一致的接口。抽象类描述的是所有派生类的高度抽象的共性,这些高度抽象、无法具体化的共性就由纯虚函数来描述。带有纯虚函数的类被称为抽象类,一个抽象类至少具有一个纯虚函数。
本文标题:C++简答题1
链接地址:https://www.777doc.com/doc-1842684 .html