C++11的部分总结(二)
在本文中,主要总结C++11中对类做出的改变
9.C++11类列表初始化新方式
C++11为类提供了新的类列表初始化方法。
class Session
{
private:
int mem1 = 10;
double mem2{ 1966.54 };
short mem3;
public:
Session(){}
Session(short s) :mem3(s){}
Session(int n, double d, short s) :mem1(n), mem2(d), mem3(s){}
int getmem3()
{
return mem3;
}
};
int main()
{
short a = 11;
Session s{a};
cout << s.getmem3() << endl; //输出结果:11
return 0;
}
10.C++11类内初始化新方式
C++11允许在类定义中初始化成员。
class Session
{
private:
int mem1 = 10;
double mem2{ 1966.54 };
short mem3;
public:
Session(){}
Session(short s) :mem3(s){}
Session(int n, double d, short s) :mem1(n), mem2(d), mem3(s){}
int getmem1()
{
return mem1;
}
};
int main()
{
Session s;
cout << s.getmem1() << endl; //输出结果:10
return 0;
}
11.C++11允许使用模板时提供一系列别名
C++使用typedef关键字创建别名。C++11提供了另一种创建别名的语法,该语法也可用于模板部分具体化,但typedef不能。
#include <iostream>
#include <array>
using namespace std;
template <typename T> using arr12 = array<T, 4>;
int main()
{
//template <typename T> using arr12 = array<T, 4>; 将arr12的声明放在函数内,arr12会报错未定义错误
arr12<double> a1={1.1,2.2,3.3,4.4};
for (double x : a1)
cout << x << " ";
cout << endl; //输出结果:1.1 2.2 3.3 4.4
return 0;
}
12.C++11新增作用域内枚举
传统的枚举中两个枚举定义中的枚举量可能发生冲突。为避免这种问题,C++11提供了一种新枚举,其枚举量的作用域为类。
int main()
{
enum Old1 { yes, no, maybe }; //传统形式
enum class New1{never,sometimes,often,always}; //新形式
enum struct New2{ lever, never, sever }; //新形式
Old1 o = yes;
New1 n1 = New1::never;
New2 n2 = New2::never;
cout << o << "," <<int(n1) << "," << int(n2) << endl; //作用域内枚举不能隐式地转换为整型,所以这里我们需要强制转换,输出结果:0,0,1
return 0;
}
13.C++11对类增加默认移动构造函数和移动赋值运算符
C++11在原有4个特殊成员函数(默认构造函数、复制构造函数、复制赋值运算符和析构函数)的基础上,新增了两个:移动构造函数和移动赋值运算符。
class Session
{
public:
Session(){} //默认构造函数
Session(const Session &); //复制构造函数
Session(Session &&); //移动构造函数
Session & operator=(Session &); //复制赋值运算符
Session & operator=(Session &&); //移动赋值运算符
~Session(); //析构函数
};
14.C++11新增Lambda函数
在C++11中新添加了Lambda函数。
int main()
{
auto count=[](int x){return x % 3 == 0; };
auto count1 = [](double &x)->double{int y = 4; return x=x - y; };
double temp = 7;
count1(temp);
cout << count(6) <<","<< temp << endl; //输出结果:1,3
return 0;
}
仅当lambad表达式完全由一条返回语句组成时,可以省略返回类型后置语法,此时自动类型推断起作用。
[]:不截取任何变量;
[&]:截取外部所有变量,并做引用在函数体重使用;
[=]:截取外部所有变量,并拷贝一份在函数中使用;
[=,&foo]:截取外部所有变量,并拷贝一份在函数中使用,但对foo变量使用引用;
[bar]:截取bar变量拷贝一份在函数体中使用,不截取其它变量;
[this]:截取当前类的this指针。
15.C++11新增可变参模板
可变参数模板使得模板函数和模板类可接受可变数量的参数。
#include <iostream>
#include <string>
using namespace std;
void show_list3(){}
template<typename T,typename... Args>
void show_list3(T value, Args... args)
{
cout << value << ",";
show_list3(args...);
}
int main()
{
int n = 14;
double x = 2.17;
string mr = "Mr.String objects!";
show_list3(n, x); //输出结果:14,2.17,
cout << endl;
show_list3(x*x, '!', 7, mr); //输出结果:4.7089,!,7,Mr.String objects!,
return 0;
}
程序源码下载地址:https://github.com/XiaoYaoNet/C-112