c++11大括号初始化
为什么会有这个初始化呢 ,看完你就能理解了,
基本类型变量
《c++ primer plus 上说》c++11的{}初始化不允许窄缩
const int code=66;
int x=66;
char c1{31325};
char c2={66};
char c3{code};
char c4={x};
x=33125;
char c5=x;
可是在dev c++5.11编译通过但是有警告,现在姑且认为是编译器还没支持标准把
数组
int g_iaTest4[10] {};//c++11 的列表初始化,什么都没有初始化,里面的数字位置
int g_iaTest5[10] {1.2}/*《c++ primer plsu》第五版上说列表初始化不能窄缩,但是我在visual studio 2015和dev c++ 5.14上实验了一下这个式子都是可以的,可能是标准没被实现把*/
int g_iaTest6[] ={1.2}//还有一代你就是可以不写数组元素数目 ,让编译器来决定由多少个。这种方式多用于字符串
字符串
char a []={"a"};
char b [] {"b"};
string c ={"c"};
string d {"d"};
结构
和数组一样
#include <iostream>
#include <cstring>
using namespace std;
struct inflatable
{
std::string name;
float volum;
double price;
};
int main( )
{
inflatable duck={"duck" ,0.12f,9.98}
struct mayor {};//默认全为“0”
return 0;
}
还是那句话不能窄缩.
对象
A a={1};//带等号的
A a{1};//不带等号
A a{};//初始化
A a=new A{};//new
除了上面普通形式 还有一种特殊的格式;
A a=1
A a=1;
当构造函数只有一个参数的时候可以使用一个值初始化对象(后面会将一种取消这种隐式转换的方法)
Tips:
在C++11中还定义了一个名为std::initialize_list的类,他剋以用做函数参数,这个类可以表示任意长的的列表只要列表项类型相同或则可以转换为相同类型
说完所有的类型之后你就会理解,c++11的{}初始化是为了照顾新手,因为所有的类型初始化你都可以用{}来完成。而且以可以写=号或者不写。但是《c++ primer plus》收c++11 的{}标准不允许窄缩,但是如你所见我的开发环境还是不支持。
auto
c++11 重新定义了auto的含义,自动声明,编译器会把变量类型自动声明为与初始化的数值类型一样,如
auto a=1;//int
auto a=1.0;//double
auto a=1.32E10L//long double
其实上面的案例过于简单,auto 常用语复杂类型的判断,如stl库
std::vector<double> score;
auto pv=score.begin();