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、移动构造函数可以通过改造拷贝构造函数和赋值构造函数,将入参改为右值引用即可
长风破浪会有时,直挂云帆济沧海!
可通过下方链接找到博主
https://www.cnblogs.com/judes/p/10875138.html