c++函数重载,下列情况不能重载

1.如果两个函数的参数表相同但是返回类型不同

会导致一个重复申明的编译错误,例如
 unsigned int max( int i1, int i2 );
 int max( int , int ); // 错误: 只有返回类型不同
函数的返回类型不足以区分两个重载函数

 

2.typedef 名为现有的数据类型提供了一个替换名它并没有创建一个新类型因此如果
两个函数参数表的区别只在于一个使用了typedef 而另一个使用了与typedef 相应的类型
则该参数表不被视为不同的下列calc()的两个函数声明被视为具有相同的参数表第二个
声明导致编译时刻错误因为虽然它声明了相同的参数表但是它声明了与第一个不同的返
回类型
// typedef 并不引入一个新类型
typedef double DOLLAR;
// 错误: 相同参数表不同返回类型
extern DOLLAR calc( DOLLAR );
extern int calc( double );

 

3.当一个参数类型是const 或volatile 时在识别函数声明是否相同时并不考虑const 和
volatile 修饰符例如下列两个声明声明了同一个函数
// 声明同一函数
void f( int );
void f( const int );
参数是const 这只跟函数的定义有关系它意味着函数体内的表达式不能改变参数的
值但是对于按值传递的参数这对函数的用户是完全透明的用户不会看到函数对按值
传递的实参的改变按值传递的实参以及参数的其他传递方式在7.3 节中讨论当实参
被按值传递时将参数声明为const 不会改变可以被传递给该函数的实参种类任何int 型的
实参都可以被用来调用函数f(const int) 因为两个函数接受相同的实参集所以刚才给出的
两个声明并没有声明一个重载函数函数f()可以被定义为
void f( int i ) { }

void f( const int i ) { }
然而在同一个程序中同时提供这两个定义将产生错误因为这些定义把一个函数定义了两次


但是如果把const 或volatile 应用在指针或引用参数指向的类型上则在判断函数声明
是否相同时就要考虑const 和volatile 修饰符
// 声明了不同的函数
void f( int* );
void f( const int* );
// 也声明了不同的函数
void f( int& );
void f( const int& );

猜你喜欢

转载自blog.csdn.net/tanlovezhao/article/details/15027229
今日推荐