分类:
2008-10-13 16:30:22
Ø using 声明
using 声明是以关键字using 开头后面是名字空间成员名, 但是一次只能引入一个名字空间成员.。使用using声明的直接效果是允许程序员访问命名空间中的名字,而不需要加前缀namespace_name::。同时using 声明同其他声明的行为一样:它有一个域,它引入的名字从该声明开始直到其所在的域结束都是可见的。using 声明可以出现在全局域和任意名字空间中,同时它也可以出现在局部域中。
格式:using namespace::name;
Using声明的一个经常用法是使被子类覆盖的父类中的方法在子类中可见,如:
class Base {
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(double);
...
};
class Derived: public Base {
public:
// make all things in Base named mf1 and mf3
// visible (and public) in Derived’s scope
using Base::mf1;
using Base::mf3;
virtual void mf1();
void mf3();
void mf4();
...
};
Ø using指示符
using指示符:是使用整个名字空间,其直接作用是使该名词空间下的所名字可见。
格式:using namespace namespace_name
using指示符语句可以加在程序文件的几乎任何地方,包括文件开头(#include语句之前)、函数内部。不过用using指定的名字空间作用域(生命周期)受using语句所在位置的生命周期约束。如,函数内部使用“using namespace myspacename;”则 myspacename仅在该函数内部可见。
可以用using语句指定多个名字空间,使得多个名字空间同时可见。但这增加了名字污染的可能性,而且只有在使用各名字空间相同成员时由多个using指示符引起的二义性错误才能被检测到,这将给程序的检测、扩展、移植带来很大的隐患。因此,应该尽量使用using声明而不是滥用using指示符。
附:
Ø Using声明与一般声明的区别
它们之间的区别在于,Using声明只引入了一个名称,而一般声明在引入一个名称的同时,还告诉我们这个
名称的signature是什么样子的。所以这里又有必要说明一下如何声明一个命名空间里的对象或者函数:
// a.cpp
namespace example
{
// class declaration in namespace
class A;
// function declaration in namespace
int foo();
}