admin 管理员组

文章数量: 1087652

直接初始化与拷贝初始化

C++语言有几种不同的初始化方式。如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化(copy initialization),编译器将等号右边的初始值拷贝到新创建的对象中去。与之相反,如果不使用等号,则执行的是直接初始化(direct initialization)。

string s1 = "hiya";    // 拷贝初始化
string s2("hello");    // 直接初始化
string s3(10, 'c');    // 直接初始化

当使用直接初始化时,我们实际上是要求编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数(其实也包括拷贝构造函数)。当我们使用拷贝初始化时,我们要求编译器将右侧运算对象拷贝到正在创建的对象中,如果需要的话还要进行类型转换。

拷贝初始化通常使用拷贝构造函数来完成。拷贝构造函数不仅在我们用等号=定义变量时调用,在下列情况下也会调用:

(1) 根据另一个同类型的对象显式或隐式初始化一个对象;

(2) 将一个对象作为实参传递给一个非引用类型的形参;

(3) 从一个返回类型为非引用类型的函数返回一个对象;

(4) 用花括号列表初始化一个数组中的元素或一个聚合类中的成员;

(5) 标准库容器初始化,或者调用insert或push成员时,容器会对其元素进行拷贝初始化。

本文标签: 直接初始化与拷贝初始化