在C++中,初始化和赋值是不同的操作!
首先来看概念:
初始化:创建变量时,赋予其一个初始值。
赋值:把对象当前值擦除,以一个新值代替。
而初始化中有两种形式:直接初始化和拷贝初始化。
如果我们使用“=”即等号来初始化一个变量,执行的是拷贝初始化。
string s = "hello";//拷贝初始化
//等价于s("hello"),只是这里使用了等号,所以为拷贝初始化
反之,不使用等号的话,执行的是直接初始化。
string s("hello");//直接初始化
//s为字面值hello的副本。这里没有使用等号,所以为直接初始化
还有一点,初始化是在创建变量时发生的:
int i = 0;//创建了变量i,且使用了“=”,为初始化(此处为拷贝初始化)
i = 6;//i已经存在了,所以为赋值
int a = i;//用已经创建出来的i,且用“=”初始化一个新对象a ,为拷贝初始化
int b(i);//用已经创建出来的i,初始化b,但没有使用“=”,为直接初始化
只要我们使用了等号来初始化变量,就会发生拷贝初始化。
拷贝初始化通常使用拷贝构造函数来完成。
以下情况会发生拷贝初始化:
- 使用“=”来初始化变量
- 将一个对象作为实参传递给一个非引用类型的形参
- 从一个返回类型为非引用类型的函数返回一个对象
- 用花括号列表初始化一个数组中的元素或一个聚合类中的成员。