1. 程式人生 > >名稱空間與友元函式

名稱空間與友元函式

定義流IO的友元函式很常見,但隨著專案變大,一般都將將類定義在某名稱空間內,這時,我們在該類中定義的友元函式和名稱空間是什麼關係?如果該友元函式在類的cpp檔案中實現,是放在名稱空間內還是放在名稱空間外?另外,對於該實現的函式,是否還需要給出函式宣告?也就是說,friend能否承擔宣告友元函式的責任?

標頭檔案:

#include <ostream>

namespace ns_test
{

/*
 * type
 */
class CTestFriend
{
public:
	CTestFriend(int i):
		m_int(i)
	{
		// TODO Auto-generated constructor stub

	}
	virtual ~CTestFriend();
	friend std::ostream & operator << (std::ostream & os, const CTestFriend & obj);
private:

	int m_int;
};

} /* namespace ns_test */

 

CPP檔案

#include "CTestFriend.h"

namespace ns_test
{

CTestFriend::~CTestFriend()
{
	// TODO Auto-generated destructor stub
}

std::ostream & operator << (std::ostream & os, const CTestFriend & obj)
{
	os << obj.m_int << "\n";
	return os;
}
} /* namespace ns_test */



上述程式碼,在實際的測試中,友元函式實現必須在名稱空間內,並且friend已經承擔了函式宣告的任務,在客戶程式碼,只需要包含上述標頭檔案即可;

如果將友元函式的實現放在名稱空間外,編譯時會提示,函式實現中無法訪問CTestFriend類的私有成員,也就是說,編譯器認為實現函式並不是該類的友元;

如果將friend宣告改成friend std::ostream & ::operator << (std::ostream & os, const CTestFriend & obj);,編譯器報該宣告前,應該在全域性宣告該函式,所以,此時的friend並沒有承擔友元函式的宣告任務。

以上,在gcc 版本 4.6.3上測試。有興趣的朋友,也可以在其它編譯器上試一試。