C++名字空间/C++命名空间
作者:网络转载 发布时间:[ 2014/10/16 14:51:48 ] 推荐标签:C++ 软件开发 NET
7、using声明 和 using指示
使用using声明 和 using指示 的好处是可以使用使用名字空间中成员时,不必加上名字空间的作用域。
using std::cout; //using声明
using namespace std; //using指示
7.1、using声明(using declaration)
一个 using 声明一次只引入一个命名空间成员。
using 声明的作用域从 using 声明点开始,直到包含 using 声明的作用域的末尾,名字都是可见的。外部作用域中定义的同名实体被屏蔽。
using 声明可以出现在全局、局部、类的作用域 和 名字空间中。在类作用域中using声明只能引用基类成员。
//using declaration in Global Scope
#include <iostream>
using std::cout; //using声明
using std::endl; //using声明
int main(void)
{
cout<<"Hello World"<<endl;
return 0;
}
//using declaration in Local Scope
#include <iostream>
void func(void)
{
using std::cout;
using std::endl;
cout << "Using Declarations In Function"<<endl;
}
int main()
{
func();
// cout << "Hello" <<endl; //error: ‘cout’ and ‘endl’ were not declared in this scope
return 0;
}
//using declaration in Class Scope
#include <stdio.h>
class B
{
public:
void f(void) {printf("In B::f() ");}
void g(void) {printf("In B::g() ");}
};
class C
{
public:
void g() {printf("In C::g() ");};
};
class D : public B
{
public:
using B::f; // OK: B is a base of D2
using B::g; // OK: B is a base of D2
// using C::g; // error: C isn't a base of D2
};
int main(void)
{
D MyD;
MyD.f();
MyD.g();
}
//using declaration in Namespce
#include <iostream>
namespace MyNames
{
using std::string;
using std::cout;
using std::endl;
string str;
void func(void){cout << "Hello"<<endl;}
}
int main(void)
{
MyNames::func();
return 0;
}
7.2、using指示(using directive)
using 指示使得整个名字空间中的成员都可见。
using 指示可以出现在全局、局部的作用域 和 名字空间中,不会出现在类的作用域中。
//using directive in Global Scope
#include <iostream>
using namespace std; //using指示
int main(void)
{
cout<<"Hello World"<<endl;
return 0;
}
//using directive in Local Scope
#include <iostream>
void func(void)
{
using namespace std;
cout << "Using Declarations In Function"<<endl;
}
int main()
{
func();
// cout << "Hello" <<endl; //error: ‘cout’ and ‘endl’ were not declared in this scope
return 0;
}
//using declaration in Namespce
#include <iostream>
namespace MyNames
{
using namespace std;
string str;
void func(void){cout << "Hello"<<endl;}
}
int main(void)
{
MyNames::func();
// cout<<"Hello"<<endl; //error: ‘cout’ and ‘endl’ were not declared in this scope
return 0;
}
7.3、避免使用using指示
using 指示注入来自一个命名空间的所有名字,这个方法看似简单,但是如果应用程序使用许多库,并且用 using 指示使得这些库中的名字可见,那么,全局命名空间污染问题重新出现。
相对于依赖于 using 指示,对程序中使用的每个命名空间名字使用using 声明更好,这样做减少注入到命名空间中的名字数目,由 using 声明引起的二义性错误容易发现和修正。
8、综合应用举例
////file : mynames.hpp
#ifndef MYNAMES__HPP_
#define MYNAMES__HPP_
namespace MyNames
{
//Member:Variable
extern int iVal;
//Member:Class
class MyString
{
public:
MyString(const std::string&);
void OutputString(void);
private:
std::string str;
};
//Member:Function
void NormalFunc(void);
//Member:Struct
struct st_Names
{
char ch;
int count;
};
//Member:Union
union un_Names
{
char ch;
int count;
};
//Member:enum
enum en_Names
{
ZERO,
ONE,
TWO
};
}
#endif /* MYNAMES__HPP_ */
//------------------------------------------------------------------------------------------------------------
//file : mynames.cpp
#include <iostream>
#include "mynames.hpp"
namespace MyNames
{
int iVal = 100;
MyString::MyString(const std::string& refstr)
{
str = refstr;
}
void MyString::OutputString(void)
{
std::cout << str << std::endl;
}
void NormalFunc(void)
{
std::cout << "NormalFunc" << std::endl;
}
}
//-------------------------------------------------------------------------------------------------------------
//file : example.cpp
#include <iostream>
#include "mynames.hpp"
namespace Name = MyNames;
using namespace Name;
int main(void)
{
std::cout<<iVal<<std::endl;
std::cout<<Name::iVal<<std::endl;
std::cout<<MyNames::iVal<<std::endl;
MyNames::MyString mystr("Hello");
mystr.OutputString();
MyNames::NormalFunc();
MyNames::st_Names myst;
myst.count = 0;
MyNames::en_Names myen;
myen = MyNames::ZERO;
MyNames::un_Names myun;
myun.count = 1;
return 0;
}
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。

sales@spasvo.com