迅雷 2021 C++工程师面试题

小编:管理员 1025阅读 2021.10.09

第1题:

一、单选题

下列运算符中,在C++语言中不能重载的是:

A  *

B  >=

C  ::

D  delete



 C

在C++中,sizeof运算符,.成员运算符,.*成员指针运算符,::作用域解析运算符以及?:条件运算符不能被重载,因此答案选C



第2题:

下面关于多态性的描述,错误的是:

A  C++语言的多态性分为编译时的多态性和运行时的多态性

B  编译时的多态性可通过函数重载实现

C  运行时的多态性可通过模板和虚函数实现

D  实现运行时多态性的机制称为动态绑定



 C

A,正确,分编译时多态和运行时多态

B,编译时多态可以通过函数重载实现,具体表现在根据参数的个数和类型不同选择合适的同名函数

C,运行时多态通过虚函数实现,就是运行时根据对象类型自动选择正确的调用接口。模板属于编译时多态性,因为编译时自动根据模板生成模板函数。

D,运行时多态是根据对象类型自动选择正确的调用函数,也叫动态绑定。



第3题:

下面关于类和对象的描述中,错误的是:

A  类就是C语言中的结构体类型,对象就是C语言中的结构体变量

B  类和对象之间的关系是抽象和具体的关系

C  对象是类的实例,一个对象必须属于一个已知的类

D  类是具有共同行为的若干对象的统一描述体



 A

c语言中结构体无成员函数,而c++中的类是有成员函数的


第4题:

引用标准库时,下面的说法你认为哪个是正确的:

        

A  语句#include “stdlib.h”是正确的,而且程序编译速度比#include 要快

B  语句#include 是正确的,而且程序编译速度比#include “stdlib.h”要快

C  语句#include 和#include “stdlib.h”都是正确的,程序编译速度没有区别

D  语句#include “stdlib.h”是错误的



 B

#inlcude <> 首先 只搜索系统目录,不会搜索本地目录.比如你自己写一个头文件,你用#include<> 会出错.  

#inlude ""首先搜索本地目录,如果本地目录没有才会搜索系统目录.

可以把系统的文件 放到当前目录下 改成 ""   可以优先使用

所以B是对的



第5题:

设a、b、c、d、m、n均为int型变量,且a=5、b=6、c=7、d=8、m=2、n=2,则逻辑表达式(m=a>b)&&(n=c>d)运算后,n的值为:        

A  0

B  1

C  2

D  7



 C

分析:m=a>b后m=0,表达式为假,&&后半部分不会操作,因此n为初始值2



第6题:

不能作为重载函数的调用的依据是:

A  参数个数

B  参数类型

C  函数类型

D  函数名称



 C

函数的重载,发生在同名函数之间,区别同名函数是否是相同的函数,要看同名函数的特征标,即参数列表是否相同,若参数列表的参数类型或个数不一样,则函数不一样,因此答案选C



第7题:

下列程序的输出结果为:

#include

int func(int n)

{

   if(n<1)

       return 1;

    else

       return n+func(n-1);

    return 0;

}

void main() {

    cout<< func(5) <

}

         

A  0

B  10

C  15

D  16




 D

这是一个求累加和的递归,注意


1

   

if(n<1) return 1;

   

即func(0)的值为1.

func(5)=5+4+3+2+1+1=16




第8题:

建立派生类对象时,3种构造函数分别是a(基类的构造函数)、b(成员对象的构造函数)、c(派生类的构造函数)这3种构造函数的调用顺序为:        

A  abc

B  acb

C  cab

D  cba



 A 

在继承中派生类的对象调用构造函数的顺序,应该是先调用基类的构造函数,然后是成员中的对象对应类的构造函数,最后是派生类自己的构造函数.



第9题:

如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是:

A  一元运算符

B  二元运算符

C  选项A)和选项B)都可能

D  重载错误



 D

分析:C++中用友元函数重载运算符至少有一个参数,重载一目运算符要有一个参数,重载二目运算符要有两个参数。




第10题:

#define F(X,Y)   (X)--, (Y)++, (X)*(Y);

int i, a = 3, b = 4;

for( i = 0; i<5; i++)

    F(a,b)

printf(“%d, %d”, a, b);

 

输出结果是
       

A 3, 4

B  3, 5

C  -2, 5

D  -2, 9




 D

宏会内联展开,答案是 -2,9



第11题:

 二、不定项选择

已知一段文本有1382个字符,使用了1382个字节进行存储,这段文本全部是由a、b、c、d、e这5个字符组成,a出现了354次,b出现了483次,c出现了227次,d出现了96次,e出现了232次,对这5个字符使用哈夫曼(Huffman)算法进行编码,则以下哪些说法正确()

        

A  使用哈夫曼算法编码后,用编码值来存储这段文本将花费最少的存储空间

B  使用哈夫曼算法进行编码,a、b、c、d、e这5个字符对应的编码值是唯一确定的

C  使用哈夫曼算法进行编码,a、b、c、d、e这5个字符对应的编码值可以有多套,但每个字符编码的位(bit)数是确定的

D  b这个字符的哈夫曼编码值位数应该最短,d这个字符的哈夫曼编码值位数应该最长



 A C D

B答案:哈弗曼编码不是唯一的,因为二叉树左右字数定义的0,1不同会影响到最后的编码。D答案:次数最小的应该放在最底层叶子节点,次数最大的应该最接近根节点。



第12题:

下面描述正确的是()

A  while循环语句的循环体至少执行1次

B  do-while循环可以写成while循环的格式

C  continue语句可以出现在各种循环体中

D  break语句不可以出现在循环体内



 BC

break语句可以出现在switch语句块中,while循环体可能不会执行



第13题:

下面模板声明中,哪些是非法的()     

A  templateclass C1;

B  templateclass C2;

C  templateclass C3{};

D  templateclass C4{};



 B D

解释:  B选项的U参数没有指定类型, D选项的 2个形参名同名。

函数模板的格式:

template  返回类型        函数名(参数列表)  

{       

函数体  

}  


 

类模板的格式为:  

template   class 类名              

{ ... };      



第14题:

拷贝构造函数的特点是()     

A  该函数名同类名,也是一种构造函数,该函数返回自身引用

B  该函数只有一个参数,必须是对某个对象的引用

C  每个类都必须有一个拷贝初始化构造函数,如果类中没有说明拷贝构造函数,则编译器系统会自动生成一个缺省拷贝构造函数,作为该类的保护成员

D  拷贝初始化构造函数的作用是将一个已知对象的数据成员值拷贝给正在创建的另一个同类的对象



 D

拷贝函数和构造函数没有返回值,A错;

拷贝构造函数的参数可以使一个或多个,但左起第一个必须是类的引用对象,B错;

若类定义中没有声明拷贝构造函数,则编译器会自动生成一个缺省的拷贝构造函数,但是不会是该类的保护成员,C错;

通过拷贝函数可以将另一个对象作为对象的初值,D对



第15题:

下列对函数double add(int a , int b)进行重载,正确的是()     

A  int add(int a ,int b ,int c)

B  int add(double a , double b)

C  double add(double a , double b)

D  int add(int a , int b)



 A B C

在C++中,函数的重载取决于函数的特征标即函数的参数列表。同名的函数,特征标不一样则函数不一样,A、B、C 的参数列表与题目给出的特征标数量或类型不一样,因此正确答案为A、B、C



第16题:

三、问答题

有一幢100层高的大楼,给你两个完全相同的玻璃围棋子。假设从某一层开始,丢下玻璃棋子就会破碎。那么怎么利用手中的两颗棋子,用一种什么样的最优策略,知道这个临界的层高呢?



 首先,为了保证成功,两颗棋子不能全碎.   那么经过计算,第一次应该在16层尝试.如棋子碎则从1-15层继续尝试.这样最多尝试16次可以得到结果.   如16层棋子未碎,则第二次应该在16+16-1=31层尝试.这样可以保证最多尝试次数仍然为16次.往下类似.  这样得到最终结果是:  第一颗棋子应该依次在16,31,45,58,70,81,91这七层尝试.如在其中某层碎了则继续用第2颗在相邻两次尝试楼层中间继续尝试.这样最多只需要16次尝试可以确定此临界值.



第17题:

用c++写一个函数,如Foo(const   char   *str),打印出str的全排列,如abc的全排列:abc, acb, bca, dac, cab,cba

 #include
#include
#include

void Foo(const char * str)
{
using namespace std;

if (str==NULL || *str==NULL)
  return;

string s(str);
int c=0;
sort(s.begin(),s.end());

cout< c++;
for (;next_permutation(s.begin(),s.end());)
{
  cout<   c++;
}
cout< }

int main()
{
using namespace std;

string s;
cin>>ws;
getline(cin,s);
Foo(s.c_str());
return 0;
}



第18题:

求出一字符串中最长的数字串。比如as123cdf1234f,返回1234,char* FindNumber(char * out,char *in)。

 #include

#include

char *FindNuber(char* out,char*in)

{

char *max=NULL,*p=NULL,*q=NULL;

int i=0,j=0;

p=in;

while(*p){

p++;

if((*p)>=0&&(*p)<=9)

{

q=p;

while((*p)>=0&&(*p)<=9)

{

i++;

p++;

}

}

if(i>j){

strncpy(max,q,i);

j=i;

i=0;

}

}

out=max;

return out;

}


关联标签: