新的类型和初始化方式

新类型和初始化方式

新类型

  1. C++11新增了long longunsigned long long的整型,占8个字节
  2. C++11新增了char16_tchar32_t以支持16位和32位的字符表示

统一的初始化

  1. C++扩大了用大括号阔气的列表(初始化列表)的适用范围,所有内置类型和用户自定义类型均可使用。
  2. 使用初始化列表时,可以添加等号(=),也可以不添加
int x {3};
Stump s1(5, 5.4, 4);  //以前的方式
Stump s2 = {5, 4.2, 2}; //C++11
Stump s3 {5, 5.2, 2}; //C++11
  1. 初始化列表方式进行初始化可防止缩窄,即无法将数值赋给无法存储它的数值变量
char c1 = 1.5e27;  //编译器不报错
char c2 {1.5e27};  //运行后编译器报错
  1. 使用初始化列表允许转换为更宽的类型,另外只要值在较窄的类型的取值范围内,将其转为较窄的类型也是允许的
char c1 {66}; // int-to-char 在char的范围内,允许
double c2{55}; // int-to-double 允许

initializer_list

  1. C++11新增了模板类initializer_list,旨在让您能够将一系列值传递给构造函数或其他函数
vector<double> nums {42.2, 34.9, 30.2, 44.4};   //使用初始化列表对STL容器进行初始化
//vector<double>包含一个将initializer_list<double>作为参数的构造函数
vector<double> payments({42.2, 34.9, 30.2, 44.4});  //上面是语句与该语句等价
//整个{42.2, 34.9, 30.2, 44.4}是个整体传递给initializer_list<double>参数
  1. 之所以可以使用初始化列表对STL容器进行初始化,是因为容器类中包含了将initializer作为参数的构造函数
  2. 如果类中有接受initialzer_list作为参数的构造函数,则初始化列表语法就只能用于该构造函数
vecotor<int> nums{20};  
//等价于:
vector<int> nums({20});  //vector<int>中只有1个元素,被设置为10
//而不是
vector<int> nums(20);  //这个表示vector<int>中有20个元素
  1. STL容器可以使用初始化列表进行初始化时因为有initializer_list参数的构造函数,但是不代表其他类或内置类型可以使用初始化列表也是由于具有initialzer_list参数的构造函数
  2. 所有initializer_list元素的类型必须相同,但编译器将进行必要的转换,并且不能进行隐式窄化转换
vector<double>  nums {42.2, 34.9, 30, 44}; //正确的,等价于{42.2, 34.9, 30.0, 44.0}
vector<double> nums = {10, 8, 5.6};  //错误,不允许
  1. 除非要类用于处于长度不同的列表,否则让它提供接受initializer_list作为参数的构造函数没有意义
  2. initializer_list的使用:
#include <initializer_list>

double sum(std::initializer_list<double> il)
{
	double tot = 0;
	for(auto p = il.begin(); p != il.end(); p++)
		tot += *p;
	return tot;
}
//调用
std::initializer_list<double> dl = {1.2, 3.4, 43.3, 43.2};
std::cout<<sum(dl)<<endl;
  1. initializer_list的迭代器类型为const,因此*dl.begin() = 4343.3;是错误的
  2. 可以将一个initializer_list变量赋值给另一个initializer_list变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_46427273

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值