构造函数的分类及调用

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

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

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

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.以值方式返回局部对象

深拷贝和浅拷贝的问题:

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

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

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

猜你喜欢

转载自www.cnblogs.com/fei102461/p/12442202.html
今日推荐