C++编译器名字查找策略

环境vs2015

首先是C++ primer原话:

对于定义在块中的对象,只考虑在名字使用之前出现的声明,如果没找到递归向外查找,直至报错。

对于定义在类内的成员来说,解析其中名字与上述规则有区别:

1、首先编译成员的声明;

2、直到类全部可见后才编译函数体

验证程序:

typedef double Money;
class Account {
Money getBudget(Money m) { 
Money n = m;//这里会提示精度损失
return budget; }

Money budget;
typedef int Money;
Money getBudget(Money n) {
Money m = n;
return budget;
}

};


可以看出类内的成员函数定义的函数体部分类型是声明在类内的Money类型;

在类内Money类型声明前的budget变量类型和getBudget成员函数的返回值类型和形参类型是类外定义的Money类型;

类内出现在类内Money类型后面的getBudget成员函数返回值类型和形参类型采用的类内声明的Money类型


还有一点就是:

定义在类外的成员函数返回值类型作用域不是类作用域,所以如果返回值类型定义在类内,需要单独加上类作用域说明符,形参因为在函数名字前已经有类作用域说明符,所以不需要单独加类作用域说明符。

成员函数定义在类外的名字查找顺序:

1、在成员函数内名字使用前查找

2、在类内全局查找

3、在成员函数定义之前的作用域查找

例如

Person{

typedef std::string::size_type ID;

...

}

Person::ID Person::getID()const//返回值需要
{
return id;

}

Person & Person::setId(ID i)//形参不需要
{
id = i;
return *this;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值