专门做焦点图的网站,房屋中介网站建设,做网站的价格是多少,做电影网站需要多大空间21. New delete 与malloc free 的联系与区别?答案#xff1a;都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象#xff0c;new 会自动调用对象的构造函数。delete 会调用对象的destructor#xff0c;而free 不会调用对象的des… 21. New delete 与malloc free 的联系与区别?答案都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象new 会自动调用对象的构造函数。delete 会调用对象的destructor而free 不会调用对象的destructor. 22. #define DOUBLE(x) xx i 5*DOUBLE(5) i 是多少答案i 为30。 23. 有哪几种情况只能用intialization list 而不能用assignment? 答案当类中含有const、reference 成员变量基类的构造函数都需要初始化表。 24. C是不是类型安全的答案不是。两个不同类型的指针之间可以强制转换用reinterpret cast)。C#是类型安全的。 25. main 函数执行以前还会执行什么代码答案全局对象的构造函数会在main 函数之前执行。 26. 描述内存分配方式以及它们的区别?1 从静态存储区域分配。内存在程序编译的时候就已经分配好这块内存在程序的整个运行期间都存在。例如全局变量static 变量。2 在栈上创建。在执行函数时函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。3 从堆上分配亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定使用非常灵活但问题也最多。 27.struct 和 class 的区别 答案struct 的成员默认是公有的而类的成员默认是私有的。struct 和 class 在其他方面是功能相当的。 从感情上讲大多数的开发者感到类和结构有很大的差别。感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位而类就象活的并且可靠的社会成员它有智能服务有牢固的封装屏障和一个良好定义的接口。既然大多数人都这么认为那么只有在你的类有很少的方法并且有公有数据这种事情在良好设计的系统中是存在的!时你也许应该使用 struct 关键字否则你应该使用 class 关键字。 28.当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少如果不是零请解释一下编译器为什么没有让它为零。Autodesk答案肯定不是零。举个反例如果是零的话声明一个class A[10]对象数组而每一个对象占用的空间是零这时就没办法区分A[0],A[1]…了。 29. 在8086 汇编下逻辑地址和物理地址是怎样转换的Intel答案通用寄存器给出的地址是段内偏移地址相应段寄存器地址*10H通用寄存器内地址就得到了真正要访问的地址。 30. 比较C中的4种类型转换方式 请参考http://blog.csdn.net/wfwd/archive/2006/05/30/763785.aspx重点是static_cast, dynamic_cast和reinterpret_cast的区别和应用。 31.分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句。答案BOOL : if ( !a ) or if(a)int : if ( a 0)float : const EXPRESSION EXP 0.000001 if ( a EXP a -EXP)pointer : if ( a ! NULL) or if(a NULL) 32.请说出const与#define 相比有何优点答案1 const 常量有数据类型而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换没有类型安全检查并且在字符替换可能会产生意料不到的错误。 2 有些集成化的调试工具可以对const 常量进行调试但是不能对宏常量进行调试。 33.简述数组与指针的区别数组要么在静态存储区被创建如全局数组要么在栈上被创建。指针可以随时指向任意类型的内存块。(1)修改内容上的差别char a[] “hello”;a[0] ‘X’;char *p “world”; // 注意p 指向常量字符串p[0] ‘X’; // 编译器不能发现该错误运行时错误(2) 用运算符sizeof 可以计算出数组的容量字节数。sizeof(p),p 为指针得到的是一个指针变量的字节数而不是p 所指的内存容量。C/C 语言没有办法知道指针所指的内存容量除非在申请内存时记住它。注意当数组作为函数的参数进行传递时该数组自动退化为同类型的指针。char a[] hello world;char *p a;cout sizeof(a) endl; // 12 字节cout sizeof(p) endl; // 4 字节计算数组和指针的内存容量void Func(char a[100]){cout sizeof(a) endl; // 4 字节而不是100 字节} 34.类成员函数的重载、覆盖和隐藏区别答案a.成员函数被重载的特征1相同的范围在同一个类中2函数名字相同3参数不同4virtual 关键字可有可无。b.覆盖是指派生类函数覆盖基类函数特征是1不同的范围分别位于派生类与基类2函数名字相同3参数相同4基类函数必须有virtual 关键字。c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数规则如下1如果派生类的函数与基类的函数同名但是参数不同。此时不论有无virtual关键字基类的函数将被隐藏注意别与重载混淆。2如果派生类的函数与基类的函数同名并且参数也相同但是基类函数没有virtual 关键字。此时基类的函数被隐藏注意别与覆盖混淆 35. There are two int variables: a and b, don’t use “if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers.答案( ( a b ) abs( a - b ) ) / 2 36. 如何打印出当前源文件的文件名以及源文件的当前行号答案cout __FILE__ ;cout__LINE__ ;__FILE__和__LINE__是系统预定义宏这种宏并不是在某个文件中定义的而是由编译器定义的。 37. main 主函数执行完毕后是否可能会再执行一段代码给出说明答案可以可以用_onexit 注册一个函数它会在main 之后执行int fn1(void), fn2(void), fn3(void), fn4 (void);void main( void ){String str(zhanglin);_onexit( fn1 );_onexit( fn2 );_onexit( fn3 );_onexit( fn4 );printf( This is executed first./n );}int fn1(){printf( next./n );return 0;}int fn2(){printf( executed );return 0;}int fn3(){printf( is );return 0;}int fn4(){printf( This );return 0;}The _onexit function is passed the address of a function (func) to be called when the program terminates normally. Successive calls to _onexit create a register of functions that are executed in LIFO (last-in-first-out) order. The functions passed to _onexit cannot take parameters. 38. 如何判断一段程序是由C 编译程序还是由C编译程序编译的答案#ifdef __cpluspluscoutc;#elsecoutc;#endif 39.文件中有一组整数要求排序后输出到另一个文件中答案 i ncludeiostream i ncludefstream using namespace std; void Order(vectorint data) //bubble sort{int count data.size() ;int tag false ; // 设置是否需要继续冒泡的标志位for ( int i 0 ; i count ; i){for ( int j 0 ; j count - i - 1 ; j){if ( data[j] data[j1]){tag true ;int temp data[j] ;data[j] data[j1] ;data[j1] temp ;}}if ( !tag )break ;}} void main( void ){vectorintdata;ifstream in(c://data.txt);if ( !in){coutfile error!;exit(1);}int temp;while (!in.eof()){intemp;data.push_back(temp);}in.close(); //关闭输入文件流Order(data);ofstream out(c://result.txt);if ( !out){coutfile error!;exit(1);}for ( i 0 ; i data.size() ; i)outdata[i] ;out.close(); //关闭输出文件流} 40. 链表题一个链表的结点结构struct Node{int data ;Node *next ;};typedef struct Node Node ; (1)已知链表的头结点head,写一个函数把这个链表逆序 ( Intel) Node * ReverseList(Node *head) //链表逆序{if ( head NULL || head-next NULL )return head;Node *p1 head ;Node *p2 p1-next ;Node *p3 p2-next ;p1-next NULL ;while ( p3 ! NULL ){p2-next p1 ;p1 p2 ;p2 p3 ;p3 p3-next ;}p2-next p1 ;head p2 ;return head ;}(2)已知两个链表head1 和head2 各自有序请把它们合并成一个链表依然有序。(保留所有结点即便大小相同Node * Merge(Node *head1 , Node *head2){if ( head1 NULL)return head2 ;if ( head2 NULL)return head1 ;Node *head NULL ;Node *p1 NULL;Node *p2 NULL;if ( head1-data head2-data ){head head1 ;p1 head1-next;p2 head2 ;}else{head head2 ;p2 head2-next ;p1 head1 ;}Node *pcurrent head ;while ( p1 ! NULL p2 ! NULL){if ( p1-data p2-data ){pcurrent-next p1 ;pcurrent p1 ;p1 p1-next ;}else{pcurrent-next p2 ;pcurrent p2 ;p2 p2-next ;}}if ( p1 ! NULL )pcurrent-next p1 ;if ( p2 ! NULL )pcurrent-next p2 ;return head ;}(3)已知两个链表head1 和head2 各自有序请把它们合并成一个链表依然有序这次要求用递归方法进行。 (Autodesk)答案Node * MergeRecursive(Node *head1 , Node *head2){if ( head1 NULL )return head2 ;if ( head2 NULL)return head1 ;Node *head NULL ;if ( head1-data head2-data ){head head1 ;head-next MergeRecursive(head1-next,head2);}else{head head2 ;head-next MergeRecursive(head1,head2-next);}return head ;} 41. 分析一下这段程序的输出 (Autodesk)class B{public:B(){coutdefault constructorendl;}~B(){coutdestructedendl;}B(int i):data(i) //B(int) works as a converter ( int - instance of B){coutconstructed by parameter data endl;}private:int data;}; B Play( B b) {return b ;} (1) results:int main(int argc, char* argv[]) constructed by parameter 5{ destructed B(5)形参析构B t1 Play(5); B t2 Play(t1); destructed t1形参析构return 0; destructed t2 注意顺序} destructed t1 (2) results:int main(int argc, char* argv[]) constructed by parameter 5{ destructed B(5)形参析构B t1 Play(5); B t2 Play(10); constructed by parameter 10return 0; destructed B(10)形参析构} destructed t2 注意顺序 destructed t1 42. 写一个函数找出一个整数数组中第二大的数 microsoft答案const int MINNUMBER -32767 ;int find_sec_max( int data[] , int count){int maxnumber data[0] ;int sec_max MINNUMBER ;for ( int i 1 ; i count ; i){if ( data[i] maxnumber ){sec_max maxnumber ;maxnumber data[i] ;}else{if ( data[i] sec_max )sec_max data[i] ;}}return sec_max ;} 43. 写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数。 KMP算法效率最好时间复杂度是(nm)。 44. 多重继承的内存分配问题 比如有class A : public class B, public class C {} 那么A的内存结构大致是怎么样的这个是compiler-dependent的, 不同的实现其细节可能不同。如果不考虑有虚函数、虚继承的话就相当简单否则的话相当复杂。可以参考《深入探索C对象模型》或者http://blog.csdn.net/wfwd/archive/2006/05/30/763797.aspx 45. 如何判断一个单链表是有环的注意不能用标志位最多只能用两个额外指针 struct node { char val; node* next;} bool check(const node* head) {} //return false : 无环true: 有环 一种On的办法就是搞两个指针一个每次递增一步一个每次递增两步如果有环的话两者必然重合反之亦然bool check(const node* head){ if(headNULL) return false; node *lowhead, *fasthead-next; while(fast!NULL fast-next!NULL) { lowlow-next; fastfast-next-next; if(lowfast) return true; } return false;}