C++考研复试面试题

C++考研复试面试题,第1张

C++考研复试面试题总结
    • 第一章 面向对象程序设计概述
        • 1.什么是结构化程序设计方法?有哪些优点和缺点?
        • 2.什么面向对象程序设计方法?有哪些优点?
        • 3.面向对象与面向过程程序设计有哪些不同点?
        • 4.面向对象程序设计有哪些重要特征?
        • 5.什么是面向对象方法的封装性?它有何特点?
        • 6.面向对象程序设计为什么要应用继承机制?
        • 7.什么是面向对象程序设计中的多态性?
        • 8.什么是面向对象中的消息?一条消息由哪几部分组成?
        • 9.为什么说C++是混合型面向对象程序设计语言?
    • 第二章 C++基础
        • 1.什么是命名空间,如何访问命名空间的成员?
        • 2.什么是内联函数?它有什么特点?哪些函数可以定义为内联函数?哪些函数不可以定义为内联函数?
        • 3.什么是函数重载?在函数调用时,C++是如何匹配重载函数的?
        • 4.设置函数参数的默认值有何作用?
        • 5.什么叫引用?使用引用时需要注意哪些问题?
        • 6.new运算符的作用是什么?delete运算符的作用是什么?
    • 第三章 类和对象
        • 1.在类的定义中,包含几类成员?分别是什么?
        • 2.C++中类成员的访问控制权限有哪几种?各有何特点?
        • 3.什么是构造函数和析构函数?其作用各是什么?对构造函数和析构函数有哪些要求?
        • 4.在C++中,函数的参数传递有几方式?分别是什么?
        • 5.什么是this指针?它有什么作用?
        • 6.什么是拷贝构造函数?什么情况下调用此函数?
    • 第四章 类与对象的其他特性
        • 1.静态数据成员是一种什么样的数据成员类型?
        • 2.如何对静态数据成员进行初始化?
        • 3.类的友元有哪几种?
        • 4.对象有哪几种生存期?
        • 5.常量对象的特点是什么?
    • 第五章 继承与派生
        • 1.什么是继承性?
        • 2.C++的继承分为哪两类?
        • 3.试说明什么是虚基类,其有何用处。


        • 4.什么是同名覆盖?
        • 5.类的继承有几种方式?试比较各种继承方式派生类对基类成员的继承。


        • 6.什么是赋值兼容规则?
        • 7.什么是子类型?
        • 8.多继承中,在什么情况下会出现二义性?如何消除二义性?
        • 9.单继承中,派生类的构造函数的格式如何定义?
        • 10.多继承中,派生类的构造函数的格式如何定义?
        • 11.试说明派生类和基类之间存在什么样的关系?
    • 第六章 多态性
        • 1. 什么叫多态性?在C++中如何实现多态性?
        • 2.什么叫静态联编?什么叫动态联编?二者有何区别?
        • 3.什么叫抽象类?抽象类有何作用?抽象类的派生类是否一定要给出纯虚函数的实现?
    • 第七章 模版
        • 1.为什么使用模板?函数模板声明的一般形式是什么?
        • 2.什么是模板实参?什么是模板函数?
        • 3.什么是类模板?类模板声明的一般形式是什么?
        • 4.函数模板与同名的非模板函数重载时,调用的顺序是怎样的?

第一章 面向对象程序设计概述 1.什么是结构化程序设计方法?有哪些优点和缺点?

结构化(即面向过程)程序设计方法是指20世纪60年代开始出现的高级语言程序设计方法,由于采用了数据结构化、语句结构化、数据抽象和过程抽象等概念,使程序设计在符合客观事物与逻辑的基础上更进了一步。


结构化程序设计的思路是:自顶向下、逐步求精。


程序结构由具有一定功能的若干独立的基本模块(单元)组成,各模块之间形成一个树状结构,模块之间的关系比较简单,其功能相对独立,模块化通过子程序的方式实现。


结构化程序设计方法使高级语言程序设计开始变得普及,并促进了计算机技术的深入应用。


优点:结构化程序设计方法采用了自顶向下、逐步求精、模块分解、分而治之的方法,能有效地将各种复杂的任务分解为一系列相对容易实现的子任务,有利于软件开发和维护;

缺点:程序的数据和对数据的 *** 作相互分离,若数据结构改变,程序的大部分甚至所有相关的处理过程都要进行修改。


因此,对于开发大型程序具有一定的难度,软件的可重用性差,维护工作量大,不完全符合人类认识世界的客观规律。


2.什么面向对象程序设计方法?有哪些优点?

面向对象程序设计方法采用与客观世界相一致的方法设计软件,其设计方法是模拟人类习惯的思维方式,使软件开发的方法与过程尽可能接近人类认识世界、解决问题的方法与过程,从而使描述问题的问题空间(即问题域)与实现解法的解空间(即求解域)在结构上尽可能一致。


是一种运用对象、类、封装、继承、多态和消息等概念来构造、测试、重构软件的方法。


优点:面向对象程序设计方法使得开发的软件产品易重用、易修改、易测试、易维护、易扩充,降低了软件开发的复杂度。


达到了软件工程的3个主要目标:重用性、灵活性和扩展性。


适合大型的、复杂的软件开发。


3.面向对象与面向过程程序设计有哪些不同点?

面向过程就是分析出解决问题需要的步骤,然后用函数把这些步骤一个个实现,使用的时候依次调用,面向过程的核心是过程。



面向对象就是把构成问题的事物分解成一个个对象,建立对象不是为了实现一个步骤,而是为了描述某个事物在解决问题中的行为,面向对象的核心是对象。


在程序结构上,面向过程的程序主要由顺序结构、选择结构和循环结构组成,程序的基本单位是函数,程序的执行顺序也是确定的。



而面向对象程序由类的定义和类的使用两部分组成,程序的基本单位是类,在主程序内定义对象,并确定对象之间消息的传递规律,程序中的所有 *** 作都是通过向对象发送消息来实现的,对象接到消息后,通过消息处理函数完成相应的 *** 作。


4.面向对象程序设计有哪些重要特征?

面向对象程序设计的基本特征主要有:抽象性、封装性、继承性和多态性。


抽象性:抽象是面向对象程序设计的基本要素。


抽象就是从众多事物中抽取出共同的、本质的特征,形成类。



在面向对象程序设计中,抽象包含两个方面:数据抽象和过程抽象。


数据抽象是针对对象的属性,实现数据封装,在类外不可能被访问;过程抽象是针对对象的行为特征,实现信息隐藏。


封装性:封装是面向对象程序设计方法的一个重要特征,它是将对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。



封装有两个含义:
一是把对象的全部属性和行为结合在一起,形成一个不可分割的独立单位。


对象的属性值(除了公有的属性值)只能由这个对象的行为来读取和修改;
二是尽可能隐蔽对象的内部细节,对外形成一道屏障,与外部的联系只能通过外部接口实现。


继承性:继承是面向对象程序设计方法的一个重要特征,是实现软件复用的一个重要手段。


继承反映的是对象之间的相互关系,它允许一个新类从现有类派生而出,新类能够继承现有类的属性和行为,并且能够修改或增加新的属性和行为,成为一个功能更强大、更满足应用需求的类。



在软件开发过程中,继承性实现了软件模块的可重用性、独立性,缩短了开发周期,提高了软件开发的效率,同时使软件易于维护和修改。


多态性:多态是面向对象程序设计的另一个重要的特征,对象根据所接收的消息而做出动作。


“一个接口,多种形态”,即同一消息为不同的对象接收时可产生完全不同的行为,这种现象称为多态性。


5.什么是面向对象方法的封装性?它有何特点?

封装性指将对象的属性和行为代码封装在对象的内部,形成一个独立的单位,并尽可能隐蔽对象的内部细节。


封装性是面向对象方法的一个重要原则,C++面向对象方法的封装特性包含以下两层含义:
第一层含义是将对象的全部属性和行为封装在对象内部,形成一个不可分割的独立单位。


对象的属性值(公有属性值除外)只能由这个对象的行为来读取和修改。



第二层含义是“信息隐蔽”,即尽可能隐蔽对象的内部细节,对外形成一道屏障,只保留有限的对外接口与外部发生联系。


面向对象方法的封装性具有以下特点:
(1)封装性使对象以外的事物不能随意获取对象的内部属性,有效地避免了外部错误对它产生的影响,大大减轻了软件开发过程中查错的工作量,减小了排错的难度。



(2)封装性使得当程序需要修改对象内部的数据时,减少了因为内部修改对外部的影响。



(3)封装性使对象的使用者与设计者可以分开,使用者不必知道对象行为实现的细节,而只使用设计者提供的外部接口即可。



(4)封装性事实上隐蔽了程序设计的复杂性,提高了代码重用性,降低了软件开发的难度。



(5)面向对象程序设计方法的信息隐蔽作用体现了自然界中事物的相对独立性,程序设计者与使用者只需关心其对外提供的接口,而不必过分注意其内部细节,即主要关注能做什么,如何提供这些服务等。


6.面向对象程序设计为什么要应用继承机制?

在面向对象程序设计中,根据既有类(父类)派生出新类(子类)的现象称为类的继承机制,亦称为继承性。


面向对象方法的继承性是联结类与类的一种层次模型。


继承是面向对象程序设计能够提高软件开发效率的重要原因之一。


继承意味着派生类中无须重新定义在父类中已经定义的属性和行为,而是自动地、隐含地拥有其父类的全部属性与行为。


继承机制允许和鼓励类的重用,派生类既具有自己新定义的属性和行为,又具有继承下来的属性和行为。


当派生类又被它更下层的子类继承时,它继承的及自身定义的属性和行为又被下一级子类继承下去。


继承是可以传递的,符合自然界中特殊与一般的关系。


继承性具有重要的实际意义,它简化了人们对事物的认识和描述。


比如我们认识了飞行器的特征之后,再考虑飞机、飞船和d道时,由于它们都具有飞行器的共性,于是可以认为它理所当然地具有飞行器的一般本质特征,从而只需把精力用于发现和描述飞机、飞船和导d独有的特征。


面向对象程序设计中的继承性是对客观世界的直接反映。


通过类的继承,能够实现对问题的深入抽象描述,反映人类认识问题的发展过程。


7.什么是面向对象程序设计中的多态性?

指父类中定义的属性或行为,被派生类继承之后,可以具有不同的数据类型或表现出不同的行为特性。



如类中的同名函数可以对应多个具有相似功能的不同函数,可使用相同的调用方式来调用这些具有不同功能的同名函数。


“一个接口,多种形态”,即同一消息为不同的对象接收时可产生完全不同的行为。


多态性使得同一个属性或行为(如函数)在父类及其各派生类中具有不同的语义。


8.什么是面向对象中的消息?一条消息由哪几部分组成?

消息是面向对象程序设计用来描述对象之间通信的机制。


通常一条消息由接受消息的对象、消息名称和若干消息参数三部分组成。


9.为什么说C++是混合型面向对象程序设计语言?

C++保留了C语言的全部优点,兼容C语言的语法,弥补了C语言的缺陷,且C程序不经修改可以直接在C++环境中使用。


同时,C++还增加了面向对象的方法与机制,全面支持面向对象程序设计方法。



因此C++既可以用于结化程序设计,又可以用于面向对象程序设计,是一种混合型面向对象程序设计语言。


第二章 C++基础 1.什么是命名空间,如何访问命名空间的成员?

为了解决不同文件中同名变量的问题,C++标准中引入命名空间的概念。



命名空间(namespace)是一种特殊的作用域,命名空间可以由程序员自己来创建,可以将不同的标识符集合在一个命名作用域内,这些标识符可以类、对象、函数、变量、结构体、模板以及其他命名空间等。


在作用域范围内使用命名空间就可以访问命名空间定义的标识符。


有3种访问方法:
(1)直接指定标识符,访问方式为:命名空间标识符名∷成员名 。



(2)使用using namespace命令
(3)使用using关键词声明

2.什么是内联函数?它有什么特点?哪些函数可以定义为内联函数?哪些函数不可以定义为内联函数?

用inline关键字声明或定义的函数称为内联函数。


内联函数(inline function)的定义和普通函数相同,但C++对它们的处理方式不一样。



在编译时,C++将用内联函数程序代码替换对它每次的调用。


这样,内联函数没有函数调用的开销,即节省参数传递、控制转移的开销,从而提高了程序运行时的效率。


但是,由于每次调用内联函数时,需要将这个内联函数的所有代码复制到调用函数中,所以会增加程序的代码量,占用更多的存储空间,增大了系统空间方面的开销。


因此,内联函数是一种空间换时间的方案。


C++中对于功能简单、规模小、使用频繁的函数,可以将其设置为内联函数。



函数体内有循环语句和switch语句,递归调用的函数不能定义为内联函数。


3.什么是函数重载?在函数调用时,C++是如何匹配重载函数的?

函数重载是指两个或两个以上的函数具有相同的函数名,但参数类型不一致或参数个数不同。


编译时编译器将根据实参和形参的类型及个数进行相应地匹配,自动确定调用哪一个函数。


使得重载的函数虽然函数名相同,但功能却不完全相同。


在函数调用时,C++是匹配重载函数规则如下:
首先,寻找一个精确匹配,如果能找到,调用该函数;
其次,进行提升匹配,通过自动类型转换寻求一个匹配,如果能找到,调用该函数;
最后,通过强制类型转换寻求一个匹配,如果能找到,调用该函数。


4.设置函数参数的默认值有何作用?

在调用具有默认参数的函数时,如果没有提供实际参数,C++将自动把默认参数作为相应参数的值。


5.什么叫引用?使用引用时需要注意哪些问题?

引用是一个变量的别名。



使用引用时,必须在定义时进行初始化,不能在定义完后再赋值。


6.new运算符的作用是什么?delete运算符的作用是什么?

在C++程序中,new是动态分配内存的运算符,自动计算需要分配的空间。


delete是撤销动态申请的内存运算符。



delete与new通常配对使用,建立堆对象时使用new运算符、删除堆对象时delete使用运算符。


第三章 类和对象 1.在类的定义中,包含几类成员?分别是什么?

在类的定义中,包含两类成员。



一类是代表对象属性的数据成员,另一类是实现对象行为的成员函数。


2.C++中类成员的访问控制权限有哪几种?各有何特点?

C++对类的成员提供了public、protected和private三种不同的访问权限。


public声明成员为公有成员。


具有这个访问控制权限的成员是完全公开的,即该成员不但可以被它所在类的成员函数及该类的友元函数访问,也可以被和该类对象处在同一作用域内的任何函数访问。


protected声明成员为保护成员。


具有这个访问控制权限的成员,外界是无法直接访问的。


它只能被它所在类及从该类派生的子类的成员函数及友元函数访问。


private声明成员为私有成员。


具有这个访问控制权限的成员对类外是完全保密的,即只能被它所在类中的成员函数和该类的友元函数访问。


3.什么是构造函数和析构函数?其作用各是什么?对构造函数和析构函数有哪些要求?

构造函数和析构函数是两种特殊的成员函数。



构造函数用来完成在声明对象的同时,对对象中的数据成员进行初始化。



析构函数用来完成当对象的生命期结束(删除对象)时,自动被执行,进行一些必要的清理工作。


对构造函数的要求包括:
(1)名称必须有类名相同;
(2)没有返回值类型,也不能指定为void;
(3)构造函数可以有任意个任意类型的参数;
(4)如果没有显式的定义构造函数,系统会自动生成一个默认的构造函数。


这个构造函数不含有参数,也不对数据成员进行初始化,只负责为对象分配存储空间;
(5)如果显式的为类定义了构造函数,系统将不再为类提供默认构造函数;
(6)定义对象时,系统会自动调用构造函数;
(7)构造函数可以重载;
(8)构造函数一般被定义为公有访问权限。


对析造函数的要求包括:
(1)函数名由“~”加类名组成;
(2)函数没有参数、没有返回值,而且不能重载;
(3)一个类有且仅有一个析构函数,且应为public;
(4)在对象的生命期结束前,由系统自动调用析构函数。


4.在C++中,函数的参数传递有几方式?分别是什么?

C++语言中,函数的参数传递方式有3种,分别是值传递、指针传递和引用传递。


5.什么是this指针?它有什么作用?

this指针是一个隐含于每一个成员函数中的特殊指针。


它指向正在 *** 作该成员函数的对象,当一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数。


每次成员函数存取数据成员时,C++编译器将根据this指针所指向的对象来确定应该引用哪一个对象的数据成员。


6.什么是拷贝构造函数?什么情况下调用此函数?

拷贝构造函数是一种特殊的构造函数,它具有一般构造函数的所有特性,但其形参是本类对象的引用。



其作用是使用一个已经存在的对象(由拷贝函数的参数指定)去初始化同类的一个新对象。


调用拷贝构造函数的情况有3种:
(1)明确表示由一个对象初始化另一个对象;
(2)当对象作为函数实参传递给函数形参时;
(3)当对象作为函数的返回值,创建一个临时对象。


7.什么是组合类?创建和删除组合类时,构造函数和析构函的调用顺序是什么?

组合类是指一个类内嵌其他类的对象作为本类的成员。


两者之间是包含与被包含的关系。


在创建一个组合类的对象时,不仅它自身的构造函数将被调用,而且其内嵌对象的构造函数也将被调用。



这时构造函数调用的顺序为:先祖先(基类),再客人(内嵌对象),后自己(派生类本身);
析构函数的调用顺序与构造函数刚好相反。


第四章 类与对象的其他特性 1.静态数据成员是一种什么样的数据成员类型?

静态数据成员是一种特殊的数据成员类型,它是类的所有对象共享的数据成员,而不只是某个对象的数据成员。


使用静态数据成员的好处在于不但实现了数据共享,而且可以节省所使用的内存空间。


2.如何对静态数据成员进行初始化?

静态数据成员不能在类的构造函数中初始化,也不可在类的体内进行赋初值,它的初始化工作只能在类外进行,并且在对象生成之前进行。


3.类的友元有哪几种?

类的友元有三种:
1)该类外部的普通函数;
2)另一个类中的成员函数;
3)另一个类。


4.对象有哪几种生存期?

对象可分为局部对象、全局对象、静态对象和动态对象四种生存期

5.常量对象的特点是什么?

常量对象的特点是它的数据成员的值在对象的整个生存期内都不能被修改。


第五章 继承与派生 1.什么是继承性?

所谓继承就是在一个已存在的类的基础上建立一个新类,实质就是利用已有的数据类型定义出新的数据类型。


2.C++的继承分为哪两类?

单继承和多继承。


3.试说明什么是虚基类,其有何用处。


将共同基类设置为虚基类,这样从不同的途径继承过来的同名成员只有一个副本,这样就不会再会引起二义性。


4.什么是同名覆盖?

如果在派生类中声明了与基类成员相同的新成员,派生类的新成员将覆盖基类的同名成员。


此时,如果在派生类或派生类对象中直接调用该成员名就只能访问到派生类中声明的同名成员,这被称为同名覆盖。


5.类的继承有几种方式?试比较各种继承方式派生类对基类成员的继承。


在C++程序设计中,提供了3种继承方式:公有继承(public)、私有继承(private)和保护继承(protected)。



6.什么是赋值兼容规则?

所谓赋值兼容规则就是在公有继承方式下,对于某些场合,一个派生类的对象可以作为基类的对象来使用。


7.什么是子类型?

子类型的概念涉及到行为的共享,它与继承和派生有着紧密的联系。



所谓子类型,是指当一个类型至少包含了另一个类型的所有行为,则称该类型是另一个类型的子类型。


8.多继承中,在什么情况下会出现二义性?如何消除二义性?

情况一:派生类在访问基类成员函数时,由于基类存在同名的成员函数,导致无法确定访问的是哪个基类的成员函数,因此出现了二义性错误。


(倒三角问题)

情况二:当一个派生类从多个基类派生时,而这些基类又有一个共同的基类,当对这个共同的基类中说明的成员进行访问时,可能出现二义性问题。


(菱形问题)

解决派生类的不同基类有同名成员的二义性,有几种方法:
(1)使用作用域标识符
(2)使用同名覆盖的原则
(3)虚基类。


9.单继承中,派生类的构造函数的格式如何定义?

在C++中,派生类构造函数的一般性声明语法如下:

<派生类名>::<派生类名>(基类形参,内嵌对象形参,本类形参):<基类名>(参数表),<内嵌对象1>(参数表1),<内嵌对象2>(参数表2),…,<内嵌对象n>(参数表n)
{
	本类成员初始化赋值语句; 
};
10.多继承中,派生类的构造函数的格式如何定义?

在多重继承的情况下,派生类的构造函数一般性声明语法如下:

<派生类名>::<派生类名>(基类形参,内嵌对象形参,本类形参):<基类名1>(参数表),<基类名2>(参数表),…,<基类名n>(参数表),<内嵌对象1>(参数表1),<内嵌对象2>(参数表2),…,<内嵌对象n>(参数表n)
{ 	
	本类成员初始化赋值语句; 
};
11.试说明派生类和基类之间存在什么样的关系?

基类是派生类的父类,基类派生出派生类;

第六章 多态性 1. 什么叫多态性?在C++中如何实现多态性?

多态性是面向对象程序设计的又一个重要特征,它是指不同对象接收到同一消息时会产生不同的行为。


C++中通过函数重载、运算符重载、虚函数实现多态性。


2.什么叫静态联编?什么叫动态联编?二者有何区别?

如果在编译程序时就能确定具体的调用对象,称为静态联编;
如果在编译程序时还不能确定具体的调用对象,只有在程序运行过程中才能确定具体调用对象,称为动态联编。


3.什么叫抽象类?抽象类有何作用?抽象类的派生类是否一定要给出纯虚函数的实现?

如果一个类中至少有一个纯虚函数,这个类就是为抽象类,通常也称为抽象基类。


它的主要作用是为一个类族提供统一的公共接口,使它们更有效地发挥多态性的特性。


抽象类的派生类不一定要给出纯虚函数的实现。


抽象类派生出新的类之后,如果派生类给出所有纯虚函数的函数实现,这个派生类就可以声明自己的对象,因而不再是抽象类;反之,如果派生类没有给出全部纯虚函数的实现,这时的派生类仍然是一个抽象类。


第七章 模版 1.为什么使用模板?函数模板声明的一般形式是什么?

模板是C++语言的一个重要特征。


利用模板机制可以显著减少冗余信息,能大幅地节约程序代码,进一步提高面向对象程序的可重用性和可维护性。



模板是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了代码的重用,使得一段程序可以用于处理多种不同类型的对象,大幅度地提高程序设计的效率。


函数模板的声明格式如下:

template<typename 类型参数> 返回类型 函数名 (模板形参表)
{
	函数体
}
2.什么是模板实参?什么是模板函数?

将函数模板中的类型参数实例化的参数称为模板实参。


函数模板经实例化而生成的具体函数称为模板函数。


3.什么是类模板?类模板声明的一般形式是什么?

所谓类模板,实际上是建立一个通用类,其数据成员、成员函数的返回类型和形参类型不具体制定,用一个虚拟的类型来代表。


使用类模板定义对象时,系统会根据实参的类型来取代类模板中虚拟类型从而实现了不同类的功能。


定义一个类模板与定义函数模板的格式类似,必须以关键字template开始,后面是尖括号括起来的模板参数,然后是类名,其格式如下:

template<typename 类型参数> class 类名
{
	类成员声明 
}
4.函数模板与同名的非模板函数重载时,调用的顺序是怎样的?

函数模板与同名的非模板函数可以重载。



在这种情况下,调用的顺序是:
首先寻找一个参数完全匹配的非模板函数,如果找到了,就调用它。


若没有找到,则寻找函数模板,将其实例化,产生一个匹配的模板函数,若找到了,就调用它。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/562452.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-01
下一篇 2022-04-01

发表评论

登录后才能评论

评论列表(0条)

保存