1.设置地址为0x67a9的整型变量的值为0xaa66int*ptr;ptr=(int*)0x67a9;*ptr=0xaa66;说明:这道题就是强制类型转换的典型例子,无论在什么平台地址长度和整型数据的长度是一样的,即一个整型数据可以强制转换成地址指针类型,只要有意义即可。2.函数传参获取数组长度的方法templatetypenameT,intNvoidprintlen(T(&c)[N]){coutc[]length:sizeof(c)endl;coutNendl;}intmain(intargc,char*argv[]){intp[]={1,2,3,4,5};printlen(p);}这是一种非类型模板形参,在需要常量表达式的时候可使用非类型模板形参。如上例,当调用printlen函数时编译器从数组实参中读取intN的值3.memset和memcpy#includecstringmemcpy原型:externvoid*memcpy(void*dest,void*src,unsignedintcount);功能:由src所指内存区域复制count个字节到dest所指内存区域。说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。memset包含:externvoid*memset(void*buffer,intc,intcount);功能:把buffer所指内存区域的前count个字节设置成字符c。说明:返回指向buffer的指针。4.C++的空类有哪些成员函数缺省构造函数。缺省拷贝构造函数。缺省析构函数。缺省赋值运算符。缺省取址运算符。缺省取址运算符const。5.写出floatx与“零值”比较的if语句。if(x0.000001&&x-0.000001)6.Internet采用哪种网络协议?该协议的主要层次结构?Tcp/Ip协议主要层次结构为:应用层/传输层/网络层/数据链路层/物理层7.Internet物理地址和IP地址转换采用什么协议?ARP(AddressResolutionProtocol)(地址解析協議)8.IP地址的编码分为哪俩部分?IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。9.变量的声明和定义有什么区别为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。10.sizeof和strlen的区别sizeof和strlen有以下区别:是一个操作符,strlen是库函数。的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\0‘的字符串作参数。编译器在编译时就计算出了sizeof的结果。而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。数组做sizeof的参数不退化,传递给strlen就退化为指针了。11.C中的malloc和C++中的new有什么区别malloc和new有以下不同:(1)new、delete是操作符,可以重载,只能在C++中使用。(2)malloc、free是函数,可以覆盖,C、C++中都可以使用。(3)new可以调用对象的构造函数,对应的delete调用相应的析构函数。(4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数(5)new、delete返回的是某种数据类型指针,malloc、free返回的是void指针12.一个指针可以是volatile吗volatile类似于大家所熟知的const也是一个类型修饰符。volatile是给编译器的指示来说明对它所修饰的对象不应该执行优化。volatile的作用就是用来进行多线程编程。可以,因为指针和普通变量一样,有时也有变化程序的不可控性。常见例:子中断服务子程序修改一个指向一个buffer的指针时,必须用volatile来修饰这个指针13.static有什么用途?对于局部变量改变其生存期,对于全局变量改变其可见性主要从两个方面考虑:(1)静态存储:a.函数体内static变量的作用范围为该函数体,该内存在静态数据区上分配且只被分配一次,下次再调用该函数时依然维持上一次的值。b.类中的static成员变量属于整个类所有,对类的所有对象只有一份拷贝c.在类中的static成员函数属于整个类所拥有,这个函数不接受this指针,因而只能访问类的static成员变量。(2)控制名字可见性a.在模块内的static全局变量可以被模块内的所有函数访问,但是不能被模块外的其他函数访问b.在模块内的static成员函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内。14.引用与指针有什么区别1)引用必须被初始化,指针不必。2)引用初始化以后不能被改变,指针可以改变所指的对象。3)不存在指向空值的引用,但是存在指向空值的指针。15.描述实时系统的基本特性在特定时间内完成特定的任务,实时性与可靠性。16.简述C、C++程序编译的内存分配情况C、C++中内存分配方式可以分为三种:(1)从静态存储区域分配:内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static变量等。(2)在栈上分配:在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(3)从堆上分配:即动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活。如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。一个C、C++程序编译时内存分为5大存储区:堆区、栈区、全局区、文字常量区、程序代码区17.谈谈你对拷贝构造函数和赋值运算符的认识拷贝构造函数和赋值运算符重载有以下两个不同之处:(1)拷贝构造函数生成新的类对象,而赋值运算符不能。(2)由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新建对象相同。而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要先把内存释放掉注意:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认的。18.不能被继承的类(1)构造函数private此时我们可以通过static成员函数获得该类的实例(我们只能得到位于堆上的实例)classFinalClass1{public:staticFinalClass1*GetInstance(){returnnewFinalClass1;}staticvoidDeleteInstance(FinalClass1*pInstance){deletepInstance;pInstance=0;}private:FinalClass1(){}~FinalClass1(){}};(2)想法:实现一个和一般类除了不能被继承之外其他用法都一样的类templatetypenameTclassMakeFinal{friendT;private:MakeFinal(){}~MakeFinal(){}};classFinalClass2:virtualpublicMakeFinalFinalClass2{public:FinalClass2(){}~FinalClass2(){}};此时FinalClass2就不能再被继承了,由于类FinalClass2是从类MakeFinalFinalClass2虚继承过来的,在调用Try的构造函数的时候,会直接跳过FinalClass2而直接调用MakeFinalFinalClass2的构造函数。(虚继承的一个特征就是虚基类的构造函数由最终子类负责构造)非常遗憾的是,Try不是MakeFinalFinalClass2的友元,因此不能调用其私有的构造函数。基于上面的分析,试图从FinalClass2继承的类,一旦实例化,都会导致编译错误,因此是FinalClass2不能被继承。这就满足了我们设计要求。19.访问基类的私有虚函数很好的题目,借这个题目学习虚函数。解题思路就是:虽然不能通过对象调用这个虚函数,但是因为虚函数会在子类的那段内存中保存虚函数表的入口地址,拿到虚函数的地址就可以转换成函数指针来调用他。下面主要解释这一行代码:pFun=(Fun)*((int*)*(int*)(&b)+i);(1)在子类内存空间中最开始(就是子类对象的地址&b)的地方存了一个指向虚函数表的指针(这里的最开始的说法应该是大多数编译器的做法),为了获得这个指向虚函数表的指针,需要做这个操作*(int*)&b,解释:对象b的地址强制转换成一个int指针(因为地址都是整型数),然后再解引用该指针获得虚表的指针值。(2)再做一次(int*)获得虚表首地址的值,然后+i,每次+1都指向下一个虚函数的入口地址(3)最后(Fun),将虚函数入口地址强制转换为函数指针,用函数指针来完成这个私有虚函数的调用。#includeiostream.hclassA{virtualvoidg(){coutA::gendl;}private:virtualvoidf(){coutA::fendl;}};classB:publicA{voidg(){coutB::gendl;}virtualvoidh(){coutB::hendl;}};typedefvoid(*Fun)(void);voidmain(){Bb;FunpFun;for(inti=0;i3;i++){pFun=(Fun)*((int*)*(int*)(&b)+i);pFun();}}20.类成员函数的重载、重写和隐藏成员函数被重载的特征(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual关键字可有可无。覆盖是指派生类函数覆盖基类函数,特征是(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual关键字。“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)21.简述多态实现的原理编译器发现一个类中有虚函数,便会立即为此类生成虚函数表vtable。虚函数表的各表项为指向对应虚函数的指针。编译器还会在此类中隐含插入一个指针vptr(对vc编译器来说,它插在类的第一个位置上)指向虚函数表。调用此类的构造函数时,在类的构造函数中,编译器会隐含执行vptr与vtable的关联代码,将vptr指向对应的vtable,将类与此类的vtable联系了起来。另外在调用类的构造函数时,指向基础类的指针此时已经变成指向具体的类的this指针,这样依靠此this指针即可得到正确的vtable,。如此才能真正与函数体进行连接,这就是动态联编,实现多态的基本原理。22.inline使用内联函数应注意的事项内联函数具有一般函数的特性,它与一般函数所不同之处只在于函数调用的处理。一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换。在使用内联函数时,应注意如下几点:1.在内联函数内不允许用循环语句和开关语句。如果内联