重载与作用域
如果在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体。在不同的作用域中无法重载函数名字:
string read(); void print(const string &); void print(double);//重载print函数 void fooBar(int ival) { bool read = false;//新作用域:隐藏了外层的read string s = read();//错误:read是一个布尔值,而非函数 //不好的习惯:通常来说,在局部作用域中声明函数不是一个好的选择 void print(int);//新作用域:隐藏了之前的print print("Value:");//错误:void print(const string &)被隐藏掉了 print(ival);//正确:当前print(int)可见 print(3.14);//正确:调用print(int);print(double)被隐藏掉了 }
- 编译器调用 read 的请求时,找到的是定义在局部作用域中的 read 。这个名字是布尔变量,语句非法。
- 在 fooBar 内声明的 print(int) 隐藏了之前两个 print 函数,因此只有一个 print 函数可用:该函数以 int 值为参数。
- 一旦在当前作用域中找到所需要的名字,编译器就会忽略外层作用域中的同名实体。
- 当 print 传入一个 double 类型的值时,编译器在当前作用域内发现了 print(int) 函数, double 类型的实参转换成 int 类型,因此调用是合法的。
Note:C++中,名字查找发生在类型检查之前。
把 print(int) 和其他 print 函数声明放在同一个作用域内,则它将成为另一种重载形式:
void print(const string &); void print(double);//print函数的重载形式 void print(int);//print函数的另一种重载形式 void fooBar2(int ival) { print("Value:");//调用print(const string &) print(ival);//调用print(int) print(3.14);//调用print(double) }

浙公网安备 33010602011771号