//
// effective c++.cpp
// 笔记
//
// Created by fam on 15/3/23.
//
//
//---------------------------15/03/23----------------------------
//#01 视c++为一个语言联邦
{
/*
1:c++如今支持的编程形式:
1:过程形式 2:面向对象形式 3:函数形式 4:泛型形式 5:元编程形式
2:c++的4个次语言:
1> c: 说到底c++还是以c为基础的。
2> object-oriented c++。也就是封装、继承、多态
3>template c++。泛型编程,他带来了一个崭新的编程范型,也就是模版元编程
4>STL。STL标准库。
*/
}
//#02 尽量以const,enum,inline替换 #define
{
/*
1:如果使用#define定义常量很可能找不到错误位置。此时用const来替换之,
使用const还有个好处是,不会出现多份字符常量。
关于const:
1>当要使用一个指向常量字符串的常量指针是,最好使用const string
使用 const std::string authorName("Scott Meyers");
替换掉 const char* const authorName ="Scott Meyers";
2>class的专属常量
class GamePlayer
{
private:
static const int NumTurns = 5;
int scores[NumTurns];
};
这里的NumTurns只是一个声明式,如果要取他的地址必须在之后给出定义:
const int GamePlayer::NumTurns;
2:如果编译器不支持以上的static const来做初值设定可以改用 enum
class GamePlayer
{
private:
enum{ NumTurns = 5 };
int scores[NumTurns];
};
关于enum:
1> enum的行为比较像#define,enum无法取地址
2> 纯粹的使用主义。enum是模版元编程的基础技术
3:使用inline来替换函数宏。又安全,又可以写出模版元编程
总结:对于常量,使用const enum来替换#define
对于形式函数的宏,使用inline来替换#define
*/
}
//#03 尽可能使用const
{
/*
1:const可以减少客户操作错误而造成意外,又不至于放弃安全性和高效性
很重要的一点关于+ - * /等运算符操作返回一个const类型是很好的选择
const Rational operator*(const Rational& lhs, const Rational& rhs);
可以避免一下的操作
Rtional a,b,c;
(a*b) = c;
2:const成员函数
将const实施于成员函数的目的,是为了确认该成员函数可作用于const对象身上。这类成员函数
重要的原因:
1>它们使class借口比较容易被理解。我们可以很容易地知道哪个函数可以改变对象内容,
哪个不行(这也是const成员函数的作用,加了const修饰符就表示不可修改)。
2>它们是的“操作const对象”成为可能。(当操作对象是const时优先调用const成员函数,相当于重载)
这是编写高效代码的关键,因为改善程序效率的根本办法是pass by reference-to-const
(也就是传入一个const修饰的引用)
关于下面的class
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;
{;
const成员函数可以控制const对象operator[]操作返回的值是const属性的
TextBlock tb("Hello");
const TextBlock ctb("World");
tb[0]='x'; //对的,tb是non_const对象,调用non_const版本的成员函数,返回值可以赋值
ctb[0]='x'; //错,ctb时const对象 operator[]操作调用const成员函数
//返回const类型值所以无法完成赋值操作
如果去掉const成员函数,那么const类型的对象返回的也是
可以修改的返回值。
如果去掉non_const成员函数,那么不管是不是const类型的对象,返回的都是不能修改的
返回值.
*/
}