构造函数

Posted zhiminzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造函数相关的知识,希望对你有一定的参考价值。

一、默认构造函数

1、=default  和 =delete

= default   // 只能用于不带参数的构造函数,不能用于带参,或者普通函数
= delete    // 禁止系统给我们生成默认的不带参数的构造函数

2、explicit

一般只带一个默认参数的构造函数前面会加explicit,避免一些数字会隐式的转化成我们的类型

 

二、复制构造函数

1、系统默认的复制构造函数,是从源对象到目标对象逐字节拷贝。

2、复制构造函数被调用的三种情况

// 1、用一个对象去初始化同类的另一个对象时,会引发复制构造函数被调用
Element  p2(p1);   // Element 是自定义类型,
Element  p2  = p1;  
// 如果是下面的情况,是赋值而不是初始化,不会调用复制构造函数
Element  p1 , p1;  
p2  = p1;           //  该句为赋值语句,不是初始化语句
// 2、作为函数的形参,参数传值时,调用了复制构造函数
void Func1(Element ele);   //  调用函数的申明
Element p1;
Func1(p1);              // 对象作为函数参数传值时,会调用复制构造函数
void Func2(Element& ele);   //  调用函数的申明,此时传入的参数是引用类型
Func2(p1);             // 如果传入的参数是引用类型,则不会有拷贝构造函数的调用
// 3、自定义类型作为函数的返回值
Element Func()    // 该函数返回局部变量a时,调用了复制构造函数,返回一个临时的Element变量
{
    Element a;
    return a;
}
Func() ;      // 当调用这个函数时,如果没有接住这个返回值,则复制构造函数形成的临时变量在执行完这句话后,就析构了。

 

3、无参构造函数不一定存在,但是复制构造函数总会存在

 

以上是关于构造函数的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

防止 Proguard 删除片段的空构造函数

无法解析片段中的 ViewModelProvider 构造?

为啥要避免片段中的非默认构造函数?

片段真的需要一个空的构造函数吗?

这个嵌套类构造函数片段可以应用于泛型类吗?