移动构造函数和移动赋值运算符
来源:互联网 发布:arm linux gcc 是什么 编辑:程序博客网 时间:2024/06/05 16:15
如果第二个对象是在复制或赋值结束后被销毁的临时对象,则调用移动构造函数和移动赋值运算符,这样的好处是避免深度复制,提高效率。
为了直观地观察移动构造函数和移动赋值运算符的运行方式,编写一个类Pointer,该类的对象会在堆动态创建一个数组。
代码如下:
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+ "析构函数\n";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();//调用移动构造函数,创建对象a1cout << "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;}
运行结果如下:
0 0
- 移动构造函数和移动赋值运算符
- 移动构造函数和移动赋值运算符
- 移动构造函数和移动赋值运算符
- 移动构造函数和移动赋值运算符
- 移动构造函数和移动赋值运算符
- C++11移动构造函数,移动赋值运算符
- 移动构造函数与移动赋值运算符
- 移动构造、移动赋值函数
- C++ 移动构造与移动赋值运算符
- 构造函数/拷贝构造函数/赋值运算符/移动构造函数/移动赋值运算符几个的区别与相似之处
- C++ 11新特性:移动构造函数和移动赋值操作符
- C++:移动构造和移动赋值
- C++11特性--新的类功能--特殊的成员函数(移动构造函数,移动赋值运算符),默认方法和禁用方法(default,delete),委托构造函数,管理虚方法(override,final)
- Big-Five: 析构函数,拷贝构造函数,移动构造函数,拷贝赋值操作和移动赋值操作
- C++ 移动赋值运算符
- 拷贝构造函数和赋值运算符
- 拷贝构造函数和赋值运算符
- 拷贝构造函数和赋值运算符
- iOS支持arm64的支付宝SDK
- Java并发学习笔记(五)-显示锁
- 菜鸟学java:NullPointerException异常的解决。
- 黑马程序员——集合框架5:集合工具类
- iOS 项目开发总览,开发者账号
- 移动构造函数和移动赋值运算符
- Linux系统的远程登录(putty.exe)在windows下的使用
- 做自己喜欢的事
- linux添加新用户并给root权限
- iOS开发的一些奇巧淫技3
- iOS 关于 iOS 64位编程的建议
- [模板]网络流
- Office 2010 使用技巧
- malloc/free 与 new/free