<<Effecitve C++>> 学习笔记 条款1,2
作者:互联网
习惯 C++
1. C++ 是一个语言联邦
- c 部分
-
最成功的的高级语言,他奠定了高级语言的基础,设计了区块blacks,语句statement,预处理器preprocesser,内置类型build-in-type,数组array,指针pointer,很多时候c++不过是更加高级的c解法
-
面向过程的高级编程语言,与计算机底层和汇编关系密切,你可以详细的控制cpu的每一次操作,通过代码知道编译语句的内容,问题是,程序员面临着大量的潜在bug而无法从语言上获得帮助,数组的初值不确定,动态内存要自己管理,每一次指针的操作都可能使得程序崩溃,
-
面向工程的巨大缺陷,无法面向对象,只有结构体,没有类class,没有模板template,没有异常,没有重载
- Object-Oriented C
- 原生面向对象的c语言,c with classes:classes(包括构造和析构函数),封装(encapsolution),继承(inheritance),多态(polymorphism),virtual(动态绑定),...
- tempate C++
- 泛型编程, 编程守则"唯泛型适用",TMP编程范式(template meta progranmming),但除了你是设计团队,大部分你只要用就行了,而且template和c++主流编程没有什么影响
- STL
- stl是个template程序库,极佳的紧密配合和协调了 容器(container),迭代器(iterraters),算法(algorithm),以及函数对象function Object的规约,如果你要使用它,就得遵守他的规约.
区别
- c部分pass by value 更好,只有指针和基础类型
- 然而Object-Oriented C 和 template C++由于有构造和析构函数的classes ,pass-by-reference-to-const更加高效,
- 然而使用STL时,由于stl的迭代器和函数对象都是基于指针构建的,pass-by-value 再次适用
conclusion 总结
- C++ 高效编程守则视现状而定,取决于你使用C++的哪一部分
2. 尽量用const,enum,inline,替换#define
-
宁可编译器而不是预处理器, 因为#define 设计就不是语言的一部分,编译器很多情况下报错无法追踪,因为#define 没有记名表,没有变量名,在编译器眼里是常量,只会报错常量,而你无法通过常量追踪报错位置,调试的时候更是这样
-
#define 不提供封装性,作用域控制,即static,class member,private,protect
-
eg #define ASP 1.63 -> const double ASP = 1.63
const 的使用
- c part (based-on-char*) eg :
const char * str const = "hello effective cpp";
- 在星号前的const代表修饰*str,即str所指向的内存存储的值不可变
- 在星号后的const修饰str,代表该指针的值不可变,即不能指向别的内存
- c++ part(based-on-classes)string :
const std::string str("hello effective cpp");
- classes 专属常量 for class scope define as a class member, for single store define as static
class GamePlayer{
private:
static const int NumTurns = 5; // 常量声明式
int score[NumTurns]; //使用该常量
...
};
- 如果这个常量不是整数型变量类型 byte,int,char,bool 或者你需要取这个常量的地址,你必须在class外提供定义式,参考头文件和源文件的关系理解,第一次为声明,第二次为定义,由于const的属性而显得奇怪,下面会解释原因
const int GamePlayer::NumTurn;
- 由于已经在声明时赋值,const使得不可再次赋值
- 在文件内的static已有特殊定义,即文件内部常量,不可被文件外部使用,对应extern,对于class static member的作用域,显然不合理,所以不可使用static,而使用extern,而extern可省略
enum 的使用
- 当你的编译器(错误的)不允许"static整数常量"完成"class int初值设定",使用the enum hack ,enum补偿法
class GamePlayer{
enum{NumTurns=5};
int scores[NumTurns];
}
- enum 无法被取地址更安全,而const 可以, 然后enum是TMP (template mete programming)的基础技术
inline 的使用
- 使用#define而避免函数调用的开销
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
- 错误情况
int a=5,b=0;
CALL_WITH_MAX(++a,b);
CALL_WITH_MAX(++a,b+10);
- 使用inline
template<T>
inline void call_with__max(T a,T b){
f(a>b?a:b);
}
conclusion 总结
- 对于单纯常量,最好以const对象或者enums替换#define
- 对于形似函数的宏(micros), 最好改用inline函数替换#define
标签:const,常量,enum,笔记,学习,C++,条款,class,define 来源: https://www.cnblogs.com/lvxvdong/p/Effective_cpp_note_term_1_and_2.html