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测试。
原创不易,点赞鼓励一下吧!
本文为博主原创文章,未经博主允许请勿转载!作者:ISmileLi