构造函数的分类及调用

Posted fei102461

tags:

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

构造函数可以使用两种方式进行分类:

    按参数分为:无参构造和有参构造

    按类型分为:普通构造和拷贝构造

class Person
{
public:
    //无参构造(也可称为默认构造)
    Person()
    {
        cout << "Person的无参构造" << endl;
    }
    //有参构造
    Person(int a)
    {
        age = a;
        cout << "Person的有参构造" << endl;
    }
    //拷贝构造函数
    Person(const Person &p)
    {
        //将传入的人的属性全部拷贝到我的属性
        age = p.age;
        cout << "Person的拷贝构造" << endl;
    }
    int age;
};

构造函数的调用有三种方法:

 1:括号法

Person p1;//默认构造函数的调用
Person p2(10);//有参构造函数的调用
Person p3(p2);//拷贝构造函数的调用

 注意事项:调用默认构造函数是不要加(),加上小括号后编译器会这是认为一个函数的声明。

2:显示法

Person p1;//默认构造函数的调用
Person p2=Person(10);//有参构造函数的调用
Person p3=Person(p2);//拷贝构造函数的调用

Person(10);为匿名对象,特点:当前执行结束后,系统会立刻回收匿名对象。

注意事项:不要用拷贝构造函数初始化匿名对象 

3:隐式转换法

Person p2=10;//相当于 写了 Person p2=Person(10)  有参构造函数的调用
Person p3=p2;//拷贝构造函数的调用

 

拷贝构造函数的调用时机:

1.使用一个已经创建完的对象来初始化一个新对象

Person p1(10);
Person p2(p1);

2.值传递的方式给函数参数传值

3.以值方式返回局部对象

 

 

深拷贝和浅拷贝的问题:

浅拷贝:常见的赋值拷贝操作

  如果用编译器提供的拷贝构造函数,会做浅拷贝操作。浅拷贝带来的问题是堆区的内存重复释放。

深拷贝:在堆区间重新申请空间,进行拷贝操作

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

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

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

Android 逆向ART 脱壳 ( InMemoryDexClassLoader 脱壳 | BaseDexClassLoader 构造函数 | DexPathList 构造函数及后续调用 )(代码片

如何从片段 KOTLIN 中调用意图 [重复]

调用 Fragment 构造函数导致异常,kotlin?

在 Visual Studio 中创建构造函数的代码片段或快捷方式