effective c++ (一)
条款01:把C++看作一个语言联邦
C++是一种多重范型编程语言,一个同时支持过程(procedural),面向对象(object-oriented),函数形式(functional),泛型形式(generic),元编程(metaprogramming)的语言
1、c part of C++,c++时以c为基础发展起来的,完全兼容于c语言
2、object-oriented C++,面向对象的封装、继承、多态等三大特性,C++都能够很好支持
3、template C++,使得C++支持泛型编程
4、STL,STL是个标准模板库,它对容器,迭代器,算法,函数对象等进行了封装,使得使用者能够直接调用
注意:
由于C++存在以上四种多重范型编程,故使用时注意不同语言层次,进行高效编程的原则也会存在差异
条款02:尽量以const、enum、inline替换#define
该条款从宏观工具来说也可以为:尽量用编译器代替预处理器
1、对于引用接口头文件中的宏,在编译时若是异常,使用者很难追踪到问题源头;因宏直接被替换,到编译时候,其名称只存在于预编译阶段,而不会进入编译阶段的的符号表中;
2、const常量能够比#define产生更轻量的代码,因#define定义的变量在替换时候会产生多个副本,而const则不会
3、const支持变量限定作用域,而#define则总是全局有效
4、对于class专属常量,对于有的编译器,其定义域声明同普通成员变量的声明一致,且可以同事给予赋值;对于有的编译器则不行,必须按照函数定义的形式给以赋值;如果变量的值必须在声明时要求给定(如该变量将作为类成员变量数组成员的大小)
class GamePlayer
{
private:
static const int NumTurns = 5;
int Scores[NumTurns];
}
若编译器不允许声明时给NumTurns赋值,则可借助枚举进行规避,
class GamePlayer
{
private:
enum { NumTurns = 5 };
int Scores[NumTurns];
};
此处的枚举变量与常量的区别在于:常量可以取地址,而枚举变量不能够取地址
总结:
1、对于单纯变量,最好以const对象或enums替换#defines
2、对于形似函数的宏(宏函数),最好改用inline函数替换#defines
条款03:尽可能使用const
1、如果const出现在*左侧,则表示指针所指物为常量,若const出现在*右侧,则表示指针本省为常量
2、在一个函数声明式中,const可以和函数返回值、个个参数、函数自身(若为成员函数)产生关联,
若将返回值申明为const则可以避免a*b = c 类似的错误
若将不改变的变量声明为const 可以避免if(a = 0)类似的错误
3、const成员函数的优点:
a、它使得成员函数更容易被理解,很容易得知哪个函数可以改动对象内容而哪个函数不可以
b、它们是操作“const 对象”成为可能,是pass by reference to const方式传递对象得技术前提
c、两个成员函数如果只是常量性不同,可以被重载
class TextBlock
{
public:
const char& operator[](std::size_t position) const
{ return text[position];}
char& operator[](std::size_t position)
{ return text[position]; }
private:
std::string text;
} TextBlock tb("Hello");
std::cout << tb[]; //调用非const operator[] const TextBlock ctb("Hello")
std::cout << ctb[] //调用const operator[] void print(const TextBlock& ctb)
{
std::cout << ctb[];
}
4、bitwise constness 和 logical constness
a、bitwise通过检查函数内有无赋值操作来判定;为了保证bitwise的常量性,不允许在const函数中存在为non-static成员变量赋值得操作,为了破除这种限制,需要在non-static变量申请时,添加mutable关键字 mutable std::size_t textLength;
b、在const与非const函数的声明中造成了代码的高度重复
c、const_cast<type>(xxx)能够去除xxx变量的const属性;static_cast<const type>(xxx)能够为xxx变量加上const属性
d、必须使用非const函数中调用const函数的方式,因使用const中调用非const将破坏const函数的 bitwise constness
class TextBlock
{
public:
const char& operator[](std::size_t position) const
{
...
...
...
return text[position];
}
char& operator[](std::size_t position)
{
return const_cast<char&>( //将op[]返回值的const去除
static_cast<const TextBlock&>(*this) //为*this加上const
[position] //调用op[]
);
}
private:
std::string text;
}
注意:
1、如果函数得返回类型是个内置类型,那么改动函数得返回值从来就是不合法得
2、将某些东西声明为const,有利于编译器侦测出错误
3、编译器强制实施bitwise constness
最新文章
- Hibernate学习笔记(二)
- Enterprise app deployment on iOS 7.1 by github
- Atitit selenium3 新特性
- python内置模块(3)
- bzoj 1185 旋转卡壳 最小矩形覆盖
- 【BZOJ 1189】[HNOI2007]紧急疏散evacuate
- ABAP 常用系统变量
- poj2456 二分逼近寻找正确答案
- Spring Security 3.2.x与Spring 4.0.x的Maven依赖管理
- IntelliJ IDEA 使用技巧
- 面试小记---java基础知识
- Apache Tomcat RCE(CVE-2017-12615 )漏洞案例分析
- asp.net core 使用docker默认端口修改
- java线程安全之并发Queue
- 第四十一课 KMP子串查找算法
- 使用<;c:set>;标签配置项目路径
- BLIST,BindingSource
- Python中的异常(Exception)处理
- 装载Properties资源文件的项目中使用
- JDK1.6 1.7 1.8 多版本windows安装 执行命令java -version 版本不变的问题