程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中的命名空間namespace

C++中的命名空間namespace

編輯:關於C++

在一個企業級的開發中,一個工程往往會很大,定義的類和方法也會特別多,而且還會引入很多的第三方庫,這就不可避免的會有一些同名的沖突問題。在Java中有包(Package)的概念,也就是將不同功能的類分成不同的包,來解決名稱的沖突,C++中是用命名空間來解決這種沖突的。

什麼是命名沖突

假設你的程序中有一個第三方庫ThirdLib.lib,裡面有一個全局的函數 void HelloWorld();你又在自己的工程中再次定義一個HelloWorld(),則會有命名沖突。

再比如,一個大的工程有多個人同時開發,每個人開發一個模塊,其中有A模塊和B模塊分別有甲、乙兩個人開發。假設A模塊有一個struct結構Node,B模塊也有一個struct結構Node,由於是兩個人開發,A中的Node和B中的Node雖然名字相同但結構卻不同。如果A、B兩個模塊都沒有命名空間就會發生沖突,因為同一個作用域內不能有兩個同命的類。

像這樣導致命名沖突的情況還有很多,總結來說就是在相同的作用域內出現多個同名的類、函數或變量。

定義命名空間

【例1】

Hello.h

#pragma once

namespace SH
{
	class Hello
	{
	public:
		Hello(void);
		~Hello(void);

	public:
		void SayHello();

	};

	void HelloWord();
}

Hello.cpp

#include "StdAfx.h"
#include "Hello.h"
#include 

using std::cout;
using std::endl;

namespace SH
{
	Hello::Hello(void)
	{
	}


	Hello::~Hello(void)
	{
	}

	void Hello::SayHello()
	{
		cout << "how are you!" << endl;
	}

	void HelloWord()
	{
		cout << "Hello World!" << endl;
	}

}


Hello.cpp還可以定義成這樣:

SH::Hello::Hello(void)
{
}


SH::Hello::~Hello(void)
{
}

void SH::Hello::SayHello()
{
	cout << "how are you!" << endl;
}

void SH::HelloWord()
{
	cout << "Hello World!" << endl;
}

【例2】命名空間的定義也可以是不連續的,如:

Hello.h

#pragma once

namespace SH
{
	class Hello
	{
	public:
		Hello(void);
		~Hello(void);

	public:
		void SayHello();

	};

}

void HelloWord();

namespace SH
{
	void Hello2Sunly();
}


Hello.cpp

#include "StdAfx.h"
#include "Hello.h"
#include 

using std::cout;
using std::endl;


SH::Hello::Hello(void)
{
}


SH::Hello::~Hello(void)
{
}

void SH::Hello::SayHello()
{
	cout << "how are you!" << endl;
}

void HelloWord()
{
	cout << "Hello World!" << endl;
}

void SH::Hello2Sunly()
{
	cout << "Hello Sunly!" << endl;
}

上面的例子中類Hello和函數Hello2Sunly的命名空間相同,都是SH。HelloWord並沒有在SH命名空間上,是在默認的全局命名空間內。

使用命名空間

加命名空間的前綴和作用域運算附

#include "stdafx.h"
#include 

int main()
{
	std::cout << "Hello World!" << std::endl;
	return 0;
}

這種方式最安全,因為使用的每個變量都用命名空間的前綴指明了具體的版本。但比較麻煩,因為每次使用都要加前綴。


using聲明

#include "stdafx.h"
#include 

using std::cout;
using std::endl;

int main()
{
	cout << "Hello World!" << endl;
	return 0;
}

需要哪個變量時就聲明哪個變量,這種方式相對較安全,也不至於太麻煩,只推薦的一種方式。用using引入的變量,其作用域從using指示開始一直到using指示所在的作用域結束。


using 指示

#include "stdafx.h"
#include 
#include "Hello.h"

using namespace std;
using namespace SH;

int main()
{
	cout << "Hello World!" << endl;
	Hello2Sunly();
	return 0;
}

這種方式將某一命名空間下的所有變量都注入進來了,這種方式使編程更簡單了,不用把需要用到的變量一個一個地用using加進來,但又再次帶來了命名沖突的危險,因為多個命名空間都提到當前的作用域下,又有可能發生重名的問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved