1. 视C++为一个语言联邦
C++有四种使用方式
- C
- Object-Oriented C++
- Template C++
- STL
不同部分的高效编程守则是不一样的
C++高效编程守则视状况而变化,取决于使用C++的哪那一部分
2. 尽量以const,enum,inline替换#define
常量的定义一般放在头文件,下面看看两种特殊情况
1. 定义常量指针
const char* const name = "Lily";//const写两次
const string name("Lily"); //这样更好些
- class的专属常量
为了专属class,需要是class的成员;为了不属于某个对象,需要是static
class Game
{
private:
static const int kNum = 5;
int scores[kNum];
}
另一种方案
class Game
{
private:
enum {kNum = 5};
int scores[kNum];
}
inline代替函数形式的宏
3.尽可能使用const
3.1 const表示
const左边表示被指物是常量,在*右边代表,指针是常量,如下
char greeting[] = "Hello";
char *p = greeting; //non-const pointer,non-const data
const char* p = greeting; //non-const pointer,const data
char* const p = greeting; //const pointer,non-const data
const char* const p = greeting; //non-const pointer,non-const data
3.2 const成员函数
C++的一个重要特性需要注意,两个成员函数如果只是常量性不同,可以被重载,关于const两种阵营:bitwisw constness(physical constness,自不用说,就是const的本意)和 logical constness。看看如何试下logical constness,用mutuable来实现
class CTestBlock
{
public:
std::size_t length() const;
private:
char* pText;
mutable std::size_t textLength; //这些变量可能被更改,即使在const函数内
mutable bool lengthIsValid;
}
std::size_t CTestBlock::length() const
{
if (!lengthIsValid)
{
textLength = std::strlen(pText);
lengthIsValid = true;
}
return textLength;
}
3.3 const成员函数和non-const成员函数避免重复
直接看一个例子吧
class TestBlock
{
public:
const char& operator[] (std::size_t position) const
{
...
}
char& operator[] (std::size_t position)
{
return const_cast<char&>( //将op返回值的const转除
static_cast<const TextBlock&>(*this) //为*this加上const
[position] //调用const op[]
);
}
}
千万不要试图实现non-const版本,然后再const版本调用non-const版本。
4.确定对象被使用前已先被初始化
- 内置类型初始化
- class,初始化落在构造函数,确保构造函数都将对象的每个成员初始化,总是使用初始化列表,class的成员变量总是以其声明的次序初始化
另外注意如下写法
ABEntry::ABEntry()
:theName(), //调用theName的default构造函数
theAddress(),
thePhones(),
num(0)
{}
如果成员变量是reference或const,就一定需要初值,不能被赋值
3. 不同编译单元内定义只non-local static对象
这个麻烦,不说了,见书吧,解决办法如下
请以local static对象替换non-local static对象,并用一函数返回其引用