C/C++ 经典测试题练习
1、有函数定义:
void test(int a){}
void test(float a){}
则以下调用错误的是:D
A. test(1);
B. test(‘c’);
C. test(2+’d’)
D. test(0.5) 【默认const double 无法匹配int 和 float】
2、struct s
{
int x: 3; 【数据结构:位域!x,y,z是一个int型的3个位域,所以以int(4个字节)来计算】
int y: 4;
int z: 5;
double a;
}
求sizeof(s): 答案16 内存对齐!内存对齐!内存对齐!需要补一个4字节,构成8-8字节对齐
3、求下列程序输出
<p class="p0">
#include "stdio.h"
class A
{
public:
A()【构造函数】
{
printf("1");
}
A(A &a)【拷贝构造函数】
{
printf("2");
}
A &operator=(const A &a)【重载的赋值函数】
{
printf("3");
return *this;
}
};
int main()
{
A a;
A b = a;
}
</p>
答案:12
A a,定义一个对象,毫无疑问调用构造函数
A b=a,这是定义了对象b,且以a对b进行初始化,这个时候需要调用拷贝构造函数。如果写成A a;A b;b=a;则是调用后面重载的赋值函数,这种情况应该输出113。 这个题主要考察赋值和初始化的区别。
4、MFC类库中,为何CObject的析构函数是虚拟的?为什么构造函数不能为虚?
答:1. 将CObject的析构函数设成virtual的,则所有其派生类的析构函数都会自动变为virtual型,这保证了在所有情况下,不会出现派生类的析构函数未被调用导致的内存泄露(如基类定义的指针指向派生类对象)。2. 虚调用是一种可以再只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数。但创建对象的时候必须要知道对象的准确类型,因此构造函数不能为虚。
(另外,使用虚函数是有代价的,每一个虚函数对象必须维护一个V表,使用虚函数会产生系统开销,所以小类不想派生其他类,就没必要用虚函数)。
5、关于拷贝构造函数
6、多态性是允许你将父对象设置成为和它一个或多个子对象相等的技术,父对象可以根据当前赋值给它的子对象的特性以不同的方式运作。主要通过虚函数来实现。覆盖是子类重新定义父类的虚函数的做法。重载是指允许多个同名函数,而这些函数的参数表不同。重载与多态无关,覆盖与多态相关。多态的目的->接口重用。例如:定义一个飞机的基类,直升机和喷气式飞机的子类,要让一个全局的函数plane_fly起飞所有种类的飞机,只需要plane_fly(const ppplane:plane)就行了,不管来什么飞机,都会根据飞机的特性起飞,即parent=child.
版权声明:本文为博主原创文章,未经博主允许不得转载。