欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++11的部分总结(二)

程序员文章站 2022-03-21 17:26:13
...

在本文中,主要总结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

相关标签: C 11