C++中的作用域解析,第1张

C++中的作用域解析,第2张

names 空
和names 空之间的域主要用于解决名称冲突的问题。在名字空出现之前,库作者通常会给库中的类型、全局变量和函数添加特定的前缀,以防止名字冲突。比如dbus库的错误类型和错误初始化函数命名为:
dbuserror
dbus _ init _ Error
。有了名字空,我们就可以通过在名字空之间加名字,形成限定名来求解。
当然,更重要的是,我们可以在名称空、语句(特定名称)和指令(所有名称)之间使用别名,达到有效防止冲突的效果,更容易在已建立的上下文中访问名称。
不像Java的打包机制,名字空是纯逻辑的,对文件组织没有任何物理约束。一个名字空可以跨多个编译单元(常见的方式,一个库有一个名字空),但是一个编译单元也可以包含多个名字。(在Java中,包、编译单元和类型字段的包含关系更加清晰,更容易理解和使用。一个包必须包含一个或多个编译单元,一个编译单元也必须包含一个或多个类型,并且其中只有一个类型对package-public类可见。)
有些人认为空这个名字引起的问题比它解决的问题还多,比如连接。名称空也使重载的解析规则变得复杂。所以有些库还是坚持用前缀,比如QT。
名称空出现后,之前的全局域就变成了名称空-全局名称空的特例。如果某个名称空中没有放置类型,那么编译单元外部链接的非成员函数和变量默认属于全局名称空。
编译单元域
编译单元域是一个特殊的域,通常与代码的物理组织有关。一个编译单元中的非成员变量和函数的名字可以有外部链接,这样就可以用链接器来解决跨编译单元的名字引用问题(跨编译单元的变量的名字引用通常被认为是邪恶的东西)。然而,也可以没有外部链接,以防止一些意想不到的副作用(错误引用不期望的名称)。
没有外部链接的名称在编译单元域中。这可以通过附加静态修饰符来实现。例:
static double static _ d = 3.0;
Examda提示:也可以放在专门的命名室空,称为匿名命名室空。每个编译单元在不同的编译单元之间可以有匿名名room 空和匿名名/[/k0。示例:
namespace
{
double internet _ d = 2.0;
}
命名空间foo
{
static double static _ d = 3.0;
Foo::Foo(void)
{
intern _ d = 3.0;
}
foo:: ~
实际上会得到一个“二义性符号”(VC 2008中)的编译错误。
类型域
用户使用struct和class定义自定义类型,这也构成了类型域。类型域中的变量和函数称为成员变量和成员函数,可以是静态的(属于类型),也可以是非静态的(属于实例)。的静态成员变量和成员函数与非成员变量和函数类似,而类型在这里只起特殊名称空的作用,或者附加类型成员访问规则的名称空的作用。如果公共静态成员函数是可见的,那么它也是可访问的,即它有外部链接。
函数域
每个函数都构成一个函数域,函数域的概念与变量的存储位置和寿命有关。函数的参数以及函数中声明和定义的变量称为局部变量或自动变量。它们分布在堆栈上。它们随着函数的执行而产生,随着函数的退出而消失。而静态成员变量和非成员变量分布在静态存储区,它们的位置是固定的,它们的生命周期是从程序启动到程序关闭。(自由存储区中动态分配的对象的生命周期由用户控制。)
函数也可以有多个局部字段,比如每个if、else、else if、for、while、do、switch、try、catch块或者用户自己生成的代码块(用{}包围)。局部域的作用通常是用来进一步限制局部变量的范围。在本地域中声明的局部变量将在退出本地域时自动销毁。用户生成的代码块(本地域)主要用于所谓的关键区域,以同步线程对外部状态的访问。如果函数需要写得很长,刻意区分不同的局部字段也会有助于代码的可读性,防止不必要的错误。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++中的作用域解析

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情