C++ 命名空間,作用域運算符和using關鍵字
個人了解,極其主觀,僅供參考!
C++ 作用域運算符
C++的作用域運算符主要起到差別作用,避免産生二義性,在不同的子產品可能有相同的辨別符名稱,需要用::加以區分。
主要用于:
- 命名空間
- 全局變量
- 類(static情況,繼承情況)
見文章:C++作用域運算符::的用法 (360doc.com)
C++ 命名空間
使用命名空間實際上也是避免不同的空間内的辨別符相同導緻二義性,可以通過使用作用域運算符确定此辨別符處于什麼空間,也可以使用using namesapce s_name 聲明以下的語句都處于s_name的作用域中。
作用域可以嵌套,可以在一個作用域裡定義另一個作用域。
注意namespace内的變量是靜态生命周期。
namespace Hs
{
int i = 10;
int j = 25;
namespace HD
{
int k = 13;
}
}
void testNS()
{
using namespace Hs;
cout << &HD::k << endl;
}
輸出:
00A81050
定義了命名空間,實際上就配置設定記憶體了。
注意隻能在全局作用域定義命名空間。
C++ using
using 是C++的一個關鍵字,主要用在以下地方:
命名空間
可以通過 using namesapce s_name 表明作用域内的代碼中的辨別符在s_name命名空間。
那麼作用域怎麼定呢?
namespace HU
{
int i = 5;
int j = 15;
}
namespace Hs
{
int i = 10;
int j = 25;
}
void testNS()
{
using namespace HU;
cout << i << endl;
using namespace Hs;
//cout << i << endl; // 這裡提示錯誤,i不明确,因為這個作用域的位置包含了兩個命名空間内的i辨別符
cout << Hs::i << endl;
}
int main()
{
//cout << i << endl;//這裡也報錯,因為目前的命名空間(也就是std)并不存在i辨別符
testNS();
return 0;
}
輸出:
5
10
是以,using namesapce s_name的作用域和普通的全局變量和局部變量相同。若聲明在全局,則作用域在全局,若聲明在局部,則作用域在局部。注意不能在類中使用using namesapce s_name。
子類私有繼承父類的公有函數
用的比較少,主要是圖個友善,其實也可以通過封裝一個函數接口來調用
class C_a
{
public:
void f1()
{
cout << "A : f1" << endl;
}
private:
void f2()
{
cout << "A : f2" << endl;
}
};
class C_b : private C_a
{
public:
using C_a::f1;//這裡就是将私有的函數顯式了,但基類也必須是public的才行
void f4()
{
this->f3();
}
private:
void f3()
{
cout << "B : f3" << endl;
}
};
void testUCls()
{
C_b cb;
cb.f1();
cb.f4();
}
起别名
見文章C++11使用using定義别名(替代typedef) (biancheng.net)
為函數定義别名:
typedef void (*func_t)(int, int);
using func_t = void (*)(int, int);
為某個類型定義别名:
typedef unsigned int u_t;
using u_t = unsigned int;
為了彌補typedef的缺陷,可以用于為一個模闆類起别名:
template<typename T>
using unMp = unordered_map<int,T>;
unMp<int> mp;
template<typename T1,typename T2>
using unXMp = unordered_map<T1, T2>;
unXMp<int, string> mxmp;
同樣,用于為模闆函數起别名:
template<typename T>
using fun_t = void (*)(T, T);
template<typename T>
void Ffc(T a, T b)
{
cout << a + b << endl;
}
void Ffd(string a, string b)
{
cout << a + b << endl;
}
void testUsi()
{
fun_t<int> fs1 = Ffc<int>;
(*fs1)(10, 20);
fun_t<string> fs2 = Ffd;
(*fs2)("hello ", "world");
}