C++11新特性:using和namespace的特殊用處

零、前言

C++11以後增加了許多新的特性,這些新的特性越來越方便C++程序員的編碼,也再次賦予了C++新的活力與朝氣!截止到目前C++20的標準已經出來了,C++這位“老先生”正在緊跟時代的步伐!作爲Cpper也應該緊跟這位“老先生”腳步。

一、using

1、類型別名

C++中通常使用typedef來定義一個類型別名,尤其是在使用一些名字比較長的類型、一些模板或者域的時候,使用別名的優勢顯得更加突出。

C++11以後,定義類型別名不再是typedef的專利,using也可以用來定義類型別名了,並且可讀性更強,using可以像定義一個變量一樣來給一個類型取一個別名。

2、別名模板

using提供了別名模板的功能,別名模板是指代一族類型的名字,當模板特化時等價於以別名模板的模板實參來替換類型標識中的模板形參的結果。

3、代碼示例

// UsingTest.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//

#include <iostream>
#include <vector>

using namespace std;

// UINT和Uint都是unsigned int的別名
typedef unsigned int UINT;
using Uint = unsigned int;

using ULL = unsigned long long;

// using 定義別名模板
template<typename T>
using vec = vector<T>;

int main()
{
	cout << "-----------using定義類型別名------------" << endl;
	Uint uiTmpNum = 10;
	ULL ullTmpMin = LLONG_MIN;
	ULL ullTmpMax = LLONG_MAX;
	cout << "uiTmpNum=" << uiTmpNum << endl;
	cout << "ullTmpMin=" << ullTmpMin << endl;
	cout << "ullTmpMax=" << ullTmpMax << endl;

	cout << "-----------using定義別名模板使用------------" << endl;
	vec<int> v = {0,1,2,3,4,5,6,7,8,9};
	for (int i=0; i<v.size();++i)
	{
		cout << v.at(i) << endl;
	}

    std::cout << "Hello World!\n";
	getchar();
}

運行結果:
在這裏插入圖片描述

二、namespace

1、命名空間

命名空間是爲防止名字衝突提供的一種控制機制,它有namespace和命名空間的名字組成,它像變量、函數、類等一樣,每個命名空間都有自己的作用域。

實際開發中,常常會出現命名空間嵌套的情況,在嵌套的命名空間中定義的只能在內層命名空間中有效,外層命名空間想要訪問它必須在名字前添加限定符。

C++11新標準引入了一種新的嵌套命名空間叫內聯命名空間,內聯命名空間可以直接被外層的命名空間直接使用,內聯命名空間的定義方式是在namespace前面加上inline關鍵字,後續使用該命名空間時就可以省略inline關鍵字。

2、命名別名

namespace同樣可以給命名空間取一個別名,特別是當命名空間的名字比較長的時候,命名一個空間別名,會提高工作的效率。

3、使用示例

// NamespaceTest.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//

#include <iostream>

using namespace std;

namespace TestNamespace
{
	namespace OldNameSpace 
	{
		void myPrintf()
		{
			cout << "this is OldNameSpace!" << endl;
		}
	}
	namespace OldN = OldNameSpace;
	inline namespace NewNameSpace
	{
		void myPrintf()
		{
			cout << "this is NewNameSpace!" << endl;
		}
	}
};

// namespace可以直接命名空間別名
namespace TN = TestNamespace;

int main()
{
	cout << "-------------C++命名空間新特性-------------" << endl;
	// 使用using編譯指令導入整個命名空間
	using namespace TestNamespace;
	cout << "-----直接調用函數會發現調用的是inline聲明的命名空間---" << endl;
	myPrintf(); // 直接調用函數會發現調用的是inline聲明的命名空間
	cout << "-----C++11之前必須加上命名空間限定符纔行--------------" << endl;
	TestNamespace::OldNameSpace::myPrintf(); // C++11之前必須加上命名空間限定符纔行
	cout << "-------------C++命名空間命名別名使用-------------" << endl;
	TN::OldN::myPrintf();
    std::cout << "Hello World!\n";
	getchar();
}

運行結果:
在這裏插入圖片描述

重要提示:測試C++新特性時,需要確認自己所使用的IDE是否支持C++新特性,本文測試用例採用VS2017測試。

原創不易,點贊鼓勵一下吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章