《Effective C++》第一章:让自己习惯C++
来源:互联网 发布:知乎 立体几何 编辑:程序博客网 时间:2024/04/29 15:34
条款一:视C++为一个语言联邦
四大联邦:C、Object-Oriented C++、Template C++、STL
条款二、三:尽量以const,enum,inline替换#define
此条款旨在阐述“尽量以编译器代替预处理器”这个概念。我们首先带分析一下#defined的不好之处:
(1)利用#define定义一个常量,比如#define PI 3.14,记号名称PI也许从未被编译器看见过,在预处理的时候就被3.14代替了,于是PI有可能没进入记号表内。当产生错误的时候,编译器很可能会提到3.14而不是PI,十分不利于调试
(2)可能会使形式参数产生副作用。比如#define MAX(a,b) (((a) > (b)) ? (a) : (b)) ,如果采用这样调用的方式:MAX(a++,b++),会被展开成:
(((a++)>(b++))?(a++):(b++))
因此我们最好用inline来代替#define
下面我们来分析一下const的一些特性:(1)const默认为内部链接,C++中是编译器期间常量,一般会采用常量折叠。只有在必要情况下,比如使用extern、解引用才会被分配内存。但是注意在C语言中,const是运行时常量,默认为外部链接。所以在C++中使用const常量作为数组大小的定义是可以的,但是在C语言中就不行
(2)在函数参数和返回值中使用const。注意临时量一般都是const,对临时对象取地址、引用都是不允许的
(3)const在类中的作用。类成员变量为const时,必须在初始化列表中初始化,const可以用于重载标识,并且non-const对象可以调用const对象
(4)static的两种作用:在静态存储区上分配内存,初始化一次,默认为内部链接
(5)static 和 const在类中的应用:如果只有static修饰,则只能在类外初始化;同时又static和const修饰,类外类内都可以初始化;const只能在初始化列表中初始化;普通成员可在初始化列表和构造函数内初始化
前面说到,在C语言中用const常量定义一个数组大小是不合法的,但是我们又不想用#define,这可如何是好?这时我们可以用enum。enum比较像#define,不可以取地址(对const可以)。
条款四:确定对象被使用前已先被初始化
没什么好讲的.....
1、为内置型对象进行手工初始化,因为C++不保证初始化它们
2、构造函数最好使用成员初始列(效率会高一点),并且保证次序和申明时一样
3、为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象(因为static是内部链接,其它编译单元不可见)
all right,第一章结束!!!
- 《Effective C++》第一章:让自己习惯C++
- Effective C++ 第一章(让自己习惯C++)
- (Effective C++)第一章 让自己习惯C++(View Yourself to C++)
- Effective C++(一)让自己习惯C++
- Effective C++(一)让自己习惯C++
- effective c++-让自己习惯c++
- 《Effective C++》1-让自己习惯C++
- effective c++ 第一章:让自己习惯c++
- Effective c++ 第一章 让自己习惯C++
- Effective C++第一章让自己习惯C++
- Effective C++第一章:让自己习惯C++
- effective C++ 第一章:让自己习惯C++
- 【读书笔记】Effective C++-1 让自己习惯C++(之一)
- 【读书笔记】Effective C++-1 让自己习惯C++(之二)
- 【读书笔记】Effective C++-1 让自己习惯C++(之三)
- 《Effective C++》让自己习惯C++:条款1-条款4
- Effective C++读书笔记1(让自己习惯C++)
- Effective C++读书笔记1(让自己习惯C++)
- js如何打印表格
- python numpy、scipy安装及numpy的初步使用
- 绝对路径
- PHP基础-正则表达式
- ImageView.ScaleType设置图解
- 《Effective C++》第一章:让自己习惯C++
- Hadoop系列-HDFS文件操作的JAVA API用法(七)
- linux sed和grep命令
- 解决问题:app\build\intermediates\res\merged\debug\values-v24\values-v24.xml
- xmind学习笔记
- 面试题15—链表中倒数第K个结点
- Eclipse loading description for 解决
- shellScript之命令行向函数传参
- 【剑指Offer】JS实现 斐波那契数列