标签:
1. 把C++视为多个子语言(c,c++,template c++,stl)的组合
对于不同的子语言,高效编程的准则不尽相同
例如:对于C++和template C++,传引用效率比较高。而对于c和stl中的迭代器、函数对象,传值的效率比较高
2. 用const/enum/inline代替define
用const对象代替宏定义有几个原因:
(1)宏替换后就只能看到值,看不到变量名,不利于问题定位
(2)宏替换增加内存开销(浮点数)
(3)宏没有作用域的概念
在类中定义常量,使用static const。
整数类型(只有整数类型)的static const成员变量可以直接在类声明中初始化(也要看编译器是否支持)
Class Test
{
Private:
static const int NUM = 5;
}
如果编译器支持并且在使用过程中不需要取NUM的地址,则NUM不用在.cpp文件进行定义
如果编译器不支持,即使NUM已经在声明时进行过初始化,也必须在cpp文件中定义。由于已经初始化过定义的时候可以不进行赋值。
enum:
如果类中要声明一个已知大小的数组,而static const int又不能直接在声明中初始化,则可以使用enum来解决
Class
{
enum{ NUM = 5 };
Int m_Array[NUM];
}
Inline: 用于代替宏定义替换函数
3. 尽量使用const
const可以用来修饰变量、函数(参数、返回值、函数本身)
(1)const修饰变量,注意语法
const char * p = "hello" //指针指向内容为常量
char const * p = "hello" //指针指向内容为常量
char* const p = "hello" //常量指针
const char* const p = "hello" //常量指针,指向内容为常量
const在*左边:指针指向内容为常量
const在*右边:指针为常量
迭代器本身为指针,因此加上const修饰后,为常量指针,即指针不能修改
cosnt vector<string>::iterator iter = vctr.begin();
Iter ++; //非法,常量指针
*iter = "hello" //ok
vector<string>::const_iterator iter = vctr.begin();
iter++; //ok
*iter = "hello"; //错误,iter指向内容为常量
(2)const返回值:防止函数返回值被修改,尤其是在操作符重载的返回值(例如operator*)
返回const引用和const对象有啥区别???
(3)const参数:对于函数中不被修改的参数,传const&,效率高
(4)const修饰函数
a. 根据函数的常量性不同,可以进行重载
const对象调用const函数,非const对象调用非const函数
注意:非const对象可以调用const成员函数,const对象只能调用const成员函数
b. const函数不能对函数的成员变量进行修改,否则会编译失败
如果希望在const函数中修改函数的成员变量,需用mutable修饰成员变量
c. 同一个函数的const和非const版本,其实现可能是相同的,怎么才能防止重复代码呢:在非const函数中调用const函数
const_cast<string&>(static_cast<const Rule3&>(*this).TestConstFunc());
标签:
原文地址:http://www.cnblogs.com/arizona/p/2604683.html