一 默认初始化
int *pi = new int; //默认初始化,不对基本内置类型进行初始化所以pi指向一个未初始化的int
string *ps=new string; //默认初始化为空string
默认初始化规则:
1 内置类型,如果未被显示初始化,由值由定义位置决定。
1)定义在任何函数之外的变量被初始化为0
2) 定义在函数内部的内置类型变量不会被初始化
2 类类型,各自决定其初始化对象的方式
函数外部(全局变量),函数内部,都会调用类的构造函数进行初始化
二.直接初始化方式(可以使用传统的花括号(),或c++11引入的{},即使用列表初始化
string s("hello");//直接初始化
//s为字面值hello的副本。
这里没有使用等号,所以为直接初始化
三.拷贝初始化方式
string s = "hello";//拷贝初始化
//等价于s("hello"),只是这里使用了等号,所以为拷贝初始化
拷贝初始化通常使用拷贝构造函数来完成。
以下情况会发生拷贝初始化:
- 使用“=”来初始化变量
- 将一个对象作为实参传递给一个非引用类型的形参
- 从一个返回类型为非引用类型的函数返回一个对象
- 用花括号列表初始化一个数组中的元素或一个聚合类中的成员。
拷贝初始化和直接初始化区别:
直接初始化直接调用与实参匹配的构造函数,形式如“T t(u)”。
拷贝初始化:复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象”,形式如“T t=u”
直接初始化不一定要调用复制构造函数
复制初始化一定要调用复制构造函数
拷贝初始化和赋值的区别:
初始化:创建变量时,赋予其一个初始值。
赋值:把对象当前值擦除,以一个新值代替。
int i = 0;//创建了变量i,且使用了“=”,为初始化(此处为拷贝初始化)
i = 6;//i已经存在了,所以为赋值
int a = i;//用已经创建出来的i,且用“=”初始化一个新对象a ,为拷贝初始化
int b(i);//用已经创建出来的i,初始化b,但没有使用“=”,为直接初始化
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)