1. 选择题
- 某函数申明如下()
有int a,下面使用正确的为:
A. Func(a)
B. Func(&a)
C. Func(*a)
D. Func(&(*a))
答案:A
解释:
传引用传的是变量的别名,因此只需要单独传变量a即可,因此选A
- 关于以下代码:
ClassA *pclassa=new ClassA[5];
delete pclassa;
C++语言中,类ClassA的构造函数和析构函数的执行次数分别为()
A. 5,1
B. 1,1
C. 5,5
D. 1,5
答案:A
解释:
C语言中从堆中申请内存的方式有三种:malloc,realloc,calloc,释放:free
C++语言中:new/new[]
释放:delete/delete[]
这几种申请和释放方式一定要匹配起来使用,否则可能会产生内存泄漏或程序崩溃
因此,在上述代码中,new了5个连续的空间,因此调用了5次构造函数,而只delete了一次,因此只调用了一次析构函数,因此选A
但是此题中应该使用delete[5]和new T[5]配合起来使用
- 动态内存分配(C语言中malloc,C++中的new)得到的存储区属于内存中的:
A. 静态区
B. 堆(heap)
C. 栈(stack)
D. 堆栈
E. 内核内存
F. 不确定
答案:B
- 下列静态数据成员的特性中,错误的是()
A. 引用静态数据成员时,要在静态数据成员名前加<类名>和作用域符号
B. 说明静态数据成员时前边要加关键字static来修饰
C. 静态数据成员在类体外进行初始化
D. 静态数据成员不是所有对象所共有的
答案:D
解释:
静态成员变量是所有这个类的对象共享的,并不单独属于某个对象,因此静态成员变量都是在类内声明,类外单独进行定义,一定不能在构造函数初始化列表进行初始化,在类外访问静态成员变量时,可以通过: 对象.静态成员 /类名::静态成员 来访问.
因此选D
- 用class关键字定义的类,其成员默认的访问属性为()
A. private
B. protected
C. public
D. 无定义
答案:A
解释:
class所定义的类默认访问权限是private
struct所定义的类默认访问权限是public
- 在重载一个运算符为成员函数时,其参数表中没有任何参数,这说明该运算符是 ( )。
A. 无操作数的运算符
B. 二元运算符
C. 前缀一元运算符
D. 后缀一元运算符
答案:C
解释:
一元运算符指的是该运算符只需要一个参数 比如++ –
而在重载运算符为成员函数时,有一个默认参数时this指针,因此没有任何参数时实际上是有一个参数的,因此这个运算符只能是前缀一元运算符,而后缀的话需要在参数里加上一个(int)
例如:前缀++/-- operator++() operator–() 后缀++/-- operator++(int) operator–(int)
- 有如下程序:
#include<iostream>
using namespace std;
class MyClass{
public:
MyClass(int i=0){cout<<1;}
MyClass(const MyClass&x){cout<<2;}
MyClass& operator=(const MyClass&x){cout<<3; return*this;}
~MyClass(){cout<<4;}
};
int main(){
MyClass obj1(1),obj2(2),obj3(obj1);
return 0;
}
运行时的输出结果是
A. 121,444
B. 112,444
C. 11,114,444
D. 11,314,445
E. 11,314,444
答案:B
解释:
obj1 调用构造函数 输出1
obj2 调用构造函数 输出1
obj3 调用拷贝构造 输出2
程序结束,调用3次析构 输出444
- 下面有关c++静态数据成员,说法正确的是()
A. 不能在类内初始化
B. 不能被类的对象调用
C. 不能受private修饰符的作用
D. 可以直接用类名调用
答案:D
解释:
A:加了const的静态成员变量可以在类内进行初始化,例 : const static int a = 10 ;
B:可以被类的对象调用
C:受private修饰符的作用
D:正确 类名::静态成员变量
- 在C++中,为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该()
A. 将构造函数设为私有
B. 将析构函数设为私有
C. 将构造函数和析构函数均设为私有
D. 没有办法能做到
答案:B
- 下列的模板声明中,其中几个是正确的()
1)template
2)template<T1,T2>
3)template<class T1,T2>
4)template<class T1,class T2>
5)template<typename T1,T2>
6)template<typename T1,typename T2>
7)template<class T1,typename T2>
8)<typename T1,class T2>
A. 2
B. 3
C. 4
D. 5
答案:B
2.编程题
解题思路:因为不能使用算数运算符,因此从二进制角度来考虑,在二进制角度下,两个数需要相加时,无非就是进不进位的问题,因此利用位运算符:
例如:1+3
00000001
00000011
相加后的二进制不考虑进位(用^运算符):00000010
相加后的进位(用&运算符再<<1):00000010
此时将新得到的两个数继续进行次操作:
相加后的二进制不考虑进位(用^运算符):00000000
相加后的进位(用&运算符再<<1):00000100
此时不为0的数就是需要得到的值,因此可以用递归来进行重复求解直到求出最终结果:
代码实现:
class UnusualAdd {
public:
int addAB(int A, int B) {
if(A == 0)
{
return B;
}
if(B == 0)
{
return A;
}
int a = A ^ B;
int b = (A&B) << 1;
return addAB(a , b);
}
};
利用递归的思想:
#include<iostream>
using namespace std;
int number(int n , int m)
{
if(n == 0 || m == 0)
{
return 1;
}
return number(n,m-1) + number(n-1,m);
}
int main()
{
int n , m ;
cin>>n>>m;
cout<<number(n,m)<<endl;
return 0;
}