C++初始化方式及区别---直接初始化、拷贝初始化、赋值

C++初始化方式及区别---直接初始化、拷贝初始化、赋值,第1张

一 默认初始化

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"),只是这里使用了等号,所以为拷贝初始化

拷贝初始化通常使用拷贝构造函数来完成。



以下情况会发生拷贝初始化:

  1. 使用“=”来初始化变量
  2. 将一个对象作为实参传递给一个非引用类型的形参
  3. 从一个返回类型为非引用类型的函数返回一个对象
  4. 用花括号列表初始化一个数组中的元素或一个聚合类中的成员。


拷贝初始化和直接初始化区别:

 直接初始化直接调用与实参匹配的构造函数,形式如“T t(u)”。



 拷贝初始化:复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象”,形式如“T t=u”

直接初始化不一定要调用复制构造函数
复制初始化一定要调用复制构造函数

拷贝初始化和赋值的区别:

初始化:创建变量时,赋予其一个初始值。



赋值:把对象当前值擦除,以一个新值代替。


int i = 0;//创建了变量i,且使用了“=”,为初始化(此处为拷贝初始化)
i = 6;//i已经存在了,所以为赋值
int a = i;//用已经创建出来的i,且用“=”初始化一个新对象a ,为拷贝初始化
int b(i);//用已经创建出来的i,初始化b,但没有使用“=”,为直接初始化

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/569348.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存