备战秋招 | 笔试强训11

目录

一、选择题

二、编程题

三、选择题题解

四、编程题题解


一、选择题

1、关于内联函数说法错误的是()

A. 不是任何一个函数都可定义成内联函数

B. 内联函数的函数体内不能含有复杂的结构控制语句

C. 递归函数可以被用来作为内联函数

D. 内联函数一般适合于只有1~5行语句的小函数

2、以下不是double compare(int,int)的重载函数的是()

A. int compare(double,double)

B. double compare(double,double)

C. double compare(double,int)

D. int compare(int,int)

3、假定有类AB,有相应的构造函数定义,能正确执行语句,请问执行完此语句后共调用该类的构造函数次数为___

AB a(4),b(5),c[3],*p[2]={&a,&b};

A. 5

B. 4

C. 3

D. 9

4、下列关于赋值运算符“=”重载的叙述中,正确的是

A. 赋值运算符只能作为类的成员函数重载

B. 默认的赋值运算符实现了“深层复制”功能

C. 重载的赋值运算符函数有两个本类对象作为形参

D. 如果己经定义了复制拷贝构造函数,就不能重载赋值运算符

5、下列有关静态成员函数的描述中,正确的是:

A. 静态数据成员(非const类型)可以在类体内初始化

B. 静态数据成员不可以被类对象调用

C. 静态数据成员不受private控制符作用

D. 静态数据成员可以直接用类名调用

6、若PAT是一个类,则程序运行时,语句“PAT(*ad)[3];”调用PAT的构造函数的次数是()

A. 2

B. 3

C. 0

D. 1

7、下面对析构函数的正确描述是()

A. 系统不能提供默认的析构函数

B. 析构函数必须由用户定义

C. 析构函数没有参数

D. 析构函数可以设置默认参数

8、关于以下代码,哪个说法是正确的()

myClass::foo()
{
    delete this;
}

void func()
{
    myClass *a = new myClass();
    a->foo();
}

A. 它会引起栈溢出

B. 都不正确

C. 它不能编译

D. 它会引起段错误

9、哪种说法是错误的()?

A. 构造函数可以有形参

B. 析构函数可以有形参

C. 构造函数无任何函数类型

D. 析构函数无任何函数类型

10、有如下模板定义:在下列对fun的调用中,错误的是()

template <class T>
T fun(T x,T y)
{
    return x*x+y*y;
}

A. fun(1, 2)

B. fun(1.0, 2)

C. fun(2.0, 1.0)

D. fun(1, 2.0)

二、编程题

1、最近公共祖先   题目链接

2、求最大连续bit数  题目链接

三、选择题题解

1、关于内联函数说法错误的是()

A. 不是任何一个函数都可定义成内联函数

B. 内联函数的函数体内不能含有复杂的结构控制语句

C. 递归函数可以被用来作为内联函数

D. 内联函数一般适合于只有1~5行语句的小函数

正确答案:C

题解:

         递归函数不能用来做内联函数,因此内联函数仅仅只是在编译阶段进行替换,而不会进行压栈,而递归函数要反复调用自己,建立栈帧空间;因此错误;

2、以下不是double compare(int,int)的重载函数的是()

A. int compare(double,double)

B. double compare(double,double)

C. double compare(double,int)

D. int compare(int,int)

正确答案:D

题解:

         D选项仅仅只是返回值不同,不会构成函数重载,函数重载构成的条件是,在同一个作用域下,函数名相同,函数的参数个数,参数类型不同构成函数重载;

3、假定有类AB,有相应的构造函数定义,能正确执行语句,请问执行完此语句后共调用该类的构造函数次数为___

AB a(4),b(5),c[3],*p[2]={&a,&b};

A. 5

B. 4

C. 3

D. 9

正确答案:A

题解:

         a对象与b对象后面是圆括号,因此分别都用后面的4与5进行构造,这就调用了2次了,c对象是一个数组,数组中每个元素都是AB类对象,因此又调用了3次,一共调用5次了;p对象是一个数组,数组中存放的是AB类对象的指针,并不会调用AB类构造函数,故一共调用5次,选A;

4、下列关于赋值运算符“=”重载的叙述中,正确的是

A. 赋值运算符只能作为类的成员函数重载

B. 默认的赋值运算符实现了“深层复制”功能

C. 重载的赋值运算符函数有两个本类对象作为形参

D. 如果己经定义了复制拷贝构造函数,就不能重载赋值运算符

正确答案:A

题解:

         A选项,赋值运算符只能作为类的成员函数重载,正确;B选项,赋值运算符只实现了简单的浅拷贝;C选项,赋值运算符只有一个本类对象作为形参,另一个是隐藏的this指针;D选项,完全没道理;

5、下列有关静态成员函数的描述中,正确的是:

A. 静态数据成员(非const类型)可以在类体内初始化

B. 静态数据成员不可以被类对象调用

C. 静态数据成员不受private控制符作用

D. 静态数据成员可以直接用类名调用

正确答案:D

题解:

         A选项,非const静态数据成员只能在类内声明,类外初始化,因为它不属于某个对象,而属于整个类,因此不能再类体内初始化;B选项,静态数据成员可以使用类对象调用;C选项,静态数据成员也属于类的成员,只要是类的成员都会被访问限定符限定;D选项,正确;

6、若PAT是一个类,则程序运行时,语句“PAT(*ad)[3];”调用PAT的构造函数的次数是()

A. 2

B. 3

C. 0

D. 1

正确答案:C

题解:

         首先我们观察ad是一个指针,其指向的对象是PAT类型的一个数组,数组中有3个元素;但ad仅仅只是一个指针,并不会调用构造函数;故选C

7、下面对析构函数的正确描述是()

A. 系统不能提供默认的析构函数

B. 析构函数必须由用户定义

C. 析构函数没有参数

D. 析构函数可以设置默认参数

正确答案:C

题解:

         A选项,当我们不显式定义析构函数时,编译器会帮我们生成一个默认的析构函数;该析构函数对内置成员不做任何处理,对自定义类型成员则是调用它们的析构函数;B选项,析构函数也可以由编译器帮我们生成;C选项正确,故D选项错误;

8、关于以下代码,哪个说法是正确的()

myClass::foo()
{
    delete this;
}

void func()
{
    myClass *a = new myClass();
    a->foo();
}

A. 它会引起栈溢出

B. 都不正确

C. 它不能编译

D. 它会引起段错误

正确答案:B

题解:

         首先表明,这段代码并没有什么问题的,foo是类内成员函数,其作用是销毁自己,而func函数首先是new了一个myClass类对象,然后调用foo函数销毁这个new出来的对象;

9、哪种说法是错误的()?

A. 构造函数可以有形参

B. 析构函数可以有形参

C. 构造函数无任何函数类型

D. 析构函数无任何函数类型

正确答案:B

题解:

         前面我们也说过析构函数没有形参,其他选项正确;

10、有如下模板定义:在下列对fun的调用中,错误的是()

template <class T>
T fun(T x,T y)
{
    return x*x+y*y;
}

A. fun(1, 2)

B. fun(1.0, 2)

C. fun(2.0, 1.0)

D. fun<float>(1, 2.0)

正确答案:B

题解:

        A选项,类模板参数T编译时识别成int类型,生成一套int类型的函数;B选项,由于参数由两种类型,编译时编译器不知把T识别成哪种类型,会产生二义性,故错误;C选项,类模板参数T编译时识别成double类型,生成一套double类型的函数;D选项,调用处显示声明类模板生成一套float的接口,参数一隐式类型转换成float类型;

四、编程题题解

1、最近公共祖先

思路:将给出的两个结点大小进行比较,如果不相等,大的那个结点往上找父亲结点;

比如2和6,2和6不相等,6比较大,因此6往上找父亲3,接着继续比较还是不相同,3比较大,继续向上找父亲1,还是继续比较还是不同,2比较大,2往上找父亲1,此时再比较,相同,故1是他们的最近公共祖先;这题比较简单,感兴趣的大家可以去leetcode上找同名题,那题难度比这题就大很多;本题代码如下;

class LCA {
public:
    int getLCA(int a, int b) 
    {
        while(a != b)
        {
            // 谁大谁找父亲
            if(a > b)
                a /= 2;
            else 
                b /= 2;
        }
        return a;
    }
};

2、求最大连续bit数

思路:本题主要是考察对位运算的使用,这里我们定义一个当前1的个数,与1的最大个数,用1与目标数字的每个比特位进行,如果遇到遇到1就给当前1的个数的变量反复++,遇到0,就开始于最大1个数进行比较,若大于则更新最大连续1的个数;具体代码如下;

#include <iostream>
using namespace std;

int main() 
{
    int num;
    cin >> num;
    int a = 1;
    int ret = 0;
    for(int i = 0; i < 32; i++)
    {
        int count = 0;
        while((num & (a << i)) != 0)
        {
            count++;
            i++;
        }
        // 如果本次连续的1个数大于ret则更新
        if(count > ret)
            ret = count;
    }
    cout << ret << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值