环境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;
}