题目整理(2)

1. 选择题

  1. 某函数申明如下()
    有int a,下面使用正确的为:
    A. Func(a)
    B. Func(&a)
    C. Func(*a)
    D. Func(&(*a))

答案:A
解释:
传引用传的是变量的别名,因此只需要单独传变量a即可,因此选A

  1. 关于以下代码:
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]配合起来使用

  1. 动态内存分配(C语言中malloc,C++中的new)得到的存储区属于内存中的:
    A. 静态区
    B. 堆(heap)
    C. 栈(stack)
    D. 堆栈
    E. 内核内存
    F. 不确定

答案:B

  1. 下列静态数据成员的特性中,错误的是()
    A. 引用静态数据成员时,要在静态数据成员名前加<类名>和作用域符号
    B. 说明静态数据成员时前边要加关键字static来修饰
    C. 静态数据成员在类体外进行初始化
    D. 静态数据成员不是所有对象所共有的

答案:D
解释:
静态成员变量是所有这个类的对象共享的,并不单独属于某个对象,因此静态成员变量都是在类内声明,类外单独进行定义,一定不能在构造函数初始化列表进行初始化,在类外访问静态成员变量时,可以通过: 对象.静态成员 /类名::静态成员 来访问.
因此选D

  1. 用class关键字定义的类,其成员默认的访问属性为()
    A. private
    B. protected
    C. public
    D. 无定义

答案:A
解释:
class所定义的类默认访问权限是private
struct所定义的类默认访问权限是public

  1. 在重载一个运算符为成员函数时,其参数表中没有任何参数,这说明该运算符是 ( )。
    A. 无操作数的运算符
    B. 二元运算符
    C. 前缀一元运算符
    D. 后缀一元运算符

答案:C
解释:
一元运算符指的是该运算符只需要一个参数 比如++ –
而在重载运算符为成员函数时,有一个默认参数时this指针,因此没有任何参数时实际上是有一个参数的,因此这个运算符只能是前缀一元运算符,而后缀的话需要在参数里加上一个(int)
例如:前缀++/-- operator++() operator–() 后缀++/-- operator++(int) operator–(int)

  1. 有如下程序:
#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

  1. 下面有关c++静态数据成员,说法正确的是()
    A. 不能在类内初始化
    B. 不能被类的对象调用
    C. 不能受private修饰符的作用
    D. 可以直接用类名调用

答案:D
解释:
A:加了const的静态成员变量可以在类内进行初始化,例 : const static int a = 10 ;
B:可以被类的对象调用
C:受private修饰符的作用
D:正确 类名::静态成员变量

  1. 在C++中,为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该()
    A. 将构造函数设为私有
    B. 将析构函数设为私有
    C. 将构造函数和析构函数均设为私有
    D. 没有办法能做到

答案:B

  1. 下列的模板声明中,其中几个是正确的()
    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. 在这里插入图片描述
    解题思路:因为不能使用算数运算符,因此从二进制角度来考虑,在二进制角度下,两个数需要相加时,无非就是进不进位的问题,因此利用位运算符:
    例如: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);
}
};

  1. 在这里插入图片描述
    利用递归的思想:
#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值