1.C++可视为一个由相关语言组成的联邦,而不是单一语言。每一个次语言都有自己的规约,编程守则也视情况而变化。
- C. C++仍然是以C为基础的。
- Object-Oriented C++: 面向对象的设计。包括 类(构造函数,析构函数),封装,继承,多态,动态绑定(虚函数)..
- Template C++:C++泛型编程(template)..
- STL:标准模板库,对容器,迭代器,算法以及函数对象的使用
2.最好以const对象,enum hack替换预编译#define.对于形似函数的宏,最好改用inline函数而不是#define.
3.const的使用
- const 出现在*左边表示 被指物是常量,出现在*右边是说指针是常量
<pre>const int * pc; //表示被指为常量
int const * pc; //同上
int* const pc; // 表示指针为常量不能修改</pre>
<pre> const iterator 代表T* const
const_iterator 代表 const T*</pre>
使用const声明可以让编译器侦测出一些错误用法。
编译器强制实施bitwise constness,但编写程序仍然要小心注意conceptual constness.
<pre>mutable可以释放non-static成员变量的bitwise constness约束,使其能在const成员函数中被赋值-
const和nonconst成员函数有着实质等价的实现时,用nonconst版本去调用const版本可以避免代码重复
<pre>char & operator[] (std::size_t position)
{ return
const_cast<char &>(
static_cast<const TextBlock&>(*this)[position] );
}</pre>以上实施了两次转换,首先将*this的原始类型转换成const,然后从const operator[]的返回值中移除const。
4.确定对象被使用前初始化
为内置类型进行手工初始化,因为C++不能保证初始化他们。
构造函数最好使用成员初始化列,而不是在构造函数本体内使用赋值操作。比如下面的numTimesConsulted是一个int类型,这里必须手工初始化他们,而其他的类型可以调用各自的赋值构造函数(copy constructor)去进行初始化。如果在本体内进行初始化,实际上是要首先调用default构造函数去为成员变量设初值,然后立刻再对他们赋予新值。
<pre>
Entry::Entry(const string& name, const string& address,
const list<PhoneNumber>& phones)
: theName(name),
theAddress(address),
thePhones(phones),
numTimesConsulted(0)
{}</pre>