当一个函数名在一个特殊的域中被声明多次时,编译器按如下步骤解释第二个(以及后续的)的声明:
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 &) ;
2419

被折叠的 条评论
为什么被折叠?



