EffectiveC++读书笔记(1)条款1、2、3
来源:互联网 发布:存在主义 知乎 编辑:程序博客网 时间:2024/04/26 22:57
条款01:视C++为一个语言联邦
C++的四个次语言
①C
②Object-OrientedC++
③Template C++
④STL
C++是个多重范型编程语言,同时支持过程形式、面向对象形式、函数形式、泛型形式、元编程形式的语言。C++高效编程守则视状况而变化,取决于使用C++的哪一部分
条款02:尽量以const、enum、inline替换#define
不带参数的宏:用const和enum代替
宏定义#define:预编译期→不进入符号表,只是简单的替换
const、enum定义的常量:编译期→进入符号表,支持类型检查和访问限制
关于访问限制,#define并不重视作用域。一旦宏被定义,它就在其后的编译过程中有效,所以#define不仅不能够用来定义class专属常量,也不能够提供任何封装性。
带参数的宏:用inline代替
宏看起来像函数,但会有很多缺点,比如下面这个程序:
#include<iostream>#define square(a) a*ausing namespace std;int main(){cout << square(2+1) << endl;return 0;}
在宏中,实现的是平方的功能,计算出的结果可能会是square(3),结果是9。但是事实上的结果是5,原因很简单,宏只是简单的替换,所以替换的结果就是
2 +1 * 2 + 1
根据优先级,计算出来的结果自然是5。
这样的情况并不是简单的加上括号就行的,因为还会有比括号更高的优先级的算符影响运算结果,比如:
#include<iostream>#define square(a) a*ausing namespace std;int main(){int i = 2;cout << square(++i) << endl;return 0;}
替换的结果就是( ++i ) * (++i ),i自增了两次,所以结果是4*4,而不是3*3。
要解决这个问题,最好的方法就是不用宏定义,而是用函数。但是函数又存在一个问题,就是调用的时候会有保存现场和回复现场(压栈弹栈),会影响效率。如果我们在前面加上关键字“inline”,就会告诉编译器:把这段函数体部分直接替换到调用处,而不是用栈机制调用函数。
条款03:尽可能使用const
const就是告诉编译器该指定的对象应保持不变。如果尝试修改const的变量,编译器会报错。同时也告诉我们,const对象是在声明时就要初始化。
修饰指针
说到指针,往往会涉及到两个变量:指针本身和指针指向的变量。所以const应用于指针也有多重含义:const int* p = &x; //指针本身是变量,指向的是常量 *p = 3; //试图修改指针指向的对象,但x已经是常量,错误 p = &y; //试图修改指向,指向其他对象,可以int* const p = &x; //指针本身是常量,指向的是变量 *p = 3; //试图修改指针指向的对象,将x改为3,可以 p = &y; //试图修改指向,但指向已经是常量,错误const int* const p = &x; //指针本身和指向的都是常量,都不可修改
总结:关键字const出现在星号左边,表示指向的对象是常量。如果出现在右边,表示指针自身是常量。如果出现在两边,则指向对象和指针两者都是常量。
修饰成员函数
const放在类中的成员函数后面,表示这个成员函数不会修改类的成员变量。
- 《EffectiveC++》读书笔记(一)条款1-3
- EffectiveC++读书笔记(1)条款1、2、3
- EffectiveC++读书笔记(3)条款7、8、9
- EffectiveC++读书笔记(2)条款4、5、6
- 《EffectiveC++》读书笔记(二)条款4-6
- Effectivec++读书笔记1
- EffectiveC++学习笔记-条款3
- EffectiveC++学习笔记-条款2
- EffectiveC++实现(1)
- effectiveC++读书笔记(九)
- Effective C++ 读书笔记 条款1~2
- effectiveC++中的条款20
- EffectiveC++ 学习笔记1
- EffectiveC++学习笔记-条款4
- EffectiveC++学习笔记-条款7
- EffectiveC++学习笔记-条款8
- EffectiveC++学习笔记-条款9
- EffectiveC++学习笔记-条款10
- C#常用开源类库收集
- Linux之旅----硬件篇
- 关于SQL Server数据库中的标识列
- iOS中多线程编程示例【code】
- Oralce分析函数
- EffectiveC++读书笔记(1)条款1、2、3
- php使用 memcache 来存储 session 方法总结
- 避免犯低级错误
- Python 第二课 使用 Python 进行线程编程
- 求a+aa+aaa+.........+aaaaa=?
- java判断是一年的第几天实例代码
- Android控件_自定义组合控件
- Vijos P1493 传纸条 (双线程DP)
- 访问嵌套iframe遇到的问题