【C++】名字空間(解決名字衝突問題二)
阿新 • • 發佈:2018-12-04
目錄
一般自己是不會使用的,但一些大型的庫可能用到,比如名稱空間std.
名字空間定義
解決名字衝突問題的究極解決方法:namespace(名字空間)
語法為:
namespace XXX
{
//把類和函式寫在這個大括號裡面
class YYY
{
};
} //這裡不需要加分號
舉一個簡單的例子:
#include "stdafx.h" #include <stdio.h> namespace XXX { void Test() { printf("hello world!\n"); } } void Test() { printf("I am second!\n"); } int main() { XXX::Test(); Test(); return 0; }
有2個Test()函式,但是不會衝突,因為有了名稱空間。
名字空間使用
如果覺得每次加上字首麻煩,使用using關鍵字解除字首。(但要確定名字不會衝突)
Test.h
#pragma once #include <stdio.h> namespace XXX { void Test() { printf("hello world!\n"); } class Object { public: int x; public: void Print() { printf("Class Object.\n"); } }; }
main.cpp
#include "stdafx.h"
#include <stdio.h>
#include "Test.h"
using namespace XXX;
int main()
{
Test();
Object a;
return 0;
}
如果使用using namespace XXX;那麼就會解除所有的XXX字首。但是有時候不想解除所有的字首,只想解除其中的某一個字首,可以將main.cpp做出如下修改,就單純解除了Object的字首。
#include "stdafx.h" #include <stdio.h> #include "Test.h" using XXX::Object; int main() { XXX::Test(); Object a; return 0; }
頭源分離
一般情況下我們會將Test.h中的函式拿出來實現,這時將Test.h修改為如下2個檔案:Test.h和Test.cpp
Test.h
#pragma once
#include <stdio.h>
namespace XXX
{
void Test();
class Object
{
public:
int x;
public:
void Print();
};
}
Test.cpp
#include "stdafx.h"
#include "Test.h"
////第一種方式
//void XXX::Test()
//{
// printf("hello, world.\n");
//}
//
//void XXX::Object::Print()
//{
// printf("Class Object.\n");
//}
namespace XXX
{
void Test()
{
printf("hello, world.\n");
}
void Object::Print()
{
printf("Class Object.\n");
}
}
main.cpp
#include "stdafx.h"
#include <stdio.h>
#include "Test.h"
using XXX::Object;
int main()
{
XXX::Test();
Object a;
a.Print();
return 0;
}
同一名稱空間在多個檔案中
Test.h
#pragma once
#include <stdio.h>
namespace XXX
{
void Test();
class Object
{
public:
int x;
public:
void Print();
};
}
Test.cpp
#include "stdafx.h"
#include "Test.h"
////第一種方式
//void XXX::Test()
//{
// printf("hello, world.\n");
//}
//
//void XXX::Object::Print()
//{
// printf("Class Object.\n");
//}
namespace XXX
{
void Test()
{
printf("hello, world.\n");
}
void Object::Print()
{
printf("Class Object.\n");
}
}
Test2.h
#pragma once
class Test2
{
public:
Test2();
~Test2();
};
namespace XXX
{
void Test2();
}
Test2.cpp
#include "stdafx.h"
#include "Test2.h"
#include <stdio.h>
Test2::Test2()
{
}
Test2::~Test2()
{
}
void XXX::Test2()
{
printf("This is Test2.\n");
}
main.cpp
#include "stdafx.h"
#include <stdio.h>
#include "Test.h"
#include "Test2.h"
using XXX::Object;
int main()
{
XXX::Test();
Object a;
a.Print();
XXX::Test2();
return 0;
}