C++中各种初始化方式:默认初始化、值初始化、直接初始化、拷贝初始化、列表初始化。
1、默认初始化
默认初始化时定义变量的时候没有指定初值进行的初始化操作。
-
对于内置类型
//全局变量默认初始化为特定的值 int a; // 默认初始化为0 double d; //默认初始化为0.0 int *ptr; //默认初始化为NULL //局部变量则是未定义的 { int a; //未定义的 }
-
类类型的变量
不论定义在什么地方都会被初始化,调用默认的构造函数。
class A { public: A() = default; }; A a; //默认调用 A()
如果类没有默认构造函数,则会引发错误。如果没有定义构造函数,编译器会默认生成一个构造函数。如果有了构造函数,编译器则不会提供,所以一般会显示写出构造函数。
2、值初始化
值初始化时使用了初始化器(使用圆括号或者花括号),但没有提供初始化值的情况。
int *ptr = new int(); //同默认初始化
vector<string> vec(10); // size=10, 没有对元素赋值 调用默认初始化
3、直接初始化和拷贝初始化
直接初始化使用小括号,内部一定要提供初始,否则就是值初始化。
int a(10);
string s("hello");
拷贝初始化使用等号=
:
int a = 12;
string s = string("hello");
string s1 = "hello world"; //编译器会把等号右侧的初始值拷贝到新建的对象中,与上面的相同
对于类类型变量,直接初始化调用类的构造函数(调用参数类型最匹配的那个)。
拷贝初始化调用类的拷贝构造函数。
4、列表初始化
列表初始化时C++11
引入的,采用{}
进行初始化操作。
int a{12};
string s{"hello"};
vector<int> vec{1, 2, 3};