概述
C++ 11中引入了许多简化编程工作的语法上的新特性,我们暂且美其名曰:“语法甜点”。下面,我们将对这些“语法甜点”一一进行介绍。
语法甜点1:序列for循环
序列for循环是一种简化的for循环,可用于遍历一组序列,包括:各种容器、string、数组、初始化列表以及由begin和end函数定义的序列。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vctTemp{1, 2, 3};
for (auto a : vctTemp)
{
cout << a << endl;
}
return 0;
}
语法甜点2:成员变量初始化
与Java、C#中的用法一样,可以对成员变量进行就地初始化。
class CPerson
{
private:
int m_nAge = 10;
string m_strName = "Mike";
};
语法甜点3:统一的初始化语法
在引入C++ 11之前,有各种不同的初始化语法。在C++ 11中,仍可以使用这些初始化语法,但也可以选择使用新引入的统一的初始化语法。统一的初始化语法用一对大括号{}表示,使用{}初始化语法还可有效地避免窄转换。
#include <iostream>
#include <vector>
using namespace std;
class CPerson
{
public:
int m_nAge = 10;
string m_strName = "Mike";
};
int main()
{
int a{5};
char c{'X'};
int p[5] = {1, 2, 3, 4, 5};
vector<int> vctTemp{1, 2, 3};
CPerson person{10, "Mike"};
// b赋值成5,发生了窄转换
int b = 5.3;
// 会提示编译错误,避免了窄转换
int d{5.3};
return 0;
}
语法甜点4:nullptr
nullptr是C++ 11中新加的一个关键字,用于标识空指针。引入nullptr后,可以解决某些函数重载时的二义性问题。
#include <iostream>
using namespace std;
void Test(int a)
{
cout << a << endl;
}
void Test(char *p)
{
cout << p << endl;
}
int main()
{
int *p = nullptr;
int *q = NULL;
// 两个指针值是相等的,bEqual为true
bool bEqual = (p == q);
// 编译失败,nullptr不是转换为int
int a = nullptr;
// 在C++ 98中编译失败,有二义性;在C++ 11中调用F(int)
Test(0);
// 调用F(char *)
Test(nullptr);
return 0;
}
语法甜点5:委托构造函数
在引入C++ 11之前,如果某个类有多个重载的构造函数,且这些构造函数中有一些共同的初始化逻辑,通常都需要再编写一个带参数的初始化函数,然后在这些构造函数中调用这个初始化函数。在C++ 11中,再也不用这么麻烦了。我们可以实现一个最基础的构造函数,其他构造函数都调用这个构造函数。
#include <iostream>
#include <sstream>
using namespace std;
class CPerson
{
public:
CPerson() : CPerson(0, "") { NULL; }
CPerson(int nAge) : CPerson(nAge, "") { NULL; }
CPerson(int nAge, const string &strName)
{
stringstream ss;
ss << strName << "is " << nAge << "years old.";
m_strInfo = ss.str();
}
private:
string m_strInfo;
};
int main()
{
CPerson person(10, "Mike");
return 0;
}