研究vector容器使用方法时,初始化与构造需要区分
初始化不是赋值,初始化的含义是创建变量时赋予其初始值,赋值,则是将对象当前值擦除,用新值替代
拷贝初始化与直接初始化是一对概念,特征为使用等号是拷贝初始化(copy initialization),把等号右侧的值赋值到新建对象中去,(右侧是值,一般在花括号内,若为对象,会先调用)不使用等号,是直接初始化(direct initialization)
初始化时,三原则
1.拷贝初始化只能提供一个初始值,其真正含义为,初始值只有一个时,直接初始化或者拷贝初始化均可
string s5 = "richard";
string s6 ("richard");
为多个值时,只能使用直接初始化
string s7(10,’c’);
而
string s8 = stirng(10,’c’);
的写法看似是拷贝初始化,但是是显示地创建了一个(临时)对象用于拷贝
本质为
string temp(10,’c’);
string s8 = temp;
2.提供类内初始值,即,提供的参数为构造对象的类内的初始值,只能使用拷贝初始化(=)或者参数列表{}形式初始化
规则为:创建对象时,类内初始值用于初始化数据成员,没有初始值的成员将被默认初始化,(内置类型(编程语言自定义类型:C++ int double e.g.)未被显示初始化,默认初始化的规则为,由定义的位置决定,定义于任何函数体之外的变量被初始化为0,函数体内,内置类型变量不被初始化,未被初始化的内置类型变量是未定义的,试图拷贝或其他形式访问将引发错误)
p40
3.如果提供的是初始元素值的列表,只能把初始值放在花括号里进行初始化,而不是放在圆括号里面
即vector v1{“a”,”an”};
作为 C++11新标准的一部分,花括号初始化变量得到全面应用,,该种方式称之为列表初始化. C++11 p39
vactor容器的值初始化(元素数量,具体值),可以只提供元素数量,vector元素对象类型不支持默认初始化,就必须提供相应的值,内置类型int为0,string为空
vector列表初始化{a, b,c}一一对应
想要使用列表初始化vector对象,花括号元素值必须与元素类型相同
vector<int>(10); //10个0
vector<int>{10}; //1个10
vector<int>(10,1); //10个1
vector<int>{10,1}; //两个元素10,1
p89
结论:
圆括号就是构造,(个数,具体值)
花括号就是列表初始化
reference: C++primer