码迷,mamicode.com
首页 > 编程语言 > 详细

Effective C++

时间:2016-08-21 22:50:03      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:

1.  C++视为多个子语言(cc++template c++stl)的组合

      对于不同的子语言,高效编程的准则不尽相同

     例如:对于C++template C++,传引用效率比较高。而对于cstl中的迭代器、函数对象,传值的效率比较高

 

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可以用来修饰变量、函数(参数、返回值、函数本身)

 

1const修饰变量,注意语法

 

 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指向内容为常量

 

2const返回值:防止函数返回值被修改,尤其是在操作符重载的返回值(例如operator*

 

           返回const引用和const对象有啥区别???

 

3const参数:对于函数中不被修改的参数,传const&,效率高

 

4const修饰函数

 

           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());

Effective C++

标签:

原文地址:http://www.cnblogs.com/arizona/p/2604683.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!