新类型
C++11新增了long long
和unsigned long long
的整型,占8个字节 C++11新增了char16_t
和char32_t
以支持16位和32位的字符表示
统一的初始化
C++扩大了用大括号阔气的列表(初始化列表)的适用范围,所有内置类型和用户自定义类型均可使用。 使用初始化列表时,可以添加等号(=),也可以不添加
int x { 3 } ;
Stump s1 ( 5 , 5.4 , 4 ) ;
Stump s2 = { 5 , 4.2 , 2 } ;
Stump s3 { 5 , 5.2 , 2 } ;
初始化列表方式进行初始化可防止缩窄,即无法将数值赋给无法存储它的数值变量
char c1 = 1.5e27 ;
char c2 { 1.5e27 } ;
使用初始化列表允许转换为更宽的类型,另外只要值在较窄的类型的取值范围内,将其转为较窄的类型也是允许的
char c1 { 66 } ;
double c2{ 55 } ;
initializer_list
C++11新增了模板类initializer_list,旨在让您能够将一系列值传递给构造函数或其他函数
vector< double > nums { 42.2 , 34.9 , 30.2 , 44.4 } ;
vector< double > payments ( { 42.2 , 34.9 , 30.2 , 44.4 } ) ;
之所以可以使用初始化列表对STL容器进行初始化,是因为容器类中包含了将initializer作为参数的构造函数 如果类中有接受initialzer_list作为参数的构造函数,则初始化列表语法就只能用于该构造函数
vecotor< int > nums{ 20 } ;
vector< int > nums ( { 20 } ) ;
vector< int > nums ( 20 ) ;
STL容器可以使用初始化列表进行初始化时因为有initializer_list参数的构造函数,但是不代表其他类或内置类型可以使用初始化列表也是由于具有initialzer_list参数的构造函数 所有initializer_list元素的类型必须相同,但编译器将进行必要的转换,并且不能进行隐式窄化转换
vector< double > nums { 42.2 , 34.9 , 30 , 44 } ;
vector< double > nums = { 10 , 8 , 5.6 } ;
除非要类用于处于长度不同的列表,否则让它提供接受initializer_list作为参数的构造函数没有意义 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;
initializer_list的迭代器类型为const,因此*dl.begin() = 4343.3;
是错误的 可以将一个initializer_list变量赋值给另一个initializer_list变量