《Effective C++》 读书笔记 条款46-50

Effective C++ 46-50 Note

条款46:需要类型转换时请为模板定义非成员函数

当我们编写一个class template,而它所提供之“于此template相关的”函数支持“所有参数之隐式类型转换”时,请将那些函数定义为“class template内部的friend函数”

先看一个编译错误:

image-20210323223744063

image-20210323223752209

上述的乘法无法通过编译,在调用模板函数operator*时,oneHalf的类型是Rational,2的类型是int。编译器不会执行隐式转换,所以它不知道该调用那个类型的具现化函数。

解决方法是将该函数声明为友元函数

image-20210323224150316

image-20210323224141091

image-20210323224216789

而上述代码能够通过编译但是不能通过连接

image-20210323224527378

image-20210323224534608

解决方法:将该函数定义为template内部的friend函数

image-20210323224615621

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

5种迭代器类型

输入迭代器:向前移动,一次一步,可读不写,只能读一次(模仿输入文件的阅读指针)

输出迭代器:向前移动,一次一步,可写不读,只能写一次(模仿输出文件的涂写指针)

前向迭代器:向前移动,一次一步,可读可写,可多次读写

双向迭代器:双向移动,一次一步,可读可写,可多次读写(set、multiset、map、multimap的迭代器)

随机访问迭代器:双向移动,一次多步,可读可写,可多次读写(vector、deque、string的迭代器)

对于这些迭代器,C++标准程序库分别提供专属的卷标结构(tag struct)加以确认:

image-20210323225547795

条款48:认识template元编程

模板元编程可将工作由运行期移往编译期,因而得以实现早期错误侦测和更高的执行效率

TMP可被用来生成“基于政策选择组合”的客户定制代码,也可用来避免生成对某些特殊类型并不适合的代码

条款49:了解new-handle的行为

set_new_handler允许客户指定一个函数,在内存分配无法获得满足时调用

image-20210323230615182

image-20210323230720531

image-20210323230732275

一个设计良好的new-handle函数必须做以下事情:

1、让更多内存可被使用

2、安装另一个new-handle

3、写出new-handle,将null指针传给set_new_handler

4、抛出bad_alloc

5、不返回,通常调用abort或exit

Nothrow new是一个颇为局限的工具,因为它只适用于内存分配;后续的构造函数调用还是可能抛出异常

image-20210323231752317

当分配内存失败时,不会抛出异常。当分配内存成功,构造函数失败时,也会抛出异常

了解new和delete的合理替换时机

有许多理由需要写个自定的new和delete

image-20210323232225103

image-20210323232233738

image-20210323232241571

image-20210323232249233

image-20210323232258758

image-20210323232306732

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值