首页 C Primer读书笔记

C Primer读书笔记

举报
开通vip

C Primer读书笔记C Primer读书笔记 第六章 抽象容器类型 1.我们能够定义的容器的类型有三个限制,实际上它们只适用于用户定义的类类型, ,1,元素类型必须支持等于操作符 ,2,元素类型必须支持小于操作符前面讨论的所有关系操作符都用这两个操作符 来实现 ,3,元素类型必须支持一个缺省值对于类类型即指缺省构造函数。 所有预定义数据类型包括指针都满足这些限制C++标准库给出的所有类类型也一样。 第八章 域和生命期 1.在全局域中定义的对象如果没有指定显式的初始值则该存储区被初始化为0 因此 下面两个定义中var1...

C   Primer读书笔记
C Primer读书笔记 第六章 抽象容器类型 1.我们能够定义的容器的类型有三个限制,实际上它们只适用于用户定义的类类型, ,1,元素类型必须支持等于操作符 ,2,元素类型必须支持小于操作符前面讨论的所有关系操作符都用这两个操作符 来实现 ,3,元素类型必须支持一个缺省值对于类类型即指缺省构造函数。 所有预定义数据类型包括指针都满足这些限制C++ 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 库给出的所有类类型也一样。 第八章 域和生命期 1.在全局域中定义的对象如果没有指定显式的初始值则该存储区被初始化为0 因此 下面两个定义中var1 和var2 有相同的初始值0 int var1 = 0; int var2; 2. 既指定了关键字extern 又指定了一个显式初始值的全局对象声明将被视为该对象的定 义编译器将会为其分配存储区而且该对象后续的定义都被标记为错误例如 extern const double pi = 3.1416; // 定义 const double pi; // 错误: 重复定义 pi 关键字extern 也可以在函数声明中指定惟一的影响是将该声明的隐式属性在其他地 方定义变为显式的这样的声明有下列形式 extern void putValues( int*, int ); 3. // ---- token.C 中 ---- int addToken( unsigned char tok ) { /* ... */ } // ---- lex.C 中 ---- extern int addToken( char ); 在C++中有一种机制通过它可以把函数参数的类型和数目编码在函数名中该机 制 叫做类型安全链接type-safe-linkage 类型安全链接可用来帮助捕捉不同文 件中函数声明不匹配的情况在前面的例子中unsigned char 型的参数和char 型参数的类型不同由于类型安全链接在lex.C 中声明的addToken()将会被标 记为未定义的函数而token.C 中的定义则被视为定义了另外一个函数。 4. 头文件为所向extern 对象声明函数声明以及inline 函数定义提供了一个集 中的位置这被称作声明的局部化localization 如果一个文件要使用或定义一 个对象或函数时它必须包含include 相应的头文件。 5. 符号常量和inline 函数可以被定义多次,在不同的程序文本文件中,。 在程序编译期间,在可能的情况下,符号常量,符号常量是任何const 型的对 象,的值会代替该名字的出现。这个替代过程被称为常量折叠constant folding。 但是,在某些情况下不可能做到符号常量的常量折叠过程。在这样的情况下最 好把常量的初始化移到某一个程序文本文件中,这可以由显式地声明常量为ex tern 来实现。例如 // ----- 头文件 ----- const int buf_chunk = 1024; extern char *const bufp; // ----- 程序文本文件 ----- char *const bufp = new char[buf_chunk]; 虽然bufp 被声明为const, 但是它的值却无法在编译时刻被计算出来,它的初 始化值是一个要求调用库函数的new 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 达式,如果bufp 在头文件中被初始化 那么它将在每个包含它的文件中被定义这不但浪费了空间,而且可能与程序员 的意图不符。 6. 如果编译器在调用点上没有内联该函数 则编译器会为该函数生成一个定义放到可执行文件中如果在多个文件中生成同一函数的定义则会产生一个不必要的过大的可执行文件。 如果出现下列情况多数编译器都会产生警告一般情况下这要求打开编译器的警告 模式 ,1, 函数的定义使其根本不可能做成inline 函数例如编译器可能抱怨函数过于 复杂而无法内联在这种情况下如果可能就应重写该函数否则去掉inline 指 示符把函数定义放到程序文本文件中。 ,2, 函数的特殊调用不能被内联例如在C++的最初实现AT&T(cfront) 中同—表 达式中的一个inline 函数的第二次调用就无法被内联在这种情况下我们 可以把表达式重新改写成两个独立的inline 函数调用。 在把一个函数声明为inline 之前我们必须分析它的运行时刻行为以确信该函 数被内联对于这部分代码来说确实是必要的建议把那些天生无法内联的函数不声 明为inline 并且不放在头文件中。 7. 未初始化的自动对象包含一个随机的位模式是该存储区上次被使用的结果它的值被称为未指定的(unspecified,。因为与自动对象相关联的存储区在函数结束时被释放所以应该小心使用自动对象的地址。当一个自动变量的地址被存储在一个生命期长于它的指针时该指针被称为空悬指针(dangling pointer, 这是一个严重的程序员错误因为它所指的 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 是不可预测的如果该地址的值正好合适因此程序就不会产生段错误该程序可能一直执行到完成但是给出的是一个无效的结果。 8. 未经初始化的静态局部对象会被程序自动初始化为0。 9. 动态分配的对象被分配在程序的空闲存储区free store 的可用内存池中。 程序员用new 表达式创建动态分配的对象用delete 表达式结束此类对象的生命期动态分配的对象可以是单个对象也可以是对象的数组在空闲存储区中分配的数组的长度可以在运行时刻计算。在本节中关于动态分配的对象我们将会了解到三种形式的new 表达式一种支持单个对象的动态分配另一种支持数组的动态分配第三种形式被称为定位new 表达式。 单个对象的动态分配与释放 例如 new int; 从空闲存储区分配了一个int 型的对象类似地 new iStack; 分配了一个iStack 类对象 new 表达式本身并不是十分有用我们如何使用被分配的对象呢,空闲存 储区的一个特点是其中分配的对象没有名字。new 表达式没有返回实际分 配的对象而是返回指向该对象的指针对该对象的全部操作都要通过这个 指针间接完成例如 int *pi = new int; 该new 表达式创建了一个int 型的对象由pi 指向它。 空闲存储区的第二个特点是分配的内存是未初始化的。空闲存储区的内存 包含随机的位模式它是程序运行前该内存上次被使用留下的结果测试 it ( *pi == 0 ) 总是会失败因为由pi 指向的对象含有随机的位因此我们建议对用new 表 达式创建的对象进行初始化程序员可以按如下方式初始化上个例子中的 int 型对象int *pi = new int( 0 ); 10. 看过前面的delete 表达式你可能会问如果pi 因为某种原因被设置为0 又会 怎么样呢代码不应该像这样吗 // 这样做有必要吗 if ( pi != 0 ) delete pi; 答案是不如果指针操作数被设置为0 则C++会保证delete 表达式不会调用操 作符delete() 没有必要测试其是否为0 实际上在多数实现下如果增加了指针 的显式测试,那么该测试实际上会被执行两次。 11. delete 表达式只能应用在指向的内存是用new 表达式从空闲存储区分配的指 针上。上将delete 表达式应用在指向空闲存储区以外内存的指针上会使程序 运行期间出现未定义的行为但是正如前面看到的delete 表达式应用在值为0 的指针即不指向任何对象的指针上不会引起任何麻烦。 12. 下面三个常见程序错误都与动态内存分配有关 ,1,应用delete 表达式失败使内存无法返回空闲存储区这被称作内存泄漏 ,2, 对同一内存区应用了两次delete 表达式这通常发生在两个指针指向同一个 动态分配对象的时候这是一个很难踉踪的问题。若多个指针指向同一个对象 当通过某一个指针释放了该对象时就会发生这样的情况此时该对象的内存 被返回给空闲存储区然后又被分配给某个别的对象接着指向旧对象的第二 个指针被释放新对象也就跟着消失了 ,3, 在对象被释放后读写该对象这常常会发生。因为delete 表达式应用的指针 没有被设置为0这些操纵动态分配内存的错误比较容易出现而且难于跟踪和 修正为帮助程序员更好地管理动态分配的内存C++库提供了auto_ptr 类类 型的支持。 13. auto_ptr 是C++标准库提供的类 模板 个人简介word模板免费下载关于员工迟到处罚通告模板康奈尔office模板下载康奈尔 笔记本 模板 下载软件方案模板免费下载 它可以帮助程序员自动管理用new 表达 式动态分配的单个对象不幸的是对用new 表达式分配的数组管理没有类似的 支持我们不能用auto_ptr 存储数组如果这样做了结果将是未定义的。 14. 在使用anto_ptr 类模板之前必须包含下面的头文件 #include auto_ptr 对象的定义有下列三种形式 auto_ptr< type_pointed_to > identifier( ptr_allocated_by_new ); auto_ptr< type_pointed_to > identifier( auto_ptr_of_same_type ); auto_ptr< type_pointed_to > identifier; 15. 数组的动态分配与释放 // 分配单个int 型的对象 // 用 1024 初始化 int *pi = new int( 1024 ); // 分配一个含有1024 个元素的数组 // 未被初始化 int *pia = new int[ 1024 ]; // 分配一个含 4x1024 个元素的二维数组 int (*pia2)[ 1024 ] = new int[ 4 ][ 1024 ]; // 指向数组的指针 注意:不能是int *pia2[1024] = new int[4][1024];// 指针数组 释放数组的表达式: delete [] pia; delete [] pia2; 16. 缺省情况下在全局域也被称作全局名字空间域global namespace scope 中声明的每个对象函数类型或模板都引入了一个全局实体global entity 在全局名字空间域引入的全局实体必须有惟一的名字例如函数和对象不能有相同的名字无论它们是否在同一程序文本文件中被声明。
本文档为【C Primer读书笔记】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_531654
暂无简介~
格式:doc
大小:21KB
软件:Word
页数:0
分类:工学
上传时间:2018-07-21
浏览量:3