命名空间

1、对象文件:编译的每个cpp源文件都会生成一个对象文件,注意该对象与类的对象无关。对象文件只是包含编译器 的输出的二进制文件,后缀一般为obj。对象文件由链接程序组合到一个可执行模块中,该模块的后缀通常是exe。

2、名称空间的含义:名称空间即提供一个声明名称的区域,一个名称空间的名称不会与另一个名称空间里的相同的名 称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西。 

3、名称空间的创建:创建名称空间使用关见字namespace,比如namespace hh{int a; double b;}就声名了一个名为hh的 名称空间,空间内声明了两个成员。注意大括号后不能有分号。

4、命名空间可以在全局作用域或其他作用域中定义(比如一对大括号中),也可以在另一个名称空间中,但不能在类和函 数内部定义。

5、访问给定名称空间中的名称:可以使用三种方法来访问名称空间中的内容,即使用作用域解析运算符,using声明和 using编译指令,下面将分别介绍。

6、使用作用域解析运算符访问名称空间中的成员:比如名称空间hh中有成员int a和double b,则使用作用域解析运算 符访问的方法为hh::a=3; hh::b。

7、使用using声明访问名称空间中的成员:使用作用域解析运算符访问名称空间中的成员时每次都要使用作用域解析 运算符来限定名称,如果使用using声明后则以后在相同作用域中访问名称空间中的成员就不用再使用作用域解析运算符,而可以直接使用名称空间中的名字来访问。注意using声明的作用域是从声明该using语句开始,直到包含该using声明的作用域的末尾。比如有名称空间namespace hh{int a; void g();}则在main函数中使用了using hh::g;之后,在using之后的所有语句要使用名称空间中的g函数时都不需再使用作用域解析运算符了,即可以直接调用g函数。

8、使用using编译指令访问名称空间中的成员:using声明使名称空间中的一个名称可用,而using编译指令则使名称 空间中的所有名称都可用,而不需要再使用作用域解析运算符。using编译指令的格式为:”using namespace 名称空间名”其中using namespace是必须的关键字。using编译指令的作用域和using声明一样,取决于使用using编译指令出现的位置。如果在全局空间中使用using编译指令,则将使该名称空间全局可用。如果在局部使用using编译指令,则只在该局部作用域中可见。 

9、在局部作用域中使用作用域解析运算符访问全局域中的变量的方法:比如在全局域中有int a=3;则在main函数中访 问a的方法类cout<<::a。

10、名字冲突与作用域(类名是个特例):在相同的作用域中声明相同的名字时会出现名称冲突,比如在全局或局部作用域 中声明一个整型变量g与一个函数g,则会出现名称冲突的错误。同样如果在全局定义一个名字而又在局部定义一个同名的名字时则局部的名字会隐藏全局的名字,比如全局定义一个函数g,而又在局部定义一个整型变量g,则整型变量g将隐藏掉同名的函数g,要使用同名的g函数需要使用诸如::g()这样的语法。 

11、对于类名的名字冲突的情况,比如在全局同时声明class g{};和int g=3;两个名字的顺序不关紧要,则同名的整型变量 名将把类名隐藏掉,也就是说不能在main函数中创建类g的对象即使使用::g m的语法不能创建,但能正常访问整型变量g。但如果int g=3;在局部作用域中,整型变量g同样隐藏掉类名g,但能使用语法::g m;创建对象g。对于类名与同名的函数名也有类似的情况出现。 

12、使用using声明导入了一个与全局或局部作用域中相同名称的几种情况: a、在全局作用域中使用using声明导入的名称与全局域中定义的名称同名时,using声明的次序无关紧要,则会出现同名变量重定义的情况。注意,这里的同名包括函数名与变量名同名,即int a=2; void a(){}这两个都是同名的。但类名是个例外,比如int a=2; 与class a{};如果出现这种情况,则会出现无法创建类的对象的情况,但可以访问另一个名称,比如using hh::a;其中a是类,与int a=3;则a m;或者hh::a m;这样的语句将是错误的,但是整型变量a能正常访问到。注意这里又有个例外,如果using声明语句在int a=3之后的话则能创建对象,但把整型变量a隐藏了,这条规则与前面介绍的名字冲突有点不一样。相反,如果using hh::a;其中a是整型变量,与class a{};则a m;或者::a m都是错误的,但变量a能访问到,这里不管using声明在类定义的前面还是后面都会出现这样的情况。类与函数同名也是这样的情况。至于为什么会这样,偶不是很清楚,这可能与编译器有关。

b、在全局作用域中使用using声明导入的名称与局部域中定义的名称同名时,则局部的名称将隐藏掉全局的名称。注意这里的同名同样是指的函数名,变量名,类名,这里的类名不是特例。要访问名称空间中的相同名称只须使用作用域解析运算符即可。
c、在局部作用域中使用using声明导入的名称与局部域中定义的名称同名时,using声明的次序无关紧要,则会出现同名变量重定义的情况。注意,这里的同名包括函数名与变量名。但类名是个例外,比如在vc++中的main函数中使用using hh::a,其中a是类名,再定义一个int a=3;则如果编译就会出现编译器内部错误的情况,但把using hh::a放在int a=3之后则不会出现这种错误,这时能创建对象,但把局部整型变量a隐藏了。
d、在局部作用域中使用using声明导入的名称与全局域中定义的名称同名时,则局部的名称空间中的名称会隐藏掉全局域中的名称,要访问全局域的名称则要使用作用域解析运算符。注意,这里的同名包括变量名,函数名与类名,这里的类名不是个例外。


13、使用using编译指令导入一个与已经定义的名称同名的几种情况
a、在全局使用using编译指令导入的名称与全局域中的名称同名时,using编译指令出现的次序无关紧要,如果不使用这个同名的名称则不会出错,但一旦使用该名称时就会出现调用不明确的情况。要使用这些同名的变量需要使用作用域解析运算符,对全局的名称使用诸如::a的语法,对名称空间中的名称使用诸如hh::a的语法。这里的同名包括函数名,变量名与类名。
b、在全局使用using编译指令导入的名称与局部域中的名称同名时,则局部域中的名字将隐藏掉全局中使用using编译指令导入的同名的名字,这里的同名包括函数名,变量名与类名。
c、在局部域中使用using编译指令导入的名称与局部域中的名称同名时,using编译指令出现的次序无关紧要,则局部域中的名称将隐藏掉使用using编译指令导入的同名的名称,如果要使用名称空间中的名称则需要使用作用域解析运算符,这里的同名包括函数名,变量名与类名。
d、在局部域中使用using编译指令导入的名称与全局域中的名称同名时,如果不使用该名称则不会出错,一旦使用该名称就会出现调用不明确的错误。如果要访问这些同名的名称可以使用作用域解析运算符,对全局变量可以使用如::a的语法,对名称空间中的名称可以使用如hh::a的语法。这里的同名包括函数名,变量名与类名。


14、使用using声明导入名称时,如果导入的是函数,则函数名后不必使用括号,比如using hh::g();将是错误的,正确的方法为using hh::g。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值