您的位置:首页 > 其它

拷贝构造函数和移动构造函数解析

2017-12-05 14:33 211 查看
/**
*  by: gongzhihui
*      2017.12.5
*
*  拷贝构造函数调用时机:
*      1. 对象作为函数参数
*      2. 对象作为函数返回值
*      3. 用一个对象初始化另一个对象:
*          T t1;
*          T t2(ti);
*          T t3 = t1;  此处的 = 不是赋值运算符
*
*  拷贝赋值运算符:
*      T t1;
*      T t2;
*      t1 = t2;
*      除了 类名 对象 = 对象 外的 =  应该都是赋值运算符
*
*  移动构造函数:
*      用右值初始化对象。
*      std::move(对象)将对象转为右值
*
*  移动赋值运算符
*      T t1;
*      t1 = std::move(T());
*/

#include <iostream>       // std::cout

class A
{
public:
int a;

//一个参数的构造函数(也叫做转换构造函数)
A(int i):a(i)
{
printf("construct is called! %d \n",i);
}

~A()
{
printf("deconstruct is called! \n");
}

//拷贝构造函数
A(const A &v)
{
this->a = v.a;
printf("copy construct is called %d\n", a);
}

//拷贝赋值运算符
A& operator = (const A &v)
{
printf("= is called \n");
if(this == &v)
return *this;
a = v.a;
return *this;
}

//移动构造函数
A(A &&v)
{
this->a = v.a;
printf("move construct is called %d\n", a);
}

//移动赋值运算符
A& operator = (A &&v)
{
printf("move = is called \n");
if(this == &v)
return *this;
a = v.a;
return *this;
}
};

int main ()
{
A a(1);    //调用构造函数
A b(a);    //调用拷贝构造函数
A c = a;   //调用拷贝构造函数

A d(2);
d = a;     //调用拷贝赋值运算符

A e = std::move(A(3)); //调用移动构造函数
A f(4);
f = std::move(A(5));   //调用移动赋值运算符
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: