More Effective C++ (1)

简单分析总结了more effective c++ 的前十个条款:

剩下的条款to be continue~

1.仔细区分指针和引用
引用必须不能指向空,指针可以指向空,指针初始化是记得赋空值,
重载某些操作符时(例如[])应该返回引用。

2.最好使用C++转型操作符
旧式的C转型应该少用,尽量使用新的C++的转型
static_cast<type> (expression)基本上与旧式C转型具有相同的威力与意义。
const_cast<type> (expression)用于改变表达式的常量性和变易性(volatileness)。
type必须是指针,引用,指向指针的引用。
dynamic_cast<type> (expression) 用于执行继承体中“安全的向下转型和跨系转型动作”。
type必须是指针,引用,指向指针的引用。
子类能转型为父类(向下转型),父类不能转型为子类(向上转型)。
如果转型失败将会返回一个null指针。
reinterpret_cast<type> (expression)
type必须是指针,引用,指向指针的引用。
主要用于“函数指针”类型转换。也可用于类型转换。
子类能转型为父类(向下转型),父类能转型为子类(向上转型)。

3.绝对不要以多态方式处理数组。
因为内存中,array[10],array 和 array + i 所指的内存多远是确定的,如果用子类访问(子类通常会
比基类大)将产生不可预计的后果。用基类指针删除一个子类数组上述情况还是会发生(析构时)。
4.非必要不提供default constructor。

某些类必须借助外部信息进行初始化才能使类有意义,如果没有default constructor,那么将不能创建数组,
虽然可以用数组指针创建,不过操作会比较麻烦,内存消耗也会增加。过度使用内存可以给数组分配raw memory
解决(条款8)。缺乏default constructor 将不适用于许多模板容器类。不过也不要构建无意义的default constructor,
因为这样做可能会带来更多的问题。

5.对定制的“类型转换函数”保持警觉。
隐式类型转换造成的错误通常难以发现,编译器在错误的表达式中会尽量寻找合适的隐式类型转换使得表达式有意义,
为避免隐式转换,(1)将重载操作符()功能用成员函数替代 (2)构造函数声明为explicit 或 为当前类编写一个
专用类(代理人一般),因为编译器不允许进行两次隐式类型转换。

6.自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别
前缀式通常比后缀式效率要高些
// 前缀形式:增加然后取回值
UPInt& UPInt::operator++()
{
*this += 1; // 增加
return *this; // 取回值
}
// postfix form: fetch and increment
const UPInt UPInt::operator++(int)
{
UPInt oldValue = *this; // 取回值
++(*this); // 增加
return oldValue; // 返回被取回的值
}

7.不要重载“&&”,“||”, 或“,”
与 C 一样,C++使用布尔表达式短路求值法(short-circuit evaluation)。这表示一旦
确定了布尔表达式的真假值,即使还有部分表达式没有被测试,布尔表达式也停止运算。

8.理解各种不同含义的 new 和 delete
new 操作符为分配内存所调用函数的名字是 operator new
有时你有一些已经被分配但是尚未处理的(raw)内存,你需要在这些内存中构造一个对象。你可以
使用一个特殊的 operator new ,它被称为 placement new。
例如:new (buffer) Widget(widgetSize); //指向一个 Widget 对象,对象在转递给函数的 buffer 里分配。
如果你只想处理未被初始化的内存,你应该绕过 new 和 delete
操作符,而调用 operator new 获得内存和 operator delete 释放内存给系统.
如果你用 placement new 在内存中建立对象,你应该避免在该内存中用 delete 操作符。
而你应该显式调用对象的析构函数来解除构造函数的影响.
Array分配时1.用operator new []分配 2.在数组里的每一个对象的构造函数都必须被调用。
同样当 delete 操作符用于数组时, 它为每个数组元素调用析构函数, 然后调用 operator delete 来释放内存。

9.使用析构函数防止资源泄漏。
应该注意使用智能指针防止出现异常时的资源泄露。相关的窗口创建也可应用这种思想。

10.在构造函数中防止资源泄漏。
构造函数执行过程中可能会出现异常,可以在构造函数内部捕获异常释放资源并抛出解决,但是更好的方法
是使用智能指针,它能使对象像内部数据类型一样更好的解决资源泄露问题。

时间: 2024-08-05 11:17:59

More Effective C++ (1)的相关文章

《Effective C++》读书笔记汇总

我之前边读<Effective C++>边写下每个条款的读书笔记,这一版是C++11之前的版本.这里我将每个条款令我印象深刻的点小结一下. 1.C++包括:Plain C(面向过程).OOP(面向对象).模板(泛型和模板元编程).STL(C++标准库). 2.用inline.enum.const代替#define.#define定义的宏,一旦复杂起来,高手都很难掌控.不要带入C的习惯. 3.灵活使用const前缀.不需要进行改变的数据加上const前缀.指针的const前缀有两种形式,cons

Effective Java之内部类

Effective Java中对类的权限,接口等的要求,总结起来就是够用就行,不要赋予过多的访问权限,类的定义也是,如果某个类只会在类的内部使用,那就将该类定义为内部类吧. 内部类分为四种: 1.静态内部类:静态内部类就是在class前面多了static关键词的内部类,这种类和类的静态方法和静态变量一样,针对类本省进行操作,在静态内部类中可以随意访问其所在类的静态方法和静态变量. 2.非静态内部类:和静态内部类相对于,其实在类内部定义的所有东西只是受到访问修饰符的限制,所以非静态内部类和类的非静

学习日记之状态模式和Effective C++

状态模式(State):当一个对象内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类. (1),状态模式主要负责解决的是当控制一个对象转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (2),状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来. (3),将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和

Effective Objective-C 2.0重读笔记---1

上次看这本书的时候匆匆走了一遍,最近不太忙,重温了一遍,把笔记写出来~.. 有兴趣的可以去买一本,感觉这本书还是挺不错的 由于大部分是在坐车的时候用手机写的,所以代码很少,图也很少 1. 尽量使用向前声明,延后引入头文件的时间,这样可以减少编译时间2. 使用arraywithobjects:....如果遇到为空的变量,就会自动终止,后面的变量便会添加不上,切不会报错,会造成数据不一致问题,所以尽量使用字面量语法创建相关对象,减少出错且减少代码量3. 使用字面量创建的对象都是不可变的,如果要获得可

Effective前端2:优化html标签

  借用Effective之名,开始写Effective系列,总结一些前端的心得. 有些人写页面会走向一个极端,几乎页面所有的标签都用div,究其原因,用div有很多好处,一个是div没有默认样式,不会有margin.background等初始化设置,另外可能会觉得不用div还能用啥.所以看他的页面,一展开是div,再展开还是div,展开四.五层都是div. 这样对用户来说虽然没什么区别,但是作为一名有追求的程序员,这种写法看起来是比较难受的.有些人虽然知道html5新增了很多标签,但也不怎么去

Effective前端1:能使用html/css解决的问题就不要使用JS

  借用Effective之名,开始写Effective系列,总结一些前端的心得. 为什么说能使用html/css解决的问题就不要使用JS呢?两个字,因为简单.简单就意味着更快的开发速度,更小的维护成本,同时往往具有更好的体验,下面介绍几个实例. 1. 导航高亮 导航高亮是一种很常见的问题,包括当前页面的导航在菜单里面高亮和hover时高亮.你可以用js控制,但是用一点CSS技巧就可以达到这个目的,不需要使用JS. 在正常态时,每个导航的默认样式为: 正常态透明度为0.5 CSS 1 2 3 n

【总结】Effective java经验之谈,类与接口

转载请注明出处:http://blog.csdn.NET/supera_li/article/details/44940563 Effective Java系列 1.Effective java经验之谈,创建和销毁对象 2.Effective java经验之谈,泛型 3.Effective java经验之谈,类与接口 4.Effective java经验之谈,通用方法 5.Effective java经验之谈,枚举,注解,方法,通用设计,异常 6.Effective java经验之谈,并发编程

阅读《effective java-第17条》遇到的问题解决与分享

问题背景 最近这2天准备重新看一遍<effective java>,发现这些经典的书籍真的是看一遍又有一遍的感受.也越来越觉的学习的过程是一个重复的过程.这次遇到的问题是在第17条中看到的,看了蛮久都没有看懂视例代码.第17条的内容是要么为继承而设计,并提供文档说明,要么就禁止继承.在其中有一段示例构造器决不能调用可被覆盖的方法代码如下: 父类代码 package com.sitech.test; /** * effect of java * @author liaowp * */ publi

《Effective C++》之条款34:区分接口继承和实现继承

<Effective C++> 条款34:区分接口继承和实现继承 Public继承由两部分组成 函数接口继承 函数实现继承 三种可能面对的继承 derived class 只继承成员函数的接口 derived class 同时继承函数的接口和实现,但又希望能够覆写它们所继承的实现 derived class 同时继承函数的接口和实现,但不允许覆写任何东西 总结: 接口继承和实现继承不同.在public继承下,derived classes 总是继承base class 的接口. Pure vi

EFFECTIVE JAVA 第十章 并发

EFFECTIVE  JAVA  第十章  并发 66.同步访问共享的可变数据 *java语言规范保证读或写一个变量是原子的(可以保证返回的值是某个线程保存在该变量中的),除非这个变量的类型为long或double.(但并不保证一个线程写入的值对于另一个线程是可见) *synchronized修饰方法.synchronized代码块可以实现同步 *volatile修饰的变量只保证读取的是主存里最新的值而不是内存中该值的拷贝,使用volatile变量必须遵循(即变量真正独立于其他变量和自己以前的值