重载与作用域

如果在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体。在不同的作用域中无法重载函数名字:

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)
}

 

posted @ 2019-07-20 11:54  CodeWithMe  阅读(403)  评论(0)    收藏  举报