- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++中的作用域解析
名字空间主要用于解决名字冲突的问题,在名字空间消失之前,库的通常
通过附加给库中的类型,全局变量和函数予特定的前缀来防止名字冲突的
问题,例如dbus 库的 Error 类型和 Error 初始化函数被命名为:
DBusError
dbus_init_error
有了名字空间后,我们就可以通过附加名字空间的名字来构成名字的
限定名(Qualified Name)来解决名字冲突的问题。
固然更主要的是我们可以通过名字空间别名,使用声明(特定的名字)
和使用指示 (全部名字)来达成即能有效防止冲突,又能在已确定的上下
文中更便利的访问名字的作用。
跟 Java 的包机制不同,名字空间是纯规律上的,它不具备对文件组
织上任何的物理约束,一个名字空间可以跨越多个编译单元(常见的方式,
一个库一个名字空间),但也可以一个编译单元包含多个名字空间(比拟
少见,通常是用来通过嵌套的子名字空间来防止一些函数重载上的意外发
生)。(Java 中的包,编译单元,类型域的包含关系更加明确,简单理解
和使用,一个包必定包含一个或多个编译单元,一个编译单元也必定包括
一个或多个类型,而且只能有一个是包可见的——公共类)
有的意见认为,名字空间引起的问题比它解决的要多,比方连接时名
字解析的问题,特殊是不同编译器编译出来的程序片段(静态库,导入库,
Object 文件)如何能够正确的连接。名字空间也使得重载的决议规章变
的更简单。所以像有些的库仍旧坚持使用前缀的方式,比方QT
名字空间消失后,以前的全局域就变成了名字空间的一个特例——全
局名字空间 没有放置在某个名字空间的类型,具有编译单元外部链接的
非成员函数和变量就缺省属于全局名字空间
编译单元域
编译单元域是个比拟特别的域,它通常跟代码的物理组织方式有关
一个编译单元中非成员变量和函数的名字可以有外部链接,从而使得链接
器可以用来解决跨编译单元的名字引用的问题(跨编译单元的变量的名字
引用通常被视为是邪恶的东西)。但是也可以没有外部链接,从而防止一
些无意中产生的副作用(错误的引用了不是预想中的名字)
没有外部链接的名字处于编译单元域,这个可以通过附加 static 修
饰符来达成。例如:
static double static_d = 3.0;
Examda 提示: 也可以放置在一个特别的名字空间里,这个名字空间
叫做匿名名字空间,每个编译单元都可以有一个匿名名字空间,不同编译
单元之间的匿名名字空间不会相互影响,处于匿名名字空间的名字只能被
该编译单元所访问。例如:
namespace
{
double intern_d = 2.0;
}
namespace foo
{
static double static_d = 3.0;
Foo::Foo(void)
{
intern_d = 3.0;
}
Foo::~Foo(void)
{
}
}
像上面的非成员变量 intern_d 就是处于编译单元 foo (foo.cpp)的
匿名名字空间中。假如在头文件中试图导出这个变量,例如:
extern double intern_d;
实际上你会得到一个“ambiguous symbol”的编译错误(在VC 2022
中)。
类型域
用户使用struct和class定义一个自定义类型,也同时构成了一个
类型域,处于类型域里面的变量和函数被称为成员变量和成员函数,它们
可以是静态的(属于类型),也可以是非静态的(属于实例)。静态的成员
变量和成员函数与非成员变量和函数类似,而类型在这里只是起到一个特
别的名字空间的作用,或者说是附加类型成员访问规章的名字空间,公共
的静态成员函数假如是可见的,那也是可访问的,也就是具备外部链接。
函数域
每个函数都构成了一个函数域,函数域的概念跟变量的存储位置和生
命期有关。函数的参数和在函数中声明并定义的变量被称为局部变量或者
是自动变量,它们安排在堆栈上,它们随着函数的执行而生成,随着函数
的退出而消亡。而静态成员变量和非成员变量则安排在静态存储区中,它
们的位置是固定的,生命期从程序启动始终到程序关闭。(在自由存储区
中
原创力文档


文档评论(0)