版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、附录一不同基数制的整数表示方式二进制八进制十进制十六进制000000000011110010222001133301004440101555011066601117771000010881001011991010012100xA(或0xa)1011013110xB(或0xb)1100014120xC(或0xc)1101015130xD(或0xd)1110016140xE(或0xe)1111017150xF(或0xf)附录二读取某些数据类型的最大和最小值的程序/ typeid_range.cpp/ Try to read limits of the types/ working, but not
2、 usable#include #include #include limit.h/copied from VC98INCLUDELIMITS with postfix addedtemplate struct typstatic void range()couttypeid(T).name( ): range is (;coutstd:numeric_limits:min(), ;coutstd:numeric_limits:max()endl;void main()typ:range( );typ:range( );typ:range( );typ:range( );/typ(unsign
3、ed):range( );/ not a member of global namespace/typ(long):range( );/ not a member of global namespace/typ(float):range( );/typ(double):range( );/typ(long double):range( );/* Results:char: range is (C, char(127)bool: range is (0, 1)short: range is (-32768, 32767)int: range is (-2147483648, 2147483647
4、)*/附录三ASCII码表十进制十六进制字符控制功能00空NUL11(笑脸)SOH22STX33ETX44EOT55ENQ66ACK77BEL(铃声)88退格99HT(Horizontal Tab)10ALF(Line Feed)11BVT(Vertical Feed)12CFF(Form Feed)13DCR(Carriage Return)14ESO15FSI1610DLE1711DC11812DC21913DC32014DC42115NAK2216SYN2317ETB2418CAN2519EM261ASUB271BESC(escape)281CFS291DGS301ERS311FUS32
5、20空格3321!3422”3523#3624$3725%3826&3927 4028(4129)422A*432B+442C,452D-462E.472F/48300493115032251333523445335554366553775638857399583A:593B;603C633F?64406541A6642B6743C6844D6945E7046F7147G7248H7349I744AJ754BK764CL774DM784EN794FO8050P8151Q8252R8353S8454T8555U8656V8757W8858X8959Y905AZ915B925C935D945E95
6、5F_(下划线)9660 9761a9862b9963c10064d10165e10266f10367g10468h10569i1066Aj1076Bk1086Cl1096Dm1106En1116Fo11270p11371q11472r11573s11674t11775u11876v11977w12078x12179y1227Az1237B1247C|1257D1267E1277FDEL (delete)附录四宏定义例子例1由于乘法运算符优先级高于加法运算符,宏替代中出错。/ macro_5.cpp#define SQ(x) x*x#include void main()int i = 3;c
7、out SQ(i+) endl;/ i+ * i+,即先i*i;再 i+;最后 i+;cout i endl;/* Results:95 */例2 凑巧成功的例子:/ macro_4.cpp#define DBL(x) x+x#include void main()int a = 2, b = 3;cout DBL(a*b) endl;/即a*b+a*b/* Result:12 */此程序未出错,是因为凑巧乘法的优先级高于加法。别心存侥幸,为稳妥起见,还是使用下式为好:#define DBL(x) (x)+(x)附录五逻辑判断语句if (j = i)和赋值及逻辑判断语句if (j = i)的区
8、别例1 /=and=_1.cpp#include void main()int i=10, j=30;if (j=i)coutiendl;elsecoutj+5endl;if (j=i)coutiendl;elsecoutj+5endl;/* Result:3510*/例2 /=and=_2.cpp/逻辑判断语句if (j = i)和赋值及逻辑判断语句if (j = i)的区别#include void main()int i=0, j=30;if (j=i)coutiendl;elsecoutj+5endl;if (j=i)coutiendl;elsecoutj+5endl;/* Resul
9、t:355*/附录六引用返回值用作等式左值时,可能产生错误结果,使用时应予注意。见下例:/ refer_11.cpp/ 引用返回值不应做左值的例子#include int hour = 5;int ret_val( int hr ); /函数原型int & ret_ref( int hr ); /函数原型void main( )couthourendl;/ 全局变量初始值ret_val( 10 );/ 可用于设值couthourendl;ret_ref(15);/ 也可用于设值couthourendl;ret_ref(20) = 74;/ 返回的变量引用用作左值时,应慎重couthour= 0
10、 & hr = 0 & hr 24 ) ? hr : 0;return hour; / DANGEROUS reference return/* Results:5101574(此例中引用返回值不应该用做左值)*/附录七中央处理单元(CPU)中的主要寄存器(一)寄存器组成:CPU内的寄存器是高速存储单元,可用比常用存储器高的多的速度读写数据。它们有时称为基本程序执行寄存器(basic program execution registers)。Intel的CPU一般具有8个32位通用寄存器,6个16位段寄存器,一个32位标志寄存器以及一个32位指令寄存器。前四个通用寄存器中(general-pu
11、rpose registers):AHALAXEAXEAX是扩展累加寄存器extended accumulator register,EBX是扩展基寄存器extended base register,ECX是扩展计数寄存器extended counting register,和EDX是扩展数据寄存器extended data register。它们可以按32位使用,也可按16位使用,还可按8位使用。以EAX为例,它按32位使用时称为EAX,按16位使用时称为AX,而按8位使用时分别称为AH(高8位)和AL(低8位)。如下图所示。另四个通用寄存器中:EBP是扩展帧指针寄存器extended fr
12、ame pointer register,ESP是扩展栈指针寄存器extended stack pointer register,ESI是扩展源变址寄存器extended source index register,和EDI是扩展目的变址寄存器extended destination index register。它们可按32位或16位使用。按16位使用时,它们分别称为BP、SP、SI和DI。(二)具体用途:EAX一般用于算术运算。在VC+ 6.0版本中,当函数具有返回值时,它还用于传送返回值给主函数(calling function)。ECX在循环运行时用作计数器。EBP主要用于函数调用,用
13、于访问栈上的函数参量和局部数据。一般不用于通常的算术运算或数据传递。ESP只用于堆栈运行,指向栈上的数据;绝不用于通常的算术运算或数据传递。ESI和EDI用于访问不同存储地址。段寄存器(segment registers)用于存放不同存储地址的段地址。CS用于存放程序指令的段地址,SS用于存放堆栈的段地址,DS用于存放数据的段地址等等。指令寄存器EIP(extended instruction pointer register)用于存放下一条将要执行的程序指令的地址。标志寄存器EFLAGS或Flags(extended flags register)中的各二进制位或用于控制CPU的运行或用于反
14、映CPU的工作状态。附录八进行new操作后,指向数组的指针经过delete操作后又被重新使用的例子/ new_4.cpp/ To show that after a pointer of an array is deleted,/ it is again used for another new operation of an array.#include void main()int *p;p=new int10;coutpendl;*p=8;coutp0endl;delete p;p=new int5;coutpendl;*p=20;coutp0endl;/* Results:0x0043
15、1AB080x00431AD020*/附录九自动数组与静态数组的不同状态/ static_array.cpp/ From fig04_13.cpp of Deitels book/ Static array is initialized to zero automatically#include void staticArray ( void );void autoArray ( void ); void main() cout First call to each function:n; staticArray (); autoArray (); cout nnSecond call to
16、each function:n; staticArray (); autoArray (); cout endl; / function to demonstrate a static local arrayvoid staticArray ( void ) static int array1 3 ; int i; cout nValues on entering staticArray :n; for ( i = 0; i 3; i+ ) cout array1 i = array1 i ; cout nValues on exiting staticArray :n; for ( i =
17、0; i 3; i+ ) cout array1 i = ( array1 i += 5 ) ; / function to demonstrate an automatic local arrayvoid autoArray ( void ) int i, array2 3 = 1, 2, 3 ; cout nnValues on entering autoArray :n; for ( i = 0; i 3; i+ ) cout array2 i = array2 i ; cout nValues on exiting autoArray :n; for ( i = 0; i 3; i+
18、) cout array2 i = ( array2 i += 5 ) setValue( v ); / call Implementations getValue function int jnterface:getValue() const return ptr-getValue(); 客户主文件/ implementation.cpp/ Fig. 7.10: fig07_10.cpp/ Hiding a classs private data with a proxy class./ to be linked with interface.obj#include #include int
19、erface.h void main() Interface i( 5 ); cout Implementation.value is i.getValue() before setValue( ) endl; i.setValue( 10 ); cout Implementation.value is i.getValue() after setValue( ) endl;/* Results:Implementation.value is 5 before setValue( )Implementation.value is 10 after setValue( )*/此处使用Implem
20、entation类的同一个公有接口生成代理类的定义。代理类的唯一私有成员是Implementation类对象的指针。利用指针可以隐藏Implementation类的实现细节。而Interface类是Implementation类的代理类。注意在Interface类中提到Implementation类时只有一条指针说明,即:class Implementation; / forward class declaration当一个类定义(如Interface类)只用另一个类(如Implementation类)的指针时,另一个类的头文件不需要用#include语句包含在内,而只需使用“提前类说明“(f
21、orward class declaration)将另一个类说明为一种数据类型即可。实现文件包含代理类Interface的成员函数,这是唯一包含Implementation类所在头文件implementation.h的文件。文件interface.cpp以预编译对象文件形式和头文件interface.h一起提供给客户,该头文件包含代理类提供服务的函数原型。而客户无法看到代理类与私有成员之间的交互操作。注意,主程序中只包含Interface类的头文件,而没有提到Implementation类。因此,客户根本不知道Implementation类的私有数据。附录十二为数组动态分配空间时构造函数和析构
22、函数的调用/ obj_arr.cpp/ 王燕书p.68例6的扩充#include class pointint x, y;public:point (int vx=8, int vy = 16)x = vx; y = vy; cout constructorn;point ()cout destructorn;void print () cout x y endl; ;void main()point *p1;p1 = new point3;if ( !p1)cout allocation failure!n;return;for ( int j = 0; j 3; j+)p1j.print(
23、);delete p1;/* Results:constructorconstructorconstructor8 168 168 16destructordestructordestructor*/附录十三 5.3.5“自增和自减运算符重载”的补充例子例3类的数据成员的前置自减和后置自减操作/ overld_- -.cpp/Overloading of pre-decremental and post-decremental operators#include class number int num;public: number(int n = 1)/ constructornum = n
24、; number& operator-(); / pre-decrement operator number operator-( int ); / post-decrement operator friend ostream &operator( ostream &, const number & ); / Pre-decrement operator overloaded as a member function.number& number:operator- -()-num;return *this; / reference return to create an left value
25、 / Post-decrement operator overloaded as a member function./ Note that the dummy integer argument does not have any/ argument name.number number:operator-( int ) / value return; not a reference returnnumber temp = *this;num-;/ return non-decremented, saved, temporary objectreturn temp;ostream &opera
26、tor( ostream &out, const number& nn)cout nn.num;return out;/ Driver for class numbervoid main()number n1(7), n2; cout n1.num is n1 endl;cout n2.num is n2 endl endl; cout Testing the pre-decremental operator:n Operation : n2 = -n1 n;cout n1.num was n1 n;n2 = -n1;cout Now n1.num is n1 n;cout Now n2.nu
27、m is n2 nn;cout Testing the post-decremental operator:n Operation : n2 = n1- n;cout n1.num was n1 n;n2 = n1-;cout Now n1.num is n1 n;cout Now n2.num is n2 n;/* Results: n1.num is 7n2.num is 1 Testing the pre-decremental operator:Operation : n2 = -n1 n1.num was 7Now n1.num is 6Now n2.num is 6 Testing
28、 the post-decremental operator:Operation : n2 = n1- n1.num was 6Now n1.num is 5Now n2.num is 6*/附录十四“构造函数的类型转换功能”中的补充例子具有两个形参的类型转换构造函数/ type_conv_12.cpp/ modified version of type_conv_11.cpp/ To show you can use conversion constructor with two / arguments#include class Ddouble d, f;public:D(
29、) d=0; coutdefault CONSendl;D(double i) d=i;coutinitializing CONSendl;D(D & obj) d=obj.d;coutcopying CONSendl;D(int i, int j)/ type conversion performedd = i;f = j;coutconversion constructor!endl;D( ) coutdestructorendl;void Print( ) coutd,fendl; ;void main() D obj(6, 12); cout.setf(ios:showpoint);
30、cout.precision(3); obj.Print( );/* Results:conversion constructor!6.00,12.0destructor*/附录十五一般程序中函数指针数组的使用/ fun_ptr3.cpp/ To imitate the use of virtual pointer for virtual functions#include void f( )coutf( ), ;void g( )coutg( ), ;void h( )couth( )endl;void main()void (*ptr ) ( ) = f, g, h ;/函数指针数组,si
31、milar to VTABLEvoid (*dblptr) ( );/声明一个指向函数指针的指针,similar to dblptrdblptr = ptr;/or dblptr = &ptr0;/将该指针初始化,即将它定义为指向数组的第一个元素,/similar to dblptr/然后下面通过调用一个指针数组元素来调用相应的函数 (*dblptr) ( );(*(dblptr+1) ( );(*(dblptr+2) ( );/* Results:f( ), g( ), h( )*/内存存储内容(栈区)ptr 0 = f f ( ) ptr 1 = g ptr 2 = h g ( ) h (
32、 ) dblptr 存储区一定连续不一定连续附录十六不同类的不同虚地址表具有不同地址/ Vtab_addr_2.cpp/ To see that the Vtables of different classes/ have the different addresses#include class Xpublic:virtual void who( ) coutXendl;class Y : public Xpublic:Y (int i) a =i; void who( ) coutYendl;int a;void main()Xobjx;Y objy1(10), objy2(20);int
33、 *ptr = (int *) &objx;couthex*ptrendl; /address of X:vtable ptr = ( int *)& objy1;couthex*(ptr+)endl; /address of Y:vtable coutdec*ptrendl;coutobjy1.aendl;ptr = ( int *)& objy2;/re-assign pointercouthex*(ptr+)endl; /same address of Y:vtable?coutdec*ptrendl;coutobjy2.aendl;/* Results:42604c (X:Vtable
34、 in data area)42601c (another Y:Vtable)101042601c (same Y:Vtable)2020*/附录十七虚指针的补充例子补充例1既有虚函数,又有数据的补充例子:读出派生类对象的地址、虚指针内容(它所指向的虚地址表的地址)以及虚函数地址表内容(它所指向的虚函数的地址)。/ objcont_vtab_1.cpp/ To show the sizes of the classes and the stored contents/ including the contents of VPTR and VTABLE/ of the objects of th
35、e derived classes with virtual functions#include iostream.hclass base int x1;public:base (int a) x1=a; virtual int inc( ) return x1; ;class derive : base int x2;public:derive (int a, int b) : base( a ) x2=b; int inc( ) return x2; ;class grand : derive int x3;public:grand (int a, int b, int c) : deri
36、ve(a, b) x3=c; int inc( ) return x3; ;void main()cout size of class base is sizeof(base) endl;cout size of class derive is sizeof(derive) endl;cout size of class grand is sizeof(grand) endl;grand gr(5, 7, 9); / Three objects are made to be located derive dd(3, 6); / contiguously so that one pointer ptr base bs(1); / can be used for all objectscout The addresses of their objects are:endl;cout &bs endl;cout &dd endl;cout &gr endl;base *ptr_b = &bs;int *ptr = (int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年铁艺栏杆行业市场调研与分析合同3篇
- 2024年度药品研发企业委托运输与临床试验物料管理合同3篇
- 2024煤场站台煤炭贸易代理及运输保障合同2篇
- 2024年游戏服务器租用合同
- 2024野生动物保护教育推广与培训合同3篇
- 2025年度出差人员绩效评估与激励方案合同3篇
- 2025年度蔬菜种植与农村环境治理合作合同3篇
- 二零二五年度散装货物海上运输保险合同样本6篇
- 2024版学校家具采购合同
- 2024年隧道开挖设备租赁合同
- 新疆塔城地区(2024年-2025年小学六年级语文)部编版期末考试(下学期)试卷及答案
- 四人合伙投资协议书范本
- 反射疗法师3级考试题库(含答案)
- 汽车供应商审核培训
- 山东省济南市2023-2024学年高二上学期期末考试地理试题 附答案
- 期末复习试题1(试题)-2024-2025学年二年级上册数学北师大版
- 1《地球的表面》说课稿-2024-2025学年科学五年级上册教科版
- 汽车以租代购合同完整版完整版
- 音乐制作基础知识单选题100道及答案解析
- 2024至2030年大型储油罐项目投资价值分析报告
- GB/T 44764-2024石油、石化和天然气工业腐蚀性石油炼制环境中抗硫化物应力开裂的金属材料
评论
0/150
提交评论