c++类_名字查找和类的作用域

本文详细阐述了C++中类的作用域和名字查找的规则,包括从当前块到外层作用域逐步查找声明的过程。在类内部,成员函数的声明和定义处理方式有所不同,编译器先处理所有成员声明,再处理函数体。举例说明了类内的typedef作用域,并指出如果类中类型重命名已使用的外部名字会导致错误。
摘要由CSDN通过智能技术生成

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; //此处的重新定义是错的
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值