C++复试题 笔记

目录

      • 2017.列出所有与字符串处理有关的头文件
      • 2017.面向对象程序“接口与实现方法分离”,有什么优点
      • 2017.怎样区别虚函数和纯虚函数?两者都有什么作用
      • 2017.函数模板与函数重载的区别与联系
      • 2012.2011.请说明函数模板和模板函数的区别与联系
      • 2017.什么是“else摇摆问题”,举例说明
      • 2017.填空
      • 2016.不能重载的运算符
      • 2013.什么是运算符重载?它如何增强了 C++的扩展性?
      • 2011.请举例并写出相关代码,阐述C++在什么情况下必须进行运算符重载
      • 2016. * 运算符有哪些含义
      • 2016.存储类说明符有哪些?作用分别是?
      • 2016.std::cin,std::cout,std::cerr的含义。
      • 2016.填空
      • 2013.类作用域和文件作用域的区别是什么?请详细说明。
      • 2013.控制语句有哪几种?请画出它的流程图或 UML 图。
      • 2013.什么是逻辑错误?什么是语法错误?请举例说明。
      • 2012.编写语句说明枚举类型是如何定义和使用的
      • 2010.STL是什么?组成部分和核心作用
      • 2013.2012.2011.为什么说“继承是C++面向对象的一个主要特征之一”
      • 2012.2011.如何声明和使用虚函数,说明它在多态性中的作用和意义
      • 2016.2010.C++多态的实现
      • 2010.友元关系的利与弊
      • 2010.const和static有什么作用?
      • 2011.简述对C++中的数据类型和抽象数据类型的理解
      • 2010.ADT是什么?简述对“数据抽象”和“信息隐藏”的认识
      • 2010.简述对“面向过程”和“面向对象”编程思想的认识与思考

2017.列出所有与字符串处理有关的头文件

string.h是C语言中字符串操作函数的头文件
cstring是C标准库头文件的C++标准库版本,是C++对C语言中的strcpy之类的函数申明,包含cstring之后,就可以在程序中使用C语言风格的strcpy之类的函数。
string是C++标准程序库中的一个头文件,定义了C++标准中的字符串的基本模板类std::basic_string及相关的模板类实例
CString是MFC中定义的字符串类,MFC中很多类及函数都是以CString为参数的

2017.面向对象程序“接口与实现方法分离”,有什么优点

接口定义并标准化了人和系统等诸如此类事物彼此交互的方式。
成员函数的实现细节对客户代码是隐藏的(即信息隐藏),使得程序员不会写出依赖类的实现细节的客户代码。
程序更容易修改,只要类的接口保持不变,类的实现的改变不会影响客户。
加快编译速度,提高了维护性,使得代码变得清晰

2017.怎样区别虚函数和纯虚函数?两者都有什么作用

virtual void fun(); //虚函数
virtual void fun() = 0; //纯虚函数
虚函数用于基类与派生类的同名操作使其具有多态性,纯虚函数是用来定义抽象类的。

2017.函数模板与函数重载的区别与联系

当重载函数实现的是对相同个数的不同数据类型的数据的相同处理时,可以用函数模板实现。
函数模板是数据类型参数化的函数定义,实现的是对任意数据类型的数据的相同处理,参数是抽象的。仅需编写一次函数体。
函数重载是相同函数名,不同参数的多个函数,函数体需各自定义,其参数是具体的。相比函数模板,它可以传入不同个数的参数,实现对不同数量的数据的相同处理。如,从两个、三个、四个数中取最大值。

重载模版函数:当编译器在处理重载模版函数的问题时,遵循的原则是:首选函数名、参数类型都匹配的具体函数,再找模版。

2012.2011.请说明函数模板和模板函数的区别与联系

函数模板:以具体的类型为实参来生成函数体的模板;
模板函数:函数模板实例化的结果,由函数模板将涉及的数据类型为参数来生成的模板化函数
函数模版就是数据类型参数化的函数定义,是一个函数族,代表的是一类函数。 当编译系统发现用指定数据类型调用函数模版时,就创建了一个模版函数,模版函数是一个实例化的具体函数。

2017.什么是“else摇摆问题”,举例说明

if (a>0)
	if(b>0)
		...
else	//这里的else应该与第二个if匹配而非第一个
	...

2017.填空

1.如果每次运行环境只能执行一条语句,但是有许多语句需要执行,那么:用花括号{}括起来 , 构成:语句块 。
2.标识符的作用域: 语句块作用域(局部作用域)、函数原型作用域、函数作用域、类作用域、命名空间及全局命名空间作用域 。
郑莉书中分四类:函数原型作用域、局部作用域(块作用域)、类作用域和命名空间作用域
3.用字符串“schedule”初始化一个字符数组的初始化语句

char s[] = "schedule";
char s[] = {"schedule"};
char s[] = {'s','c','h','e','d','u','l','e','\0'};
const char *sPtr = "schedule"; //补充⼀一种指针式的字符数组

4.必须重载为成员函数的运算符: ()、[]、->、=

2016.不能重载的运算符

类属关系运算符“.”、成员指针运算符“.*”、作用域分辨符“::”和三目运算符“?:”

2013.什么是运算符重载?它如何增强了 C++的扩展性?

对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不不同的行为。同一个运算符适应不同的数据类型,增强了C++的扩展性。

2011.请举例并写出相关代码,阐述C++在什么情况下必须进行运算符重载

只有当二元运算符最左边的操作数是该类的一个对象,或者当一元运算符的操作数是该类的一个对象时,才有必要进行运算符重载。

2016. * 运算符有哪些含义

乘法、指针的间接运算符
int *ptr; //声明一个指针
*ptr = 10; //表示访问指针所指对象的内容

“*”称为指针运算符,也称解析

2016.存储类说明符有哪些?作用分别是?

auto、static、extern、register
auto 标明一个变量具有自动存储时期,该说明符只能用在具有代码块作用域的变量声明中。比如一般的局部变量或是在函数原型中的参数。
register 只能⽤在具有代码块作用域的变量。请求一个变量存储在寄存器中快速使用,但是不能获得改变量的地址。register常常是不必要的。
static 使用static声明的局部变量仅被其声明所在的函数所知,static局部变量在函数返回到它的调用者后仍保留着变量的值。
extern 表明在声明一个在其他地方定义了的变量(该关键字用于全局变量)。

类型 特性
auto 具有代码块作用域,自动存储期,外部或者内部链接属性
static 具有代码块作用域,自动存储期,外部或者内部链接属性
extern 具有代码块或者文件作用域、静态存储期、内部链接
register 具有文件作用域、静态存储期、外部链接

2016.std::cin,std::cout,std::cerr的含义。

都是标准流对象
cin:istream实例,连接到标准输入设备
cout:ostream实例,连接到标准输出设备
cerr:ostream实例,连接到标准错误设备,输出是无缓冲的
补充一个 clog:ostream实例,连接到标准错误设备,输出是有缓冲的

2016.填空

1.程序从哪里开始运行 :main()函数
2.三种控制结构:顺序、选择、循环
3.可以初始化指针的值: nullptr/NULL、0、具体的地址
4.对象之间看不到其他对象的具体操作的属性是: 信息隐藏
5.用户自定义类型的一个实例叫什么: 对象

2013.类作用域和文件作用域的区别是什么?请详细说明。

函数原型作用域:在函数原型声明时形式参数的作用范围就是函数原型作用域。
块作用域:函数形参列表中形参的作用域,从形参列表中的声明处开始,到整个函数体结束之处为止;函数体内声明的变量,其作用域从声明处开始,一直到块结束的大括号为止。
类作用域:类X的成员M在以下几种情况下具有类作用域:
(1) 在X的成员函数内出现标识符M,同时在该函数中也没有声明同名的局部作用域标识符。
(2) 在表达式x.M或者x::M中,类X的对象x通过作用符号“.”,”::”访问的M也具有类作用域,这正是在程序中访问对象的成员的最基本的方法。
(3) 在prt->M这样的表达式中,其中prt为指向X类的一个对象的指针。
文件作用域:在任何函数外部声明的标识符的作用范域为文件作用域,可以从声明标识符到文件末尾处的任何函数中访问标识符。

2013.控制语句有哪几种?请画出它的流程图或 UML 图。

顺序,选择,循环

2013.什么是逻辑错误?什么是语法错误?请举例说明。

语法错误是对语言规则的违背,当编译器不能正确识别语句时,便会导致语法错误,它们都是在编译阶段出现的,所以也叫编译错误,编译不能通过,比如语句句末尾缺少分号等。
逻辑错误是指算法上的错误,编译能通过,程序可以完成运行,但往往产生不正确的结果,比如循环语句结束条件没写,造成死循环。

2012.编写语句说明枚举类型是如何定义和使用的

Enum Week{Mon,Tue,Wed,Thu,Fri,Sat,Sun};枚举类是对整数区间的⾃自定义类型,一旦定义则不能改变,常常代替整数常量使用,可以使程序更晰、更持久。在进入函数调用或其他模块时,常量需要初始化,而枚举类型是一种类型,无须定义实体,便可直接使用枚举符。默认对应着整数0,1,2…
当然也可以Enum Week{Mon=1,Tue,Wed,Thu,Fri,Sat,Sun};这样定义,对应的整数就变成1,2,3…

2010.STL是什么?组成部分和核心作用

标准模板库(Standard Template Library),有三部分组成:容器(container)、迭代器(iterator)和算法(algorithm)。
STL可分为容器(containers)、迭代器(iterators)、内存分配器(allocator)、适配器(adapters)、算法(algorithms)、仿函数(functors)/函数对象(function object)六个部分。
程序员可以重用STL容器、迭代器和算法实现通用的数据表示和操作,节约大量的开发时间和资源。

2013.2012.2011.为什么说“继承是C++面向对象的一个主要特征之一”

继承是软件重用的一种形式,程序员创建的新类通过继承这一方式 ,从现有的类中吸收其数据和行为,再根据新类的特征,即对象的特征,赋予其新的数据和行为,并通过新的功能进一步提高,在面向对象的程序设计中,采用继承方式来组织设计系统的类,可以提高程序的抽象程度,更接近人的思维方式,使程序结构更清晰并降低编码和维护的工作量

2012.2011.如何声明和使用虚函数,说明它在多态性中的作用和意义

声明虚函数时,在基类的函数原型前加关键字virtual,在派生类中重写函数;用名称和圆点成员选择运算符引用一个特定的对象以调用虚函数,被调用的虚函数是在编译时确定的;也可以通过基类指针调用函数,让程序在任何给定的时刻基于基类指针所指对象的对象类型,动态确定执行相应的派生类的函数。
虚函数是多态性的主要实现方式,利用虚拟函数和多态性,程序员可以处理普遍性而让执行环境处理特殊性,即使在不知道一些对象的类型的情况下(只要这些对象属于同一继承层次并且通过一个共同的基类指针访问),程序员也可以命令各种对象表现出适合这些对象的行为。

2016.2010.C++多态的实现

多态是指同样的消息被不同类型的对象接收时导致完全不同的行为,是对类的特定成员函数的再抽象。
面向对象的多态可分为4类:重载多态、强制多态、包含多态(虚函数)和参数多态(类模版)
C++支持的多态有多种类型,重载(包括函数重载和运算符重载)和虚函数是其主要的方式。

2010.友元关系的利与弊

友元可以是一个函数也可以是一个类,友元关系提供了不同类或对象的成员函数之间、类的成员函数和一般函数之间进行数据共享的机制,通过友元,一个一般函数或另一个类中的成员函数可以访问类中的私有成员和保护成员。
友元的正确使用可以提高程序运行效率和可读性,实现信息共享,但一定程度上也破坏了类的封装性和隐藏性,导致程序可维护性变差。

2010.const和static有什么作用?

关键字const用于定义常量,可以保护被修饰的量,防止意外的修改,增强程序的健壮性,编译器一般不为普通const常量分配存储空间,而是将它们保存在符号表中,没了存储与读内存的操作,效率较高,同时节省了空间,避免了不必要的内存分配;
static用于声明静态成员,它只有一个变量拷贝,供类的所有对象共享,静态类变量表示整个类范围中(所有类对象而非指定的类对象)共享的信息。
static可以用于在函数内部的局部作用域中声明具有静态生存期的对象,使函数返回后,下次调用时该变量仍保持上一回的值,即使发生递归调用,也不会为该变量建立新副本,该变量会在每次调用间共享。

2011.简述对C++中的数据类型和抽象数据类型的理解

数据类型是一组性质相同的具有一定范围的值集以及定义于这个值集上的一组操作。数据类型既有内部数据类型,如int,char,float,bool等,又有自定义外部数据类型,如枚举类型,结构类型,联合类型,数组类型、类类型。
ADT即抽象数据类型,是基于已有类型而组合生成的复合数据类型,类正是抽象数据类型的描述形式。

2010.ADT是什么?简述对“数据抽象”和“信息隐藏”的认识

ADT即抽象数据类型,是基于已有类型而组合生成的复合数据类型,类正是抽象数据类型的描述形式。
抽象数据类型是指一个数学模型以及定义在此数学模型上的一组操作。它通常是对数据的某种抽象,定义了数据的取值范围及其结构形式,以及对数据操作的集合。

数据抽象:指以数据为中心,把数据及在数据上的操作为一个整体来进行描述;
数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。
数据抽象。用ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。
数据抽象描述对象的属性或状态,也就是此类对象区别于彼类对象的特征

封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机的结合,行成类。通过封装使一部分成员充当类与外部的接口,而将其他成员隐蔽起来,达到对成员访问权限的合理控制,使不同类之间的相互影响减少到最低限度,进而增强数据的安全性和简化程序编写工作。
信息隐藏:通过封装,实现信息隐藏;将类对外部的接口放在类的公有部分,数据放在类的私有部分中,防止用户在类外直接访问数据,并且屏蔽了类的实现细节,实现信息隐藏。

2010.简述对“面向过程”和“面向对象”编程思想的认识与思考

面向过程是将解决问题的重点放在如何实现过程的细节方面,把数据和对数据进行操作的函数截然分开,以数据结构为核心,围绕着功能的实现或操作流程来设计程序,安全性较低、扩展升级麻烦,当问题的规模变⼤大时,编程将很复杂;
面向对象将客观事物看作具有属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特征)和行为(动态特征),形成类。通过继承与多态可以很方便地实现代码重用,大大缩短了软件开发周期,并使软件风格统一。

你可能感兴趣的:(C++复试题 笔记)