C++中的初始化
初始化不是赋值,初始化的含义是:创建变量时赋予其一个初值,而赋值的含义是把
对象的达当前值擦除,并以一个新的值来代替。
1.默认初始化
如果定义变量时没有指定初始值,则变量被默认初始化,此时变量被赋予一个默认值,
默认值到底是什么有变量的类型决定,同时定义变量的位置也会对默认初始化有影响。
如果是内置类型的变量未被显示初始化,它的值有定义位置决定。定义于任何函数之
外的变量被初始化为0。定义在函数体内部的内置变量将不被初始化,若果试图拷贝或
以其他方式访问此类型的变量将引发错误。
int a, b; //全局变量a和b,有默认值0
int main()
{
int a; //局部变量a,没有默认值
a = a+1; //错误,没有初始化a就使用了a的值
}
2.拷贝初始化与直接初始化
拷贝初始化又叫复制初始化。如果使用等号(=)初始化一个变量,实际执行的是拷贝
初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。与之相反,则执行的是
直接初始化。
string s5 = "hiya"; // 拷贝初始化
string s6("hiya"); // 直接初始化
string s7(10, 'c'); // 直接初始化,s7的内容是 cccccccccc
拷贝初始化通常是有拷贝构造函数来完成的。但是,如果一个类有移动构造函数,则拷贝
初始化有时会使用移动构造函数而非拷贝构造函数来完成。拷贝初始化不仅仅在使用显示
的等号(=)时才发生,下列情况也会发生:
1)将一个对象作为实参传递给一个非引用类型的形参
2)从一个返回类型为非引用类型的函数返回一个对象
3)用花括号列表初始化一个数组中的元素或一个聚合类中的成员