Effective C++学习第十二天

条款47:请使用traits classes表现类型信息

        STL有五类迭代器分类,input迭代器(只读,一次,向前)、output迭代器(可写,一次,向前)、forward迭代器(读/写,多次)、Bidrectional迭代器(双向)、random access迭代器(任意跳跃,双向);

      当函数、类或一些封装的通用算法的某些部分会因为数据类型不同而导致处理或逻辑不同,traits是一个很好的解决方案;traits是一种技术,它对内置类型和用户自定义类型的表现必须一样好;

      实现traits技术的方法:1)确定若干你希望将来可取得的类型相关信息;2)为该信息选择一个名称;3)提供一个template和一组特化版本内含你支持的类型;实现的方式是通过if..else语句来实现(运行期判断),但是我们确定模板是在编译期,如何将这两个统一起来,方法就是重载(可以让traits classes在编译器对类型执行if..else测试);具体代码如下:


条款48:认识template元编程

          TMP有两个伟大的努力,第一:它让某些事情更容易;第二,由于template metaprograms执行于C++编译器,因此可将工作从运行期转移到编译器(原先在运行期的错误,现在在编译期就能发现),导致较小的可执行文件,较短的运行期、较少的内存需要,但是导致编译期变长;

条款49:了解new-handler行为

         当opertor new无法满足某一内存分配需求时,它会调用一个客户指定的错误处理函数,一个所谓的new_handle;代码如下:

      

new_handle是个typedef,定义一个指针指向函数,函数无参数也没有返回值;set_new_handle的参数是一个指针,指向operator new无法分配足够内存时该被调用的函数,返回值也是一个指针,指向set_new_handler被调用真在执行(马上被替换)的那个new_handler函数;

      一个设计良好的new_handle函数必须做的事情有:1)分配更多内存可被使用;2)安装另外一个new_handler,如果当前的new_handle没办法处理这个事情;3)卸载new_handler,将null指针传给set_new_handle;4)抛出bad_alloc异常;5)不返回,通常调用abort( )和exit;

      当这种情况牵涉到模板时,需要采用template,一种简单的做法就是建立一个“mixin”风格的base class,这种base class用来允许derive的 classes继承单一特定能力;代码如下:


     代码的怪异支出在于以widget调用widget模板,这个称为怪异的循环模板模式,虽然里面继承的是模板类,但是类中却没有用到模板定义的类型,这种做法的目的只是为了让每一个class里面的static成员变量都不一样;

      除了operator new之外还有一种内存分配方式,称为nothrow形式,正常分配则返还指向内存的指针,否则返回nullptr;

条款53:不要忽视编译器的警告

        严肃对待编译器给出的警告,努力在你的编译器最高警告级下通过代码;

       不要过渡依赖编译器,不同的编译器对待事情的态度不一样;

条款54:让自己熟悉包括TR1在内的标准程序库

           C++98列入的标准程序库:STL(容器,迭代器,算法,函数对象,容器适配器,函数对象适配器),Iostream,国际化支持(多区域能力),数值处理(复数和纯数值模板),异常阶层体系,c89标准程序库;

          TR1内的14个新组件:智能指针,function对象,bind绑定器Hash tables, 正则表达式,Tuples(变量组),tr1::array,tr1::mem_fn,tr1::reference_wrapper,Typer traits,tr1::result of;

条款55:让自己熟悉boost

          boost程序库对付的主题有十多个:1)字符串和文本处理;2)容器;3)函数对象和高级编程;3)泛型编程;4)模板元编程;5)数学和数值;6)正确性和测试;7)数据结构;8)语言间的支持;9)内存;10)杂项;


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 学习

1.linux文本命令行语言环境设置命令 查看当前语言环境: echo ¥LANG 修改: LANG选择的语言环境’ 引申:https://blog.csdn.net/huoyunshen88/article/details/41113633 2.linux中的硬链接和软连接 linux中文件的储存方式&#xf…

redis源码剖析(四)跳表

文章目录整数集合跳跃表压缩列表总结整数集合 当一个集合只包含整数,且这个集合的元素不多的时候,Redis 就会使用整数集合 intset 。首先看 intset 的数据结构: typedef struct intset {// 编码方式uint32_t encoding;// 集合包含的元素数量…

在Redis客户端设置连接密码 并演示密码登录

我们先连接到Redis服务 然后 我们要输入 CONFIG SET requirepass “新密码” 例如 CONFIG SET requirepass "A15167"这样 密码就被设置成立 A15167 我们 输入 AUTH 密码 例如 AUTH A15167这里 返回OK说明成功了 然后 我们退出在登录就真的需要 redis-cli -h IP地…

redis源码剖析(五)—— 字符串,列表,哈希,集合,有序集合

文章目录对象REDIS_STRING (字符串)REDIS_LIST 列表REDIS_SET (集合)REDIS_ZSET (有序集合)REDIS_HASH (hash表)int refcount(引用计数器)unsigned lru:REDIS_LRU_BITS对象 对于 Re…

redis源码剖析(六)—— Redis 数据库、键过期的实现

文章目录数据库的实现数据库读写操作键的过期实现数据库的实现 我们先看代码 server.h/redisServer struct redisServer{...//保存 db 的数组redisDb *db;//db 的数量int dbnum;... }再看redisDb的代码: typedef struct redisDb {dict *dict; /*…

linux中错误总结归纳

1.使用gcc编译C文件,C文件在for循环语句中出现变量定义 编译器提示错误:“for”loop initial declarations are only allowed in C99 mode. note:use option -stdc99or-stdgnu99 to compile; 原因:gcc的标准是基于c89的,c89不能在…

makefile内容小结

makefile中每个功能主要分为三部分:目标,依赖条件和命令语句 1.支持对比更新的Makefile写法(只会编译文件时.o文件和.c文件时间不一致的文件) 2.使用makefile自动变量和自定义变量的makefile写法 其中:这三个符号为ma…

事务隔离级别动图演示

事务的基本要素(ACID) 原子性(Atomicity) 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的…

linux中的man文档结构

使用命令 man chapter章节号查找的内容

linux文件操作相关函数

(1)stat函数:显示文件的相关信息(类似于 ls -l的感觉) 头文件及函数原型: 函数参数:path:文件的路径,buf是指待写入的文件信息,fd:表示文件描述符; stat,fstat,lstat三者…

linux目录操作函数

(1)chdir函数:修改当前进程的路径 函数头文件及原型: 参数:要修改的文件路径或文件描述符(一般是当前空闲最小的) 返回值:成功(0),失败&#xff0…

linux中的dup和fcntl的用法

(1)dup函数:文件描述符的拷贝 函数头文件及函数原型: 参数:原来的文件描述符,新的文件描述符,标志位; 返回值:成功(返回新的文件描述符)失败&…

使用dup2实现重定向到屏幕终端遇到问题

参考博客:https://blog.csdn.net/qq_26093511/article/details/53255970 参考博客:https://blog.csdn.net/db199410/article/details/52335450#commentBox 1.要解决的问题 通过复制文件描述符来实现文件重定向问题。 2.实现代码 2.代码输出 按照原来的…

linux操作系统之exec函数族

当我们想在进程中执行另外一个函数或程序时,可以使用exec函数。进程调用exec函数,则该进程中用户空间所有代码和数据会完全被新程序替换,但是不会创建新进程,因此进程id不会发生改变。 函数族的头文件:unistd.h l:li…

linux操作系统之子进程回收函数wait和waitpid函数小结

一个进程在终止时会关闭所有的文件描述符,释放用户空间分配的内存,但是它的PCB还保留着,内核在其中还保留着进程的一些信息:如果正常终止,则保留着退出状态;如果异常终止则保存着导致进程种植的信号。 在父…

linux操作系统进程间通信IPC之管道pipe及FIFO

linux环境下,各进程相互独立,如果想要交换两个进程之间的数据,需要通过内核,在内存中提供一个缓存区,一个进程往缓存区中写数据,一个往缓存区读数据,内核提供的这种机制称为进程间通信(IPC&…

linux操作系统进程间通信IPC之共享存储映射

(1)文件存储映射I/O(Memory-mapped I/O) 一个磁盘文件与存储空间中的一个缓存区相对应,这样可以在不适合read/write函数的情况下,使用地址(指针)完成I/O操作。具体实现通过内核指定一…

linux操作系统之信号

(1)信号的概念 信号的特点:简单,不能携带大量信息,满足某种特定条件才触发。 信号的机制;“软中断”,通过软件方式实现,具有很强的延时性。每个进程收到的信号,都由内核负…

linux操作系统信号捕捉函数之sigaction用法小结

&#xff08;1&#xff09;sigaction函数&#xff1a;注册一个信号捕捉函数&#xff08;不参与捕捉信号&#xff0c;信号由内核捕捉&#xff09;&#xff0c;并修改原来的信号处理动作 &#xff08;2&#xff09;函数原型及头文件 头文件&#xff1a;#include<signal.h>…

redis源码剖析(十五)——客户端思维导图整理

redis源码剖析&#xff08;十五&#xff09;——客户端执行逻辑结构整理 加载略慢