迅雷2014C++研发笔试卷C解题分析

试卷链接见迅雷2014C++研发笔试卷C

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

A.*    B.>=  C.::  D. delete

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


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

  • C++语言的多态性分为编译时的多态性和运行时的多态性
  • 编译时的多态性可通过函数重载实现
  • 运行时的多态性可通过模板和虚函数实现
  • 实现运行时多态性的机制称为动态绑定
分析:
A,正确,分编译时多态和运行时多态;
B,正确,编译时多态可以通过函数重载实现,具体表现在根据参数的个数和类型不同选择合适的同名函数;
C,错误,运行时多态通过虚函数实现,就是运行时根据对象类型自动选择正确的调用接口。模板属于编译时多态性,因为编译时自动根据模板生成模板函数;
D,正确,运行时多态是根据对象类型自动选择正确的调用函数,也叫动态绑定。

3、下面关于类和对象的描述中,错误的是:
  • 类就是C语言中的结构体类型,对象就是C语言中的结构体变量
  • 类和对象之间的关系是抽象和具体的关系
  • 对象是类的实例,一个对象必须属于一个已知的类
  • 类是具有共同行为的若干对象的统一描述体
分析:(1)C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。所以C的结构体是没有构造函数、析构函数、和this指针的。(2)C的结构体对内部成员变量的访问权限只能是public,而C++允许public 、protected、private三种。(3)C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。以上三条都是表面的区别,实际区别就是面向过程面向对象编程思路的区别:C的结构体只是把数据变量给包裹起来了,并不涉及算法。而C++是把数据变量及对这些数据变量的相关算法给封装起来, 并且给对这些数据和类不同的访问权限。

4、引用标准库时,下面的说法你认为哪个是正确的:
  • 语句#include “stdlib.h”是正确的,而且程序编译速度比#include <stdlib.h>要快
  • 语句#include <stdlib.h>是正确的,而且程序编译速度比#include “stdlib.h”要快语句#include <stdlib.h>和#include “stdlib.h”都是正确的,程序编译速度没有区别
  • 语句#include “stdlib.h”是错误的
分析:#inlcude<> 首先只搜索系统目录,不会搜索本地目录.比如你自己写一个头文件,你用#include <>会出错。
#include""首先搜索本地目录,如果本地目录没有才会搜索系统目录。可以把系统的文件放到当前目录下改成 "" 可以优先使用。综上所述,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的值为:
  • 0
  • 1
  • 2
  • 7
分析:逻辑与或者逻辑或的表达式,先是判断一边,若一边可以判断整个表达式为真假时,另一边不再执行。
做题时一定要注意。对于这题来讲,m=a>b后m=0,表达式为假,&&后半部分不会操作,因此n为初始值2。

6、不能作为重载函数的调用的依据是:
  • 参数个数
  • 参数类型
  • 函数类型
  • 函数名称
分析:函数重载是面向对象程序设计的多态性的实现,就是指同一个函数名对应着不同的函数实现,系统可根据参数的类型、个数来自动完成调用函数的最佳匹配。因此D选项是重载函数的判断依据,而且是第一依据:函数名必须相同。重载函数的参数至少要有一方面不同,表现如下:
(1)函数的参数类型和个数不同;
(2)函数参数的顺序不同。如:fun(double,int)和fun(int,double)就是两个不同的函数
注意:返回值没有区分度,因为在调用函数的时候你自己可以选择接收或丢弃返回值,编译器是无法区分你是要调用有相应返回值的函数然后丢弃返回值,还是要调用无返回值的函数。所以,返回值(函数类型)是无法区分函数的。

7、下列程序的输出结果为:
#include<iostream.h>
int func(int n)
{
   if(n<1)
       return 1;
    else
       return n+func(n-1);
    return 0;
}
void main() {
    cout<< func(5) <<endl;
}
  • 0
  • 10
  • 15
  • 16
分析:这是一个求累加和的递归,注意最后f(0)=1,因此答案为D。

8、建立派生类对象时,3种构造函数分别是a(基类的构造函数)、b(成员对象的构造函数)、c(派生类的构造函数)这3种构造函数的调用顺序为: 
  • abc
  • acb
  • cab
  • cba
分析:执行派生类构造函数的顺序是:
(1)调用基类构造函数,对基类数据成员初始化;
(2)调用子对象构造函数,对子对象数据成员初始化;
(3)再执行派生类构造函数本身,对派生类数据成员初始化。
答案选A。

9、如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是:
  • 一元运算符
  • 二元运算符
  • 选项A)和选项B)都可能
  • 重载错误
分析:友元函数重载时,重载几目的运算符就有几个参数。成员函数重载时,因为有this指针的原因,所以参数个数要少一个。答案选D。

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);</span>
输出结果是
  • 3, 4
  • 3, 5
  • -2, 5
  • -2, 9
分析:#define F(X,Y)   (X)--, (Y)++, (X)*(Y);  表示遇到F(X,Y)时,用(X)--, (Y)++, (X)*(Y)替换原内容,F(a,b)替换为(a)--, (b)++, (a)*(b),则每循环一次a--,b++;循环了5次,a变为-2,b变为9。故答案为D。

11、[不定项选择题]已知一段文本有1382个字符,使用了1382个字节进行存储,这段文本全部是由a、b、c、d、e这5个字符组成,a出现了354次,b出现了483次,c出现了227次,d出现了96次,e出现了232次,对这5个字符使用哈夫曼(Huffman)算法进行编码,则以下哪些说法正确()
  • 使用哈夫曼算法编码后,用编码值来存储这段文本将花费最少的存储空间
  • 使用哈夫曼算法进行编码,a、b、c、d、e这5个字符对应的编码值是唯一确定的
  • 使用哈夫曼算法进行编码,a、b、c、d、e这5个字符对应的编码值可以有多套,但每个字符编码的位(bit)数是确定的
  • b这个字符的哈夫曼编码值位数应该最短,d这个字符的哈夫曼编码值位数应该最长
分析:
A正确Huffman树就是求最优解。可以有多套方案,但最终每套方案生成的编码长度都相同且都是最优解。
B错误我们可以将左子树定为1右子树定为0也可以反之,不同的方案获得的编码值是不同的,但每个字符的编码长度是固定的。
C正确不同的方案影响的只是通向节点的路径为0还是1,而不会影响Huffman树的层次结构
D正确生成了Huffman树之后,我们就能看到,出现频率越高的节点越靠近根,深度越小即编码值尾数越短;出现频率越低的节点越远离根,深度越大即编码位数越长。

12、[不定项选择题]下面描述不正确的是()
  • while循环语句的循环体至少执行1次
  • do-while循环可以写成while循环的格式
  • continue语句可以出现在各种循环体中
  • break语句不可以出现在循环体内
分析:while(0)时不执行,break用于终止离它最近的循环语句,continue只能出现在for/while/do while循环内部,或嵌套在此类循环里的语句和块内部,不能在单独的switch中用continue。答案ACD。

13、[不定项选择题]下面模板声明中,哪些是非法的()
  • template<class Type>class C1{};
  • template<class T, U, class V>class C2{};
  • template<class C1, typename C2>class C3{};
  • template<typename myT, class myT>class C4{};
分析:答案BD,B选项的U参数没有指定类型, D选项的 2个形参名同名。
函数模板的格式:

template <class 形参名class 形参名,......返回类型 函数名(参数列表)

{

函数体

}

类模板的格式为:

template<class   形参名 class 形参名>   class 类名

{ ... };


14、[不定项选择题]拷贝构造函数的特点是()
  • 该函数名同类名,也是一种构造函数,该函数返回自身引用
  • 该函数只有一个参数,是对某个对象的引用
  • 每个类都必须有一个拷贝初始化构造函数,如果类中没有说明拷贝构造函数,则编译器系统会自动生成一个缺省拷贝构造函数,作为该类的保护成员
  • 拷贝初始化构造函数的作用是将一个已知对象的数据成员值拷贝给正在创建的另一个同类的对象
分析:拷贝函数和构造函数没有返回值,A是错的。构造函数可以有多个参数,但是复制构造函数的参数必须是实例的引用,且只有一个。B是对的。C前面都是对的,但是默认复制构造函数可以在类或子类外使用,不是保护成员函数。D正确不解释。答案BD。

15、[不定项选择题]下列对函数double add(int a , int b)进行重载,正确的是()
  • int add(int a ,int b ,int c)
  • int add(double a , double b)
  • double add(double a , double b)
  • int add(int a , int b)
分析:override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。重写(覆盖)的规则如下:
 (1)重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.
 (2)重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。
 (3)重写的方法的返回值必须和被重写的方法的返回一致;
 (4)重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;
 (5)被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
 (6)静态方法不能被重写为非静态的方法(会编译出错)。
overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。重载的规则如下:
(1)在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样);
(2)不能通过访问权限、返回类型、抛出的异常进行重载;
(3)方法的异常类型和数目不会对重载造成影响。

16、[智力题]有一幢100层高的大楼,给你两个完全相同的玻璃围棋子。假设从某一层开始,丢下玻璃棋子就会破碎。那么怎么利用手中的两颗棋子,用一种什么样的最优策略,知道这个临界的层高呢?
分析:参考博客100层楼和两个玻璃球的问题

17、[编程题]用c++写一个函数,如Foo(const char *str),打印出str的全排列,如abc的全排列:abc, acb, bca, dac, cab,cba
分析:参考博客全排列的一些总结。参考代码如下:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
void Foo(const char*str){
    string s=str;
    cout<<s<<endl;
    while(next_permutation(s.begin(),s.begin()+s.size())){
         cout<<s<<endl;
    }
    return ;
}
int main(){
    const char str[]="abc";
    Foo(str);
    return 0;
}
参考代码2:
#include<iostream>
using namespace std;
void Foo(char *str,char *begin)
{
   
    if(*begin == '\0') 
        cout<<str<<endl;
    else  
        for(char* p = begin; *p != '\0'; p++) 
        { 
            swap(*begin,*p);
            Foo(str, begin+1); 
            swap(*begin,*p);
        } 
}
int main()
{
    char *str=new char[100];
    cin>>str;
    Foo(str,str);
    return 0;
}

18、[编程题]求出一字符串中最长的数字串。比如as123cdf1234f,返回1234,char* FindNumber(char * out,char *in)。
分析:参考博客在字符串中找出连续最长的数字串

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值