《More Effective C++》重点摘要一:基础议题

  1. 仔细区别pointers和references。指针和引用有些相似,他们本身都是对存在于某个地方的对象(不是指class)的指示,但是他们有着本质的区别。指针变量存储所指对象的地址,所指的对象可以是null,只要可以寻址就行。而引用是某个已经存在对象的别名,所以不可以先声明一个引用,经过一段时间(代码)后让它指向某个对象。
  2. 最好使用C++转型操作符。C++提供了自己的四种转型操作符:

    1) static_cast。拥有与C旧式转型相同的意义与限制,但不能移除表达式的常量性,因为有const_cast做这件事。

    2) const_cast。只能用于改变表达式的常量性或变异性。

    3) dynamic_cast。只能执行安全的向下转型或跨系转型。如果转型失败,会得到一个null指针或抛出异常。

    4) reinterpret_cast。这是一个不具有移植性的转型操作符,常见的用法是对函数指针进行转型,但尽量少用。

    使用这些新型转型操作符的方式为:xxxx_cast<类型>(表达式)。从上面可以看出,使用新型转型操作符可以更好地表达语义,增加可读性,转型操作也更加安全。即使使用了更安全的新型转型操作符,转型这种操作能不做就不做,《Effective C++》已经提过这一点。

  3. 绝对不要以多态方式处理数组。假设有一个双层继承体系class D : public B。另有一个接受B类型数组的函数,函数中依次对数组元素进行处理。如果以一个D类型的数组作为实参传进去可以吗?编译是没问题,数组做参数时与指针一样的(实际上数组和指针有很多不同之处,具体可以见《C专家编程》),表示一个地址嘛。但是运行起来的时候就会出问题,因为指针的类型决定了对待指针指向的内存上的数据的方式,比如double型指针会以8字节为单位对待指针指向的数据,而int型的指针是以4字节为单位。那么同样对于D和B往往会出现他们大小不一样,大小一样,对待他们指向的内存的解决方式就不一样,这就会出错,别忘了可能出错的地方就一定会出错。这里传参是没有问题的,但是函数在运行时会以B类型的方式对待传进来的那个数组名,因而带来了危险。那么多态真的不可以用在数组上吗?我认为可以,使用一个指针数组,而不要直接使用一个对象(class的实例)数组就可以了。本条款我想主要是针对对象数组的。
  4. 非必要不要提供default constructor。default constructor是指不带任何参数的那么constructor。这样做可以增强安全性,某件商品通过标识号唯一标识,那么构造一个没有标识号的商品对象显然就是错误的,所以default constructor就该被禁止,而要提供一个可以初始化商品标识号的constructor。但是没有default constructor有时也会带来不便,声明对象数组时,使用STL容器时(STL容器要求放入其中的对象能够提供default constructor)等等,然而提供default constructor也可能会带来不便,比如可能由于提供了default constructor而在制作一些成员函数时需要检查某些成员变量是否为初始变量或为其他值(假设每个成员变量都会被初始化《Effective C++》中已提及)。但是我觉得把事情做正确总是更重要的,耗费一点编程心力是值得的。对,安全至上。
时间: 2024-10-29 19:10:27

《More Effective C++》重点摘要一:基础议题的相关文章

More Effective C++ - 章节一 : 基础议题

1. 仔细区分 pointers 和 references references和pointers的差别描述如下: pointer:当需要考虑"不指向任何对象"时,或者是考虑"在不同时间指向不同对象"的能力时,应该采用pointer.前一种情况可以将pointer设为null,后一种可以改变pointer所指对象. reference:当确定"总是会代表某个对象",而且"一旦代表了该对象就不能再改变",那应该使用referen

【C++常识】more effective C++ 使用条款——基础议题/运算符

第一章:基础议题 Item M1:指针与引用的区别 1.指针可以不初始化,引用必须初始化 2.指针可以为空指针,引用不可以为空 3.指针可以改变指向,引用初始化后就不能改变指向的对象 4.指针占用4个字节,引用只是别名,理论上是不占用空间的,但是这个别名本身是要占用空间的,因此也可以说引用时占用空间的 5.引用比指针效率高,因为引用直接操作的是原对象本身 Item M2:尽量使用C++风格的类型转换 1.C++风格的四种转换:static_cast ,const_cast,dynamic_cas

C++重点知识点(基础系列二)

C++重点知识点基类 C++重点知识点(基础系列二),布布扣,bubuko.com

BDD in Action 重点摘要

BDD in Action 重点摘要: BDD in Action ?对于需灰度发布的产品, 开发人员可经由BDD, 便可自保证需灰度发布产品的质量? ?所以, BDD 可使产品更快速的达到灰度发布的要求, 而可更快速的获得使用者对产品的反馈? ?在这样的开发模式下, 测试人员可更专注于探索性测试, 挖掘出更深层的产品缺陷, 回归到真正测试人员的专业?

富士通株式会:重点发展云基础架构 现阶段不能完全将工厂迁至中国

第一财讯:2011广东经济发展国际咨询会11月14日-15日在广州举行.富士通株式会社社长间塚道义接受<第一财经日报>记者采访时表示,在当下欧债危机肆虐和美国陷入"流动性陷阱"的情况下,中国对富士通来说是块有魅力的市场. 尽管目前移动终端市场风起云涌,但间塚道义表示,富士通公司现阶段的宏观战略重点仍然放在云基础的架构和数据中心运营上,在研发出更多高效率.有内容的软件基础上才发展移动终端机器. 在日元升值的背景下,间塚道义表示,由于日元升值并不只是对人民币,而是对所有的货币都

《Effective C++》重点摘要(五)

<Effective C++>第五章:实现 尽可能延后变量定义式的出现时间.只有变量在恰好要使用之前定义,程序的可读性往往会得到提高,因为这样不容易忘记变量说代表的意思.另一方面,这样做可以提高程序性能,如果不需要一个变量时却要为它分配.释放空间,调用构造.析构函数,获取.释放资源--这,真是太浪费了.补充一点,声明式并不会做这些事情,所以可以考虑用声明式替换定义式以尽量延后变量的定义. 尽量少做转型动作.转型意味着出错的可能性大大提升,转型意味着更多的操作.如果不得不转型,考虑使用C++ s

《Effective C++》重点摘要(八)

<Effective C++>第八章:定制new和delete 了解new-handler的行为.new和delete不是函数,是申请和释放内存的操作符.当new提出获得内存申请失败时会发生什么?老旧的编译器是返回null指针.现在呢,如果申请失败,会先调用一个错误处理函数,那就是new-handler.这就像一个回调函数,系统有一个默认的,用户也可以自行编写一个错误处理函数并使用set_new_handler函数设置之.通常自行编写的错误处理函数可以使用这些策略: 1) 多次尝试申请内存.

《Effective C++》重点摘要(九)

<Effective C++>第九章:杂项讨论 不要轻忽编译器的警告.严肃对待编译器发出的警告信息.努力在最高警告级别下争取无警告.也不要过度依赖编译器给出的警告信息,不同的编译器给出的警告信息是不一样的,甚至给出警告的点也不一样. 让自己熟悉包括TR1在内的标准程序库. 让自己熟悉Boost. C++不想Java和C#那样,语言本身就带有很强大的库,所以外部的程序库对于编写C++程序至关重要.俗话说不要重复发明轮子嘛,所以能用别人的就用吧.当然这是在实际工程中,学习阶段嘛,我还是比较推崇自己

《Effective C++》重点摘要(一)

开篇的话 这个星期不再发布关于数据结构的博客,想把半个月来看的书做一些总结,整理整理,第一本就是<Effective C++>.第一次看这本书是一年多前,准备考研复试的时候,随后陆陆续续,这个月再来看算是第三遍了吧,之前没有看过<深度探索C++对象模型>,所以有的地方看得不是很透彻(现在有的地方也看得不透,但是比以前好点了).还有另一本书就是<深度探索C++对象模型>,看第二遍,吸收得更容易了,看书总是这样,第一遍也许什么也不知道,但是只要坚持看下去,回过头来再读的时候