Effective C++读书笔记(2)
2013-12-16 15:48
183 查看
让自己习惯C++
条款1:视C++为一个语言联邦
C++可以看作是四种次语言组成的:
C(包括区块、语句、预处理器、内置数据类型、数组、指针等);
Object-Oriented C++(主要表现C++的面对对象的性质,包括类、封装、继承、多态性、virtual函数等);
Template C++(为C++泛型编程部分);
STL(是模版程序库,主要包括容器、迭代器、算法以及函数对象)。
条款2:尽量以const, enum, inline替换 #define(实用编译器代替预编译器)
问题:#define定义的宏不被视为语言的一部分,而其定义的记号名称也许没有进入记号表被编译器看到,追踪宏定义较麻烦。
解决方案:以常量替换#define(使用const关键字)
const double* cptr;//指向const对象的指针,不能通过该指针改变所指向地址的值,但可以改变指针所指的地址值,定义时不用初始化
double* const cptr;//const指针,指针的值无法改变,定义时必须初始化。在实际程序中指向const的指针常用作函数的形参,可用于防止函数对形参进行修改。
特殊情况:1、在头文件中定义指向const char*(c风格字符串)的常量指针时应写两次const(此时用String更合适)
const char* const anthorName="Scott Meyer";
const std::string authorName("Scott Meyer");2、定义类内专属常量时为保证只有一份实体需定义为static成员(此时体现了#define不具有封装性)
如果在class编译期间需要给class专属的常量值赋初值,但是旧式编译器不允许class成员在其声明式上获得初值,此时应采用“the enum hack”做法。其理论基础为:一个属于枚举类型的数可以权充int被使用。
static const int NumTurns = 5;
int score[NumTurns];
enum{NumTurns=5};
int score[NumTurns];"enum hack"的优点在于其行为在某些方面比const像#define。我们无法获得enum和#define的地址,但是我们可以获得const的地址。enum可以实现这种约束。
对于形似函数的宏,最好改用inline函数代替#define。
条款1:视C++为一个语言联邦
C++可以看作是四种次语言组成的:
C(包括区块、语句、预处理器、内置数据类型、数组、指针等);
Object-Oriented C++(主要表现C++的面对对象的性质,包括类、封装、继承、多态性、virtual函数等);
Template C++(为C++泛型编程部分);
STL(是模版程序库,主要包括容器、迭代器、算法以及函数对象)。
条款2:尽量以const, enum, inline替换 #define(实用编译器代替预编译器)
问题:#define定义的宏不被视为语言的一部分,而其定义的记号名称也许没有进入记号表被编译器看到,追踪宏定义较麻烦。
解决方案:以常量替换#define(使用const关键字)
const double* cptr;//指向const对象的指针,不能通过该指针改变所指向地址的值,但可以改变指针所指的地址值,定义时不用初始化
double* const cptr;//const指针,指针的值无法改变,定义时必须初始化。在实际程序中指向const的指针常用作函数的形参,可用于防止函数对形参进行修改。
特殊情况:1、在头文件中定义指向const char*(c风格字符串)的常量指针时应写两次const(此时用String更合适)
const char* const anthorName="Scott Meyer";
const std::string authorName("Scott Meyer");2、定义类内专属常量时为保证只有一份实体需定义为static成员(此时体现了#define不具有封装性)
如果在class编译期间需要给class专属的常量值赋初值,但是旧式编译器不允许class成员在其声明式上获得初值,此时应采用“the enum hack”做法。其理论基础为:一个属于枚举类型的数可以权充int被使用。
static const int NumTurns = 5;
int score[NumTurns];
enum{NumTurns=5};
int score[NumTurns];"enum hack"的优点在于其行为在某些方面比const像#define。我们无法获得enum和#define的地址,但是我们可以获得const的地址。enum可以实现这种约束。
对于形似函数的宏,最好改用inline函数代替#define。
相关文章推荐
- 要心中有“数”——C语言初学者代码中的常见错误与瑕疵(8)
- C++ Boost Thread 编程指南
- NEW IN C++ 11
- readers and writers problem 读者写者问题 写者优先 C++实现
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制
- C++计时的几种方法说明及例程
- Effective C++读书笔记(1)
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言
- C++字符转UTF-8字符
- C++编写Config类读取配置文件
- C++界面库大全2013
- C++ Keywords Alternative Operator Names
- c++原型模式(Prototype)
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest
- c++文件读写
- C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) .
- C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) .
- C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) .
- C语言堆栈入门——堆和栈的区别
- Xcode编写C/C++程序