C++构造函数

 

代码: 

#include <iostream>
#include <stdio.h>
#include <QDebug>

using namespace std;
class A {
public:
    A()
    {
        qDebug() << "默认无参构造函数";
    }
#if 0
    explicit A(int a)
    {
        qDebug() << "显示构造函数";
        //只要参数只有1个的构造函数【包括拷贝构造函数】,就可以在前面加explicit,代表不能直接将参数赋值【等号】给A对象
    }
#endif
    A(int a)
    {
        qDebug() << "类型转换构造函数";//参数只有1个且类型与类不同,默认是可隐式赋值【等号】,即implicit【不是C++关键字】
        this->a = a;
    }
    A(double b, int a = 0)
    {
        qDebug() << "类型转换构造函数";//a有默认值,所以也算参数只有1个且类型与类不同
        this->a = a;
        this->b = b;
    }
    A(const A& a)
    {
        qDebug() << "拷贝构造函数";
        this->a = a.a;
    }
    A &operator = (const A &a)
    {
        qDebug() << "运算符重载构造函数/赋值构造函数";
        this->a = a.a;
        return *this;
    }
    A(A&& a)
    {
        qDebug() << "移动构造函数";
        this->a = a.a;
        this->b = a.b;
    }
private:
    int a;
    double b;
};
int main()
{
    A a;                    //默认无参构造函数
    A b(a);                 //拷贝构造函数
    A c = 1;                //类型转换构造函数
    A d = a;                //拷贝构造函数[编译器优化]
    A e;e = a;              //默认无参构造函数+运算符重载构造函数/赋值构造函数
    A f = std::move(a);     //移动构造函数
    getchar();
    return 0;
}

 

 

 

 

 

ps:

1、构造顺序和析构顺序顺口溜

父子子父

2、构造函数只是对象被“生成”后附加的操作,即对象首先被生成,然后会自动调用其构造函数

3、调用拷贝构造函数的场景:

  • 对象作为函数的参数,以值传递的方式传给函数。 
  • 对象作为函数的返回值,以值的方式从函数返回
  • 使用一个对象给另一个对象初始化

4、区分拷贝构造函数和赋值构造函数的场景

如果即将产生对象实例,那调用的就是拷贝构造函数[A b(a);];

如果对已有的对象赋值,调用的是赋值运算符[b = a;]

5、移动构造函数可以通过改造拷贝构造函数和赋值构造函数,将入参改为右值引用即可

posted @ 2019-09-19 09:48  朱小勇  阅读(3941)  评论(0编辑  收藏  举报