Effective C++------读书笔记

(一)让自己习惯C++
(1)条款01:视C++为联邦语言
C++的组成可分为四部分:
1.C:C++仍然以C语言为基础。区块、语句、预处理、内置数据类型、数组、指针等都来自C。
2.Object-Oriented C++:C with Classes所诉说的:classes(包括构造和析构)、封装、继承、多态、virtual动态绑定等
3.Template C++:泛型编程
4.STL:template程序库,对容器、迭代器、算法以及函数对象的规约有极佳的进你配合和协调。
C++高效编程守则视情况而变化,取决于使用C++的那一部分
(2)条款02:尽量以const,enum,inline替换#define
1.#define定义的变量在预处理时就完成了替换(编译器可能从来没见过记号名称),而且#define不在意作用域
2.const定义的语言常量,肯定会被编译器看到,而且会进入符号表。
3.如果是属于class的专属常量,为了将常量的作用于限制在class内,必须让这个常量成为一个class的成员,而为了确保常量至多只有一份实体,必须让它成为static成员

class Gameplayer
{
private:
    static const int NumTurns = 5;//常量声明式
    int scores[NumTurns];   
};

通常C++要求对所有使用的东西都要有定义式,但如果它是个class的专属常量又是static且为整数类型(如int& ,char&,bools等),需要特殊处理。如果不取他们的地址,则可以直接声明而不需要定义式。 但如果取某个class专属常量的地址或者纵使你不取地址而编译器坚持要看到一个定义式,则必须另外提供定义式。

const int GamePlayer::NumTurns;//NumTurns的定义

define不仅不能够用来定义class的专属常量,而且不能提供封装。

class CostEstimate
{
privatestatic const double FudgeFactor;//常量声明
};
const double CostEstimate::FudgeFactor = 1.65;//常量定义

如果在编译期间需要一个class常量值,此时编译器不允许进行in-class初值设定,则改用“enmu hack补偿法”,理论基础:一个属于枚举类型的数值可充当ints来使用。因为取enum的地址不合法,如果不想让别人获得一个pointer或reference指向你的整型常量,可以用enmu实现这个约束。
使用宏除了优先级可能会出现的问题外,(加()也解决不了的问题)

#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))

int a = 5,b = 0;
CALL_WITH_MAX(++a,b);//++a累加两次
CALL_WITH_MAX(++a,b+10);//++a累加一次
//a的累加次数竟然取决于与它比较的对象的值

此时可以利用inline来解决这个问题
1.对于单纯常量,最好用const对象或者enmu替换#define
2.对于形似函数的宏,最好用inline函数替换#define
(3)条款03:尽量使用const
STL的迭代器是以指针为根据塑模出来的,所以迭代器的作用像一个T*指针,
日如果希望迭代器所指向的东西不可被改动(即希望STL模拟出一个const T*的指针),需要const_iterator

std::vector<int> vec;
const std::vector<int>::iterator iter = vec.begin();
//iter的作用像T* const
*iter = 10;//没问题
++iter;//错误,因为iter是const
std::vector<int>::const_iterator cIter = vec.begin();
//cIter的作用像是个const T*
*cIter = 10;//错误,*cInter是const的
++cIter;//正确

若定义返回值为const,则表示返回值是右值不可以被修改。
(避免出现(a*b) = c)
成员函数如果是const意味着什么
两个概念:bitwise constness和logical constness
1.bitwise constness:是C++对常量性的定义,因此const成员函数不可以更改对象内的任何non-static成员变量,但仍会出现间接的改变了成员变量的值
2.logical constness:一个const成员函数可以修改它所处理的对象内的某些bits,此时可以使用mutable释放掉non-static成员变量的bitwise constness约束
在const和non-const成员函数中避免重复
如果函数较为复杂(含有边界检查,志记访问信息、数据完善性检查等等同时存放进const和non-const的成员函数,会导致大量重复的编译、维护工作等等)
真正应该做的是实现成员函数的机能一次并使用两次,也就是说用其中一个调用另外一个,这促使我们将常量性转除

class TextBook
{
public:
    ...
    const char& operator[](std::size_t position) const
    {
        ...
        return text[position];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值