什么是初始化
当对象在创建时获得了一个特定的值,我们就说这个对象被初始化了。
注意
:在C++语言中,初始化和赋值是两个完全不同的操作。
初始化:创建变量时
赋予其一个初始值。
赋值:把对象的当前值删除,并赋予一个新的值。
而在很多类中,初始化和赋值的区别事关底层效率问题:前者直接初始化数据成员,后者则先初始化再赋值。
初始化方式
默认初始化
在下面情况发生:
- 在块作用域中定义
非静态变量
或者数组
时没有赋初值
{
int var;
int arr[10];
}
- 当一个类本身含有类类型的成员且使用合成的默认构造函数时
class B {
int a = 1;
int b = 2;
};
class A {
B m_b;
};
- 当类类型的成员没有在构造函数初始化列表中显示地初始化时
简单来说,如果在变量初始化时没有指定初始值,则变量进行默认初始化,此时变量被赋予了默认值,默认值到底是什么由
变量类型
和变量的位置
决定的,我们后面会具体讲解
值初始化
值初始化是只使用了初始化器(即使用了圆括号或花括号)但却没有提供初始值的情况。
int main()
{
int *p = new int();//值初始化
vector<int> vec(10);//值初始化
//int a();错误的初始化方式
int a = int();//值初始化
return 0;
}
注意
:当不采用动态分配内存的方式(即不采用new运算符)时,写成int a();是错误的值初始化方式,因为这种方式声明了一个函数而不是进行值初始化。如果一定要进行值初始化,必须结合拷贝初始化使用,即写成int a=int();
- 对于内置类型初始值为0
- 对于类类型则调用其默认构造函数,如果没有默认构造函数,则不能进行值初始化。
class A {
//由于显示声明了构造函数,所以没有默认构造函数
public:
A(int x) {
a = x;<