一 、c++ 几种初始化方式:
什么是初始化?
在创建变量时,给变量一个初始的值。
什么是赋值?
把变量当前的值擦除,赋予一个新的值。
1. 默认初始化
在定义变量时,没有指定这个变量的初始值,此时变量被默认初始化。变量被默认初始化的值是什么呢?
这取决与变量定义的位置和变量的类型。
(a) 对于在任何函数之外(包括main函数)的内置类型变量(整数、浮点数、单个字符和布尔值),默认初始化值0。
(b)对于在函数体之内的内置类型变量,不会进行默认初始化。未初始化的值有一个未知的值,这是因为为变量分配的存储空间里面之前存储的值并没有被清空。若直接引用或运算将引发不可预知的错误。而此错误编译器可能无法检测,而导致程序以错误的方式运行。如下:
int main() { int result; for (int i = 0; i <= 10; i++ ) result += i ; cout << "result = " << result << endl; return 0; }
运行结果:
result = 4201074
所以最好的方式就是对于函数体内的内置类型一定要显示初始化。
(b) 对于类类型,类自己决定是否提供默认初始化,若提供默认初始化,类自己决定默认值。
2、拷贝初始化
直接使用等号或圆括号初始化。
int i = 0
int result(0);
3、列表初始化
在c++11的标准中可采用列表初始化。
int m = {0}; int h{0};
二、vector类型的初始化问题
1、vector是标准库中的一种标准库模板。vector的初始化方式有下面几种:
int n = 10, val = 7; /*一个空的vector,元素类型是int*/ vector <int> v1; /*用v2、v3中包含v2中所有元素的值*/ vector <int> v2 = v1; vector <int> v3(v1); /*包含n个元素,每个元素的值为val*/ vector <int> v4(n, val); /*n个元素的值都是初始化的值*/ vector <int> v5(n); /*每个元素被赋予相应的初始值,表达等价*/ vector <int> v6 = {1,2,3,4}; vector <int> v7{1,2,3,4};
如果没有提供初始化的值,会根据vector的类型来进行默认初始化。int类型默认为0,string类型为空。
2、关于使用圆括号与花括号的区别:
v1有10个元素,每个为0。
vector <int> v1(10);v1只有一个元素,为10。
vector <int> v1{10};v1有10个元素,每个为1。
vector <int> v1(10,1);v1有两个元素,一个是10,一个是1。
vector <int> v1{10,1};
如果是圆括号,只有一个整数参数,则是指明vector的容量。有两个参数,第一个为整数,第二个为vector元素的类型,则指明存储了多少个重复的元素。
如果是花括号,则用花括号中的元素来初始vector元素。但是当花括号中的值不能用于初始化vetctor中的元素时,花括号的作用与圆括号一致。如下:
10不能初始化string类型的元素,所以此时表示的是v1中有10个元素,每个元素为空的string
vector <string> v1{10};同样,下面表示的是v2中有10个“hi”元素。
vector <string> v2{10,"hi"};