3)在某些容器初始化的过程中如:

vect<string> svec(5);

  这里的过程是,先使用string默认构造出一个实例对象,然后使用这个对象,复制初始化其它的元素。这个过程是容器的实现细节,其实从外面看,可以理解为直接初始化。

  4)数组初始化,有时候使用这样的语法:

Sales_item primer_eds[]={  string("1231231"),
string("3123123")
}

  可知这个过程,是一个先调用直接初始化生成string,然后继续隐式调用直接初始化生成Sales_item。后使用复制初始化,给那个数组的各个元素初始化。

  从上面两个关于容器(包括数组)的初始化过程可以看出,他们与普通的类(也是包含许多的元素对象)的不同了 !

  (3)组装复制构造函数

  对,我们现在学习了,默认构造函数(没有参数的,可能是系统定义,可能是用户定义,系统只有在没有任何构造函数的情况下定义默认构造函数),而系统定义的默认构造函数叫做组装默认构造函数,还有一种特殊的构造函数——类型转换构造函数(其实并不特殊);现在学习了组装复制构造函数(只要用户没有主动构造一个复制构造函数(使用类型引用做参数),系统会自行组装);算只定义了复制构造函数,系统也不会自动组装默认构造函数,所以,如果你定义了复制构造函数,那么一定要定义普通构造函数(好有默认构造函数)。要不然,没有构造函数了。

  想到这里,我们发现不管什么什么类型的构造函数,功能都是实例并初始化对象,可能复制构造函数与普通构造函数的过程有些不同(其实是使用的方法和领域不同),但是他们仍然是平等的。所以只有一个默认构造函数,并且只有当没有任何自定一构造函数的时候,系统才会有组装构造函数;而复制构造函数,是一定有的(不管在什么情况)。

  其实复制构造函数的本质依然是构造函数,它的功能是使用那个已知的对象中的元素,“逐个”的赋值给那个需要初始化的对象。所以,你可以把组装复制构造函数,想象成一个带有所有对象元素(顺序也一至)的初始化列表的构造函数。

  与普通构造函数一样,涉及到对某个元素的初始化时,对于内建类型,直接使用copy的方法,对于类类型,使用定义复制构建函数。如果没有定义复制构建函数,使用组装的,毕竟复制构建函数的参数是一定的,所以基本不存在无法复制的元素的可能。但是直接构造函数有可能出现,子元素没有默认构造函数的情况,而不能进行构造,并且直接构造的时内建类型也有可能不初始化(依编译器而定)。

  另外一个要注意的是,虽然我们没有办法进行复制初始化数组(这是为什么数组没有办法作为参数传递,或则作为返回值返回,或者定义的时候用一个数组来复制初始化另外一个数组),但是当数组在某个其他类型的里面的是后,这个时候如果发生了复制初始化,作为元素的数组会也被复制初始化,但是,是通过逐个复制元素的方法。

  (4)自定义复制构造函数

class Foo{
public:
Foo();   //默认构造函数
Foo(const Foo&);   //复制构造函数
}