怎样重载一个函数名

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

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

 

 

### 函数重载的条件 在C++中,函数重载是指在**同一作用域**中允许存在多个**同名函数**,这些函数的**参数列表不同**,但**函数名相同**。编译器会根据调用时传入的参数类型和数量来决定调用哪一个函数。这是C++支持多态性的一种方式。 函数重载的条件如下: 1. **函数名必须相同** 所有重载的函数必须具有相同的函数名。这是函数重载的前提条件[^1]。 2. **参数列表必须不同** 参数列表的不同可以体现在以下三个方面: - 参数个数不同 例如:`int func(int a)` 和 `int func(int a, int b)` 是有效的重载。 - 参数类型不同 例如:`int func(int a)` 和 `int func(double a)` 是有效的重载。 - 参数顺序不同 例如:`int func(int a, double b)` 和 `int func(double b, int a)` 是有效的重载[^1]。 3. **返回值类型不参与重载判断** 函数的返回值类型**不能作为区分重载函数的依据**。如果两个函数仅返回值类型不同,则会导致编译错误。例如,以下代码是非法的: ```cpp int add(int a, int b); // 错误:仅返回值不同 double add(int a, int b); // 与上一个函数构成重复定义 ``` 4. **调用约定(如 `_stdcall`、`_cdecl`)不参与重载判断** 不同的调用约定(calling convention)也不能作为函数重载的依据。调用约定影响的是函数在底层的调用方式,而不是函数的接口签名。 5. **作用域必须相同** 重载函数必须定义在**同一个作用域**中。如果两个同名函数位于不同的命名空间或类中,则它们不属于重载函数,而是完全不同的函数。 6. **引用和常量引用可以作为重载条件** C++允许通过参数的引用类型(如`int&`)和常量引用(如`const int&`)进行函数重载。例如: ```cpp void fun(int &a) { std::cout << "int &a" << std::endl; } void fun(const int &a) { std::cout << "const int &a" << std::endl; } ``` 在这种情况下,调用`fun(10)`会调用第二个函数,因为字面量`10`是常量,不能绑定到非常量引用上,而`const int&`可以绑定到临时量[^3]。 --- ### 示例代码 ```cpp #include <iostream> using namespace std; int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } int add(int a, int b, int c) { return a + b + c; } int main() { cout << add(2, 3) << endl; // 调用第一个 add cout << add(2.5, 3.5) << endl; // 调用第二个 add cout << add(1, 2, 3) << endl; // 调用第三个 add return 0; } ``` --- ### 注意事项 - 函数重载不能仅通过返回值类型来区分。 - 默认参数不能用于重载判断,但可以与重载函数结合使用。例如,带有默认参数的函数不能与另一个参数完全匹配的函数共存[^4]。 - 函数重载的语义应保持一致,避免因参数不同而导致完全不同的行为,以提高代码的可读性和可维护性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值