构造函数/拷贝构造函数/赋值运算符/移动构造函数/移动赋值运算符几个的区别与相似之处

来源:互联网 发布:淘宝店铺装修招牌尺寸 编辑:程序博客网 时间:2024/06/06 21:27

构造函数:是类中用来声明初始化变量所用,在类定义的时候调用

拷贝构造函数:在用其他已定义对象定义新对象的时候调用拷贝构造函数

拷贝赋值运算符:在对象已经被初始化之后,再用其他已经定义的对象赋值就是调用拷贝赋值运算符。

移动构造函数:与拷贝构造函数类似,但是不同之处在于他实现的是转移,源对象将丢失其内容,其内容将被目的对象所占有,移动操作发生在当移动对象为未命名对象的时候

移动赋值运算符:与赋值运算符类似,但是不同之处在于他实现的是转移,源对象将丢失其内容,其内容将被目的对象所占有,移动操作发生在当移动对象为已命名对象的时候

五个函数对比如下:

 

函数名称

源对象属性

目的对象属性

构造函数

新对象

拷贝构造函数

已被初始化的对象

未被初始化的对象

拷贝赋值运算符

已被初始化的对象

已被初始化的对象

移动构造函数

临时对象(完成移动后将被注销)

未被初始化的对象

移动赋值运算符

临时对象(完成移动后将被注销)

已被初始化的对象

例:

// motioncontribute.cpp : Defines the entry pointfor the console application.// #include "stdafx.h"#include <iostream>#include <stdio.h>#include <string>  using namespace std; class Pointer{public:    Pointer(const int i, const string &n)    {        mptr =new int[i];        length= i;        name =n;        cout<< "带参数构造函数\n";        showID();    }//构造函数(有参)    Pointer():mptr(nullptr), length(0){ cout << "无参数构造函数\n"; showID(); }//构造函数(无参)    virtual ~Pointer()    {        cout<< name + "析构函数"<<endl;        if (mptr)            delete[] mptr;        mptr =nullptr;     }//析构函数     Pointer(const Pointer& s)    {        length= s.getlen();        mptr =new int[length];        name =s.name;        cout<< "复制构造函数\n";        showID();    }//拷贝构造函数    Pointer& operator=(const Pointer &s)    {        if (this == &s)            return *this;        if (mptr)            delete[] mptr;        length= s.getlen();        mptr =new int[length];        name =s.name;        cout<< "赋值运算符\n";        showID();        return *this;    }//赋值运算符     //移动构造函数,参数s不能是const Pointer&& s,因为要改变s的成员数据的值     Pointer(Pointer&& s)    {        length= s.getlen();        mptr =s.getmptr();        name =s.name + "_yidonggouzao";//调用移动构造函数时,加一个标记         s.mptr = nullptr;        cout<< "移动构造函数\n";        showID();    }//移动构造函数     //移动赋值运算符     Pointer& operator=(Pointer&& s)    {        if (this == &s)            return *this;        if (mptr)            delete[] mptr;        length= s.getlen();        mptr =s.mptr;        name =s.name + "_yidongfuzhi";//调用移动赋值运算符时,加一个标记         s.mptr = nullptr;        cout<< "移动赋值运算符\n";        showID();        return *this;    }//移动赋值运算符     void showID()    {        cout<< "长度:" << length<< "  指针:" << mptr << "  名字:" << name<< endl;    }     int getlen() const    {        return length;    }     int* getmptr()const    {        return mptr;    } private:    int* mptr;    int length;    string name = "#NULL";//该参数用来标记不同的对象,c++11支持直接在类的数据成员定义处初始化 }; Pointer test(){    Pointer a(2, "test");    return a;} int _tmain(int argc, _TCHAR* argv[]){    //加花括号是为了观察析构函数的调用     {        Pointer(4, "notname1");   //定义的临时对象,在调用完直接被析构         Pointer a1 = test();//调用移动构造函数,创建对象a1         cout<< "a1.showID():\n";        a1.showID();         Pointer a2;        a2 = Pointer(5, "notname2");//调用移动赋值运算符          Pointer a3(Pointer(7, "notname3"));//此处没有调用移动构造函数,也就是说Pointer(7,"notname3") 这个变量没有被立即销毁(即不是临时变量),也许是因为它有了名字a3,所以不是临时变量了          cout<< "a3.showID():\n";        a3.showID();//验证a3确实是Pointer(7, "notname3")     }    cout<< endl;    system("pause");    return 0;}


输出结果为:

带参数构造函数

长度:指针:00A3F760 名字:notname1

notname1析构函数

带参数构造函数

长度:指针:00A3F9C8 名字:test

移动构造函数

长度:指针:00A3F9C8 名字:test_yidonggouzao

test析构函数

a1.showID():

长度:指针:00A3F9C8 名字:test_yidonggouzao

无参数构造函数

长度:指针:00000000 名字:#NULL

带参数构造函数

长度:指针:00A3F6F0 名字:notname2

移动赋值运算符

长度:指针:00A3F6F0 名字:notname2_yidongfuzhi

notname2析构函数

带参数构造函数

长度:指针:00A3CC00 名字:notname3

a3.showID():

长度:指针:00A3CC00 名字:notname3

notname3析构函数

notname2_yidongfuzhi析构函数

test_yidonggouzao析构函数

 

参考资料:

http://blog.csdn.net/shenwanjiang111/article/details/53576196

http://blog.csdn.net/bupt8846/article/details/43833151

 

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 护照签证页满了怎么办 我救护证过期了怎么办 友信贷款逾期4年怎么办 七日杀背包满了怎么办 东西被海关扣了怎么办 寄的快递破损了怎么办 苹果4s屏幕锁定怎么办 怀孕一个月同床了怎么办 故申请了不搬迁怎么办? 签证办好了不去怎么办 l签个人怎么办直飞香港 巴萨b队升入西甲怎么办 一天吃了2次金戈怎么办 京东发票掉了怎么办 京东发票丢了怎么办 京东的发票丢了怎么办 发票顺序拿错了怎么办 我被西海岸骗了怎么办? 微信功能被限制怎么办 微信限制领红包怎么办 微信无法领红包怎么办 微信红包不能收怎么办 抢红包被限制了怎么办 qq被限制加群怎么办 电脑拒绝访问u盘怎么办 炒菜味精放多了怎么办 魅族不能发短信怎么办 话费被恶意扣费怎么办 手机被恶意扣费怎么办 话费被软件扣费怎么办 小孩玩手机扣费怎么办 孩子玩手机扣费怎么办 手机被游戏扣费怎么办 冰岛签证拒签了怎么办 鱼缸内长青苔了怎么办? 毛巾用久了变硬怎么办 胃胀气一直嗝气怎么办 吃饭不给钱跑了怎么办 记分周期满12分怎么办 被马蜂蛰了很疼怎么办 被马蜂蛰了怎么办止痛