C++笔试题库之编程、问答题 150~200道(四)

2014-11-23 23:42:02 · 作者: · 浏览: 25
;


void print(A a)


{


a.print();


}


void main(void)


{


A a, *pa,*pb,*pc;


B b;


C c;


pa=&a;


pb=&b;


pc=&c;


a.print();


b.print();


c.print();


pa->print();


pb->print();


pc->print();


print(a);


print(b);


print(c);


}



A::print()


A::print()


B::print()


C::print()


A::print()


B::print()


C::print()


A::print()


A::print()


A::print()



————————————————————————–


194.程序改错


class mml


{


private:


static unsigned int x;


public:


mml(){ x++; }


mml(static unsigned int &) {x++;}


~mml{x–;}


pulic:


virtual mon() {} = 0;


static unsigned int mmc(){return x;}


……



};


class nnl:public mml


{


private:


static unsigned int y;


public:


nnl(){ x++; }


nnl(static unsigned int &) {x++;}


~nnl{x–;}


public:


virtual mon() {};


static unsigned int nnc(){return y;}


……


};



代码片断:


mml* pp = new nnl;


……….


delete pp;




A:


基类的析构函数应该为虚函数


virtual ~mml{x–;}



————————————————————————–


195.101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。


答:


101个先取出2堆,


33,33


第一次称,如果不相等,说明有一堆重或轻


那么把重的那堆拿下来,再放另外35个中的33


如果相等,说明假的重,如果不相等,新放上去的还是重的话,说明假的轻(不可能新放上去的轻)



第一次称,如果相等的话,这66个肯定都是真的,从这66个中取出35个来,与剩下的没称过的35个比


下面就不用说了



方法二:


第3题也可以拿A(50),B(50)比一下,一样的话拿剩下的一个和真的比一下。


如果不一样,就拿其中的一堆。比如A(50)再分成两堆25比一下,一样的话就在


B(50)中,不一样就在A(50)中,结合第一次的结果就知道了。



196.写出程序结果:


void Func(char str[100])


{


printf(“%d\n”, sizeof(str));


}



答:


4


分析:


指针长度



197.int id[sizeof(unsigned long)];


这个对吗?为什么


答:



这个 sizeof是编译时运算符,编译时就确定了


可以看成和机器有关的常量。



198、 sizeof应用在结构上的情况


请看下面的结构:


struct MyStruct


{


double dda1;


char dda;


int type


};


对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少呢?也许你会这样求:


sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13


但是当在VC中测试上面结构的大小时,你会发现sizeof(MyStruct)为16。你知道为什么在VC中会得出这样一个结果吗?


其实,这是VC对变量存储的一个特殊处理。为了提高CPU的存储速度,VC对一些变量的起始地址做了”对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。下面列出常用类型的对齐方式(vc6.0,32位系统)。


类型


对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)


Char


偏移量必须为sizeof(char)即1的倍数


int


偏移量必须为sizeof(int)即4的倍数


float


偏移量必须为sizeof(float)即4的倍数


double


偏移量必须为sizeof(double)即8的倍数


Short


偏移量必须为sizeof(short)即2的倍数


各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍



199


#include “stdafx.h”


Y n P }2{&k O v H `,o0


#define SQR(X) X*X


int main(int argc, char* argv[])


{


int a = 10;


int k = 2;


int m = 1;


a /= SQR(k+m)/SQR(k+m);


printf(“%d\n”,a);


return 0;


}


这道题目的结果是什么啊


define 只是定义而已,在编择时只是简单代换X*X而已,并不经过算术法则的


a /= k+m*k+m/k+m*k+m;


=>a /= (k+m)*1*(k+m);


=>a = a/9;


=>a = 1;



200.下面的代码有什么问题?



void DoSomeThing(…)


{


char* p;


p = malloc(1024); // 分配1K的空间


2y x


if (NULL == p)


return;


p = realloc(p, 2048); // 空间不够,重新分配到2K


if (NULL == p)


return;


}


A:


p = malloc(1024); 应该写成: p = (char *) malloc(1024);


没有释放p的空间,造成内存泄漏。