《c++语言的设计和演化》笔记(六)

17.1 引言

1.“对所有不适合放进某个函数、某个struct或者某个编译单元的名称,C语言提供了一个统一的全局性的名称空间,这就带来了名称的冲突问题…在我设计类型安全的连接机制时…我注意到,对以下形式:

extern "C" {
   /*...*/}

的语法、语义和实现技术稍微做些修改,就能允许我们用以下形式:

extern XXX {
   /*...*/}

表示在XXX中声明的名称位于一个分离的作用域XXX中,要从其他作用域中访问就需要用限定的XXX::形式,和在类之外访问静态类成员完全一样。
” (p.351)

17.4 一个解决方案:名称空间

1.“…访问名称空间成员采用访问类成员的传统记法:namespace_name::member_name。事实上,类作用域可以看成是名称空间作用域的一种特殊情况。”(p.355)
2.“考虑:

namespace A {
   
	void f(int);
	void f(char);
	class String {
   /*...*/};
}

在名称空间括号中声明的名称就是在名称空间A内部的内容,它们不会与全局的名称或者其他任何名称空间中的名称冲突。名称空间声明(包括定义)与全局声明具有完全相同的语义,只是它们名称的作用域被限制在名称空间内部。
程序员可以通过显示限定的形式直接使用这些名称:

A::String s1="Annemarie";
void g1()
{
   
	A::f(1);
}

换一种方式,我们也可以显示地让某个特定库中的个别名称不需要限定描述而直接使用,这通过使用声明完成。

using A::String;
String s2="Nicholas"; //meaning A::String
void g2()
{
   
	using A::f; //introduce local synonym for A's f
	f(2); //meaning A::f
}

上述使用声明在一个局部作用域为它所提出的名称引进了一个同义词。
再换一种方式,我们也可以显式地要求一个特定库中所有的名称都直接被使用,不需要借助限定,这通过使用指示完成。

using namespace A; //make all names from A accessible
String s3="Marian"; //meaning A::String

void g3()
{
   
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值