c++类_名字查找和类的作用域
-
首先,在名字所在的块中寻找其声明语句,只考虑在名字的使用之前出现的声明。
-
如果没找到继续查找外层作用域
-
如果最终没有匹配的声明,程序报错
对于在类内部的成员函数来说,解析其中名字的方式和上述的查找规则有所不同,类的定义分两步处理:
-
首先编译所有成员的声明
-
直到类全部可见之后才编译函数体(即编译器处理完所有声明后才会处理成员函数的定义)
例子
typedef string Type;
Type initval();
class Test1
{
public:
typedef double Type;
Test1() {};
~Test1() {};
Type setVal(Type);
Type initval(Type);
private:
int val;
};
Test1::Type Test1::setVal(Test1::Type param)
{
val = param + initval(param);
return val;
}
Test1::Type Test1::initval(Test1::Type x)
{
return x + 2.0;
};
Type initval()
{
return "123";
}
编译器所选择的是vs2019,对应于c++ prime上练习7.35。
此处若两个成员函数的定义返回类型前不加作用域运算符则其Type是类外层作用域中string的别名。
而其形参中的Type可以不加作用域运算符,其作用域是属于函数内即类的块中,故而其Type为类中的double的别名。
————————————————————————————————
若类中的类型重新命名之前的某个成员使用了外层作用域的名字,则后续不能在类中重新定义该名字。
即
typedef string Type
class Test{
Type x;
typedef int Type; //此处的重新定义是错的
}