More Effective C++读书笔记---基础议题

pointers(指针)、references(引用)、casts(类型转换)、arrays(数组)、constructors(构造)--再没有比这些更基础的议题了。几乎最简单的C++程序也会用到其中的大部分特性
一、条款1--指针与引用的区别
1.首先要认识到任何情况下都不能使用指向空值的引用,一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用
2.应该远离这样的代码:char* pc = NULL; char& rc = *pc;
3.因为引用肯定会指向一个对象,在C++里,引用应该被初始化
4.不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针要高。因为使用引用之前不需要测试它的合法性
5.指针可以被重新赋值以指向别一个不同的对象,但是引用则总是指向在初始化时被指定的对象,以后不能改变
6.总得来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(可将指针设置为空),二是你需要能够在不同的时刻指向不同的对象(可以改变指针的指向)。如果况是指向一个对象,并且一旦指向一个对象后不会改变指向,你应该使用引用
6.当你重载某个操作符时,你应该使用引用。最普通的例子就是操作符[]。这个操作符典型用法是返回一个目标对象,其能被赋值
二、条款2--尽量使用C++风格的类型转换
1.C++中引进四个新的类型转换操作符克服了C风格类型转换的缺点(1-过于粗鲁,能允许你在任何类型之间进行转换;2-在程序语句中难以识别),这四个操作符是,static_cast/const_cast/dynamic_cast/reinterpret_cast
2.static_cast在功能上基本上与C风格的类型转换一样强大,含义也一样。它也有功能上限制。如你不能用static_cast象用C风格的类型转换一样把struct转换成int类型或把double类型转换成指针类型
3.const_cast用于类型转换掉表达式的const或volatileness属性
4.dynamic_cast用于安全地沿着类的继承关系向下进行类型转换。失败的话将返回空指针(当对指针类型进行转换时)或抛出异常(当对引用进行类型转换时)。dynamic_casts在帮且你浏览继承层次上是有限制的。它不能被用于缺乏虚函数的类型上(见条款24),也不能用它来转换掉constness
5.reinterpret_cast,这个操作符的类型转换,其转换结果几乎都是执行期定义。因此,使用reinterpret_cast的代码很难移植。最普通的用途就是在函数指针类型之间进行转换
三、条款3--不要对数组使用多态
1.语言规范中说通过一个基类指针来删除一个含有派生类对象的数组,其结果将是不确定的
2.多态和指针算法不能混合在一起来使用,所以数组与多态也不能用在一起
四、条款4--避免无用的缺省构造函数
1.在一个完美世界里,无需任何数据即可建立对象的类可以包含缺省构造函数,而需要数据来建立对象的类则不能包含缺省构造函数,唉!可是我们的现实世界是不完美的,所以我们必须考虑更多的因素。特别是如果一个类没有缺省构造函数,就会存在一些使用上的限制
第一种问题:建立对象数组时。一般来说,没有一种办法建立对象数组时给构造函数传递参数。不过还是有三种方法可以避开这个限制:
一、使用非堆数组(non-heap arrays)。缺点:不能用在堆数组(heap arrays)的定义上
二、利用指针数组来代替一个对象数组。缺点:(1)容易发生内存泄漏 (2)增加了内存分配量
三、为数组分配raw memory,使用placement new方法。缺点:不熟悉,使用不方便
第二种问题:无法在许多其于模板(template-based)的容器里使用。因为实例化一个模板时,模板的类型参数应该提供一个默认的缺省构造函数,这是一个常见的要求
第三种问题:设计虚基类时所面临的要提供缺省构造函数还是不提供的两难决策。不提供缺省构造函数的虚基类,很难与其合作。因为几乎所有的派生类在实例化时都必须给虚基类构造函数提供参数。这就要求所有由此虚基类继承下来的派生类(无论有多远)都必须知道并理解提供给虚基类构造函数的参数的意义。
2.提供无意义的缺省构造函数也会影响类的工作效率。如果成员函数必须测试所有的部分是否都被正确的初始化,那么这些函数的调用者就得为此付出更多的时间,而且还得付出更多的代码,它们也得在测试失败的地方放置代码来处理错误。如果一个类的构造函数能够确保所有的部分被正确的初始化,所有这些弊病都能够避免。缺省构造函数一般不会提供这种保证,所以在它们可能使类变的没有意义时,尽量去避免使用它们

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值