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;
int y: 4;
int z: 5;
double a;
}
【数据结构:位域!x,y,z是一个int型的3个位域,所以以int(4个字节)来计算】
求sizeof(s): 答案16 内存对齐!内存对齐!内存对齐!需要补一个4字节,构成8-8字节对齐
3、求下列程序输出
#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;
}
答案: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.
7、
(1)只能使用成员函数重载的运算符有:=、()、[]、->、new、delete。
(2)单目运算符最好重载为成员函数。
(3) 对于复合的赋值运算符如+=、-=、*=、/=、&=、!=、~=、%=、>>=、<<=建议重载为成员函数。
(4) 对于其它运算符,建议重载为友元函数。
8、
#define M(x,y,z) x*y+z
main()
{
int a=1, b=2, c=3;
printf("%d/n",M(a+b,b+c,c+a));
}
答案是:12 #define 边界效应:
(a+b)X(b+c)+c+a变成了a+bXb+c+c+a
9、
#include
void fun ( char *p,int n )
{
char b [6] = "abcde"; int i;
for ( i = 0,p = b;i < n;i + + )
p [i] = b [i];
}
main( )
{
char a [6] = "ABCDE";
fun (a,5);
printf ("%s\n",A ) ;
}
程序运行后的输出结果是?
由于 p=b那一句使得a的内容并没有变
10、
代码执行后,a和b的值分别为?
class Test{
public:
int a;
int b;
virtual void fun() {}
Test(int temp1 = 0, int temp2 = 0)
{
a=temp1 ;
b=temp2 ;
}
int getA()
{
return a;
}
int getB()
{
return b;
}
};
int main()
{
Test obj(5, 10);
// Changing a and b
int* pInt = (int*)&obj;
*(pInt+0) = 100;
*(pInt+1) = 200;
cout << "a = " << obj.getA() << endl;
cout << "b = " << obj.getB() << endl;
return 0;
}
输出为 200 10
*(pInt+0)指向的是虚函数表指针
(pInt+1)和(pInt+2)分别指向a和b
11、求sizeof(A) sizeof(B) sizeof(C)大小
struct A{
A() {}
~A() {}
int m1;
int m2;
};
struct B:A{
B() {}
~B() {}
int m1;
char m2;
static char m3;
};
struct C{
C() {}
virtual~C() {}
int m1;
short m2;
};
答案:8/16(8+8)/12
12、给出以下定义,下列哪些操作是合法的?
char a[] = "hello";
char b[] = "world";
const char *p1 = a;
char* const p2 = b;
合法的有:
p1++;
p2[2]='I';
反过来不合法