• 认真地记录技术中遇到的坑!

8.2 类的作用域

C/C++ Moxun 2年前 (2018-01-23) 417次浏览 0个评论

[toc]8.2.1作用域
作用域就是指一个名字能够产生作用的范围。
在类的作用域之外,普通的数据和函数成员只能由对象、引用或者指针使用成员访问运算符来访问。对于类类型成员则使用作用域运算符来访问(静态成员)。不管怎样,跟在运算符之后的名字都必须是对应类的的成员。

作用域和定义在类外部的成员:
一个类就是一个作用域。在类的外部成员的名字被隐藏了,一旦遇到了类名,定义的剩余部分就在类的作用域之内了,这里剩余的部分包括参数列表和函数体。结果就是,我们可以直接使用类的其它成员而无须再次授权了。
另外,函数的返回类型通常出现在函数名之前,因此在类外部定义函数成员是,返回类型都在类作用域之外,这时返回类型必须指明它是哪个类的成员 :返回类型: 类名::成员。

名字查找和类的作用域
名字查找的过程:
1.首先在名字所在的块中寻找其声明语句,只考虑在名字使用之前出现的声明。
2.如果在没有找到,那么在外层作用域中查找
3.如果最终没有找到,那么程序报错

    对于定义在类内部的函数成员来说,类的定义分两步:
    1.首选in,编译成员的声明
    2.直到类全部可见后才编译函数体

    类成员声明的名字查找:
    声明中使用的名字,包括返回类型或者参数列表中使用的名字,都必须在使用前确保可见,如果某个成员的声明中使用了类中尚未出现的名字,则编译器会在定义该类的作用域中继续查找。

    类型名要特殊处理:
    一般来说,内层作用域可以重新定义外层作用域中的名字,即使该名字已经在内层作用域中使用过,但是在类中,如果成员使用了外层作用域中的某个名字,而该名字代表一种类型,则类不能在之后重新定义该名字。

    成员定义中的普通块作用域的名字查找:
    1.首先,在成员函数内查找该名字的声明。和前面一样,只有在函数使用之前出现的声明才被考虑。
    2.如果在成员函数内没有找到,则在类内继续查找,这时类的所有成员都可以被考虑,
    3.如果在类内也没有找到该名字的声明,在成员函数定义之前的作用域中继续查找。
    一般来说,不建议使用其它成员的名字作为某个成员函数的参数。

类作用域之后,在外围作用域中查找,(注意作用域运算符)

在文件中名字出现处对其进行解析:
当成员定义在类的外部时,名字查找的第三步不仅要考虑类定义之前的全局作用域中的声明,还需要考虑在成员函数定义之前的全局作用域中的声明。


转载请注明出处 8.2 类的作用域
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址