怎样重载一个函数名

当一个函数名在一个特殊的域中被声明多次时,编译器按如下步骤解释第二个(以及后续的)的声明:

1、如果两个函数的参数表中参数的个数或类型不同,则认为这两个函数是重载的。例如:

      //重载函数

      void print(const string &) ;

      void print(vector<int> &) ;

2、如果两个函数的返回类型和参数表精确匹配,则第二个声明被视为第一个的重复声明。例如:

      //声明同一个函数

      void print(const string &str) ;

      void print(const string &) ;

这说明参数表的比较过程与参数名无关

3、如果两个函数的参数表相同,但是返回类型不同,则第二个声明被视为第一个的错误重复声明,会被标记为编译错误。例如:

      unsigned int max(int i1, int i2) ;

      int max(int, int) ;   //错误,只有返回类型不同

这说明函数的返回类型不足以区分两个重载函数。

4、如果在两个函数的参数表中,只有缺省实参不同,则第二个声明被视为第一个的重复声明。例如:

      //声明同一个函数

      int max(int *ia,int sz) ;

      int max(int *, int  = 10)  ;

5、如果两个函数的参数表中,参数类型是const或volatitle时,识别函数声明是否相同时,并不考虑const或volatitle修饰符。例如,下列两个声明声明了同一个函数:

      //声明同一个函数

      void f( int ) ;

      void f( const int ) ;

       参数是const,这只跟函数的定义有关系:它意味着,函数体内的表达式不能改变参数的值。但是,对于按值传递的参数,这对函数的用户是完全透明的:用户不会看到函数对按值传递的实参的改变。但实参被按值传递时,将参数声明为const不会改变可以被传递该函数的实参的种类。任何int型的实参都可以被用来调用函数f(const int)。因为两个函数接收相同的实参集,所以刚才给出的两个声明没有声明一个重载函数。

但是,如果把const或volatitle应用在指针或引用参数指向的类型上,则在判断函数声明是否相同时,就要考虑const和volatitle修饰符。

       //声明了两个不同的函数

          void f( int* ) ;

          void f( const int * ) ;

       //也声明了两个不同的函数

          void f( int& ) ;

          void f(const int &) ;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值