1、C++由四个次语言组成:c、c++类对象、template C++、STL
c++高效编程守则视状况而变化,取决于使用c++的哪一部分。
2、尽量以const、enum、inline替换#define
a、常量定义式通常被放在头文件中(以便被不同的源码包含进去),如果想将常量指针(即指向常量的指针)放入头文
件中,必须指定指针也是const的,这就需要写const两次,例如:const char * const author="musun";
通常string对象比char *-based合适。即const std::string author("musun");
b、class的专属常量:为了将常量的作用域限制于class内,须让它成为class的一个成员,而为确保此常量至多只有一份
实体,必须让它成为一个static成员。
class GamePlayer{
private:
static const int NumTurns=5;//常量定义式
int scores[NumTurns];//使用该常量
}
无法利用#define创建一个class专属常量,因为#define不重视域,不能被封装,一旦宏被定义,就在其后的编译过
程中有效。
c、“the enum hack”:当不想让别人获得一个pointer或reference指向某个整数常量,enum可以实现这个约束。
d、宏函数方面:用inline函数替换
最后:对于单纯常量,最好以const对象或enum替换#define
对于形似函数的宏,最好改用inline函数替换#define
3、尽可能使用const
a、const char * p <==> char const * p ;//都表示p指向的值不可变
char * const p;//表示p不可指向不同的东西
b、在迭代器中:
const vector<int>::iterator iter; <==> T* const p,即iter不可变
vector<int>::const_iterator cIter;<==> const T * p,即cIter指向的值不可变
c、令函数返回一个常量值,使用const参数 例如:
const Rational operator*(const Rational& lhs,const Rational& rhs);
d、const成员函数:一是接口容易理解,二可以使“操作const对象”成为可能
两个成员函数如果只是常量性不同,也够成重载,例如:
class test{
void print() const
{
_text="abc";//如果_text不声明为mutable,会报错
cout<<"print const"<<endl;
}
void print()
{
cout<<"print"<<endl;
}
mutable string _text;
};
在const成员函数中,需要对成员变量做修改时,可将成员变量声明为mutable。
e、在const和non-const成员函数中避免重复:
运用const函数实现其非const版本的技术,反过来,用non-const实现const则是不安全的
例如:
const char& operator[](size_t position) const
{
...
}
char& operator[](size_t position)
{
return const_cast<char&>( //将op[]返回值的const转除
static_cast<const T&>(*this) //为*this加上const
[position] //调用const op[]
);
}
最后:多使用const,当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免重复
。