目录
一、选择题
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;
}