1、下列运算符中,在C++语言中不能重载的是()
A、* B、>= C、:: D、delete
2、面关于多态性的描述,错误的是()
A、C++语言的多态性分为编译时的多态性和运行时的多态性 B、编译时的多态性可通过函数重载实现
C、运行时的多态性可通过模板和虚函数实现 D、实现运行时多态性的机制称为动态绑定
3、下面关于类和对象的描述中,错误的是()
A、类就是C语言中的结构体类型,对象就是C语言中的结构体变量 B、类和对象之间的关系是抽象和具体的关系
C、对象是类的实例,一个对象必须属于一个已知的类 D、类是具有共同行为的若干对象的统一描述体
4、引用标准库时,下面的说法你认为哪个是正确的()
A、语句#include “stdlib.h”是正确的,而且程序编译速度比#include <stdlib.h>要快
B、语句#include <stdlib.h>是正确的,而且程序编译速度比#include “stdlib.h”要快
C、语句#include <stdlib.h>和#include “stdlib.h”都是正确的,程序编译速度没有区别
D、语句#include “stdlib.h”是错误的
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
6、不能作为重载函数的调用的依据是
A、参数个数 B、参数类型 C、函数类型 D、函数名称
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; }
A、0 B、10 C、15 D、16
8、建立派生类对象时,3种构造函数分别是a(基类的构造函数)、b(成员对象的构造函数)、c(派生类的构造函数)这3种构造函数的调用顺序为()
A、abc B、acb C、cab D、cba
9、如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是
A、一元运算符 B、二元运算符 C、选项A和选项B都可能 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);
输出结果是()
A、3, 4 B、3, 5 C、-2, 5 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这个字符的哈夫曼编码值位数应该最长
12、下面描述不正确的是()
A、while循环语句的循环体至少执行1次 B、do-while循环可以写成while循环的格式
C、continue语句可以出现在各种循环体中 D、break语句不可以出现在循环体内
13、下面模板声明中,哪些是非法的()
A、template<class Type>class C1{};
B、template<class T, U, class V>class C2{};
C、template<class C1, typename C2>class C3{};
D、template<typename myT, class myT>class C4{};
14、拷贝构造函数的特点是()
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)
16、有一幢100层高的大楼,给你两个完全相同的玻璃围棋子。假设从某一层开始,丢下玻璃棋子就会破碎。那么怎么利用手中的两颗棋子,用一种什么样的最优策略,知道这个临界的层高呢?
17、用c++写一个函数,如Foo(const char *str),打印出str的全排列,如abc的全排列:abc, acb, bca, dac, cab,cba
18、求出一字符串中最长的数字串。比如as123cdf1234f,返回1234,char* FindNumber(char * out,char *in)。
1、C 2、C 3、A 4、B 5、C 6、C 7、D 8、A 9、D 10、D
11、ACD
12、ACD
13、BD
14、D
15、ABC
16、要使用最少的次数确定临界层高,我们讨论最优策略下的最坏情况。
使用平衡策略,不论每隔几层投掷,让投掷的总数次数相等。那么设每隔 m 层投掷一次,要使得投掷总次数一定,m向上应该是依次递减的,也就是:
m+m-1+m-2+m-3+......+1=100 推知:
3 < m < 14,
也就是说,最开始每隔14层1次,接下来每隔 13,12,11,10 ......层投一次。在这种情况下不论是在第几层棋子破了,投掷的总次数总是一定的。
17、参考代码:
#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; }
18、参考代码:
char* FindNumber(char* out, char* in) { int max = 0; char *begin = in, *end = NULL, *pos = NULL; while (*begin != '\0') { end = begin; while (*end != '\0' && isdigit(*end)) ++end; if (end - begin > max) { max = end - begin; pos = begin; } begin = end > begin ? end : begin + 1; } if (max > 0) { memcpy(out, pos, max); return out; } else return NULL; }