一、让自己习惯C++
1、视C++为一个语言联邦
为了理解C++必须认识其主要的次语言,总共有四个:
C、Object-Orented C++(面向对象设计)、Template C++(泛型编程)、STL(标准模板库)。
2、尽量以const、enum、inline替换#define
避免边际效应
- 对于单纯常量,最好以const对象或enums替换#defines。
- 对于形似函数的宏,最好该inline函数替换#defines。
3、尽可能使用const
const是一个限定符,用来进行语义约束,指定一个不该被改动的对象。
const vector<int>::iterator ite = vec.begin(); //值可变
vector<int>::const_iterator const_ite = vec.begin(); //值不可变
声明迭代器为const跟声明指针为const一样(T* const),表示这个迭代器不得指向不同的东西,但是所指的东西的值可以改变。
可令函数返回一个常量值,避免客户错误操作。
const Rational operator* (const Rational& lhs, const Rational& rhs);
Rational a, b, c;
(a * b) = c; //避免的在a * b上的赋值的奇怪动作
在函数()后增加const,将函数设置为访问函数,表示里面的对象是不允许改变的。当我们返回一个reference时记得在其最前面也加个const,不然返回一个reference-non-const又与你声明的const冲突。
class co{
public:
char& operator[] (size_t position) const //将函数设置为访问函数,称为常成员函数
{return pText[position];} //返回值是一个char&
private:
char* pText;
};
const co cc("hello");
char* pc = &cc[0];
*pc = 'j'; //cc内容变为了"jhello"
当我们在char前面增加const声明,编译器就不会允许这样的改变
当我们设定了const成员函数但是又希望里面的某些变量能被我们改变,那么我们就可以用到摆动场:mutable。
mutable char* pText;
4、确定对象被使用前已先被初始化
1、构造函数的一个较佳写法是,使用member intitialization list(成员初始列)替换赋值动作
2、对于大多数类型而言,比起先调用default构造函数然后再调用copy assignment操作符,单只调用一次copy构造函数是比较高效的,有时甚至高效得多。
ABEntry::ABEntry(const std::string &name, const std::string &address,
const std::list<PhoneNumber> &phones)
:theName(name),
theAddress(address),
numTimesConsulted(0)
{ }