您的位置:首页 > 移动开发 > IOS开发

const&volatile 与函数重载

2007-08-13 04:08 351 查看
首先要明确的概念:const&volatile关键字,可以用于实现函数重载。

然而事情并不是像这句话看起来这么简单。

首先,对于采用传值方式的参数,const &volatile 关键字无法区分参数类型,不具备实现函数重载的能力。

如:

void func (int a );
void func  (const int a);

这两个函数声明会被编译器视为重复声明。 
  

其次,对于采用指针和引用这两种传递方式的参数,const &volatile关键字此时可以区分参数类型,可以实现函数重载。



void func( int * a);
void func( const int * a);
void func( int & a);
void func( const int & a);

上述4个函数会被视为4个不同版本的重载。

最后,const & volatile关键字在后置修饰类成员函数时,同样具备实现函数重载的能力。



class A
{
   void sig (int a) const;
   void sig (int a ) ;
};

class A中的sig函数有两个版本,对于non-const的A类型对象,会调用non-const版本的sig(),而对于const的A类型对象,则会调用const版本的sig()。

这一特性很容易理解:我们都知道对于非静态类成员函数,在其被调用时由编译器隐式的传入this 指针,对于non-const对象调用sig()时,所传入的this指针的类型为 A *,而对于const对象调用sig()时,所传入的this指针的类型为 const A *,编译器就根据this 指针类型的不同来完成函数重载。

实际上,对下面的测试程序进行反汇编,也可以看出编译器为两个版本的sig()所生成的用于链接的函数名是不同的——我用g++编译后,non-const版本和const版本的sig()的名称分别是"_ZN1A3sigEi"和“_ZNK1A3sigEi”

以下是测试代码


#include <iostream>




using namespace std;




class A




{


public:






  A()...{ count=0;}






  void sig(int a ) const ...{ cout<<"const version--count="<<count<<endl;}






  void sig(int a ) ...{ count=a; cout<<"non-const version--count="<<count<<endl;}




private:




  int count;




};




int main ( int argc,char * argv[])






{






   /**//*const*/  A tmp;




   tmp.sig(1);


   tmp.sig(2);




   return 1;




}


......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息