千家信息网

C++11中右值引用和std::move语句的示例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍了C++11中右值引用和std::move语句的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.什么是左值,
千家信息网最后更新 2026年11月02日C++11中右值引用和std::move语句的示例分析

这篇文章主要介绍了C++11中右值引用和std::move语句的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

1.什么是左值,什么是右值,简单说左值可以赋值,右值不可以赋值。以下面代码为例,"A a = getA();"该语句中a是左值,getA()的返回值是右值。

#include "stdafx.h"#include class A{public:  A() { std::cout << "Constructor" << std::endl; }  A(const A&) { std::cout << "Copy Constructor" << std::endl; }  ~A() {}};static A getA(){  A a;  return a;}int main(){  A a = getA();  return 0;}

运行以上代码,输出结果如下:

Constructor
Copy Constructor

可以看到A的构造函数调用一次,拷贝构造函数调用了一次,构造函数和拷贝构造函数是消耗比较大的,这里是否可以避免拷贝构造?C++11做到了这一点。

2.添加A的移动构造函数,代码如下:

#include "stdafx.h"#include class A{public:  A() { std::cout << "Constructor" << std::endl; }  A(const A&) { std::cout << "Copy Constructor" << std::endl; }  A(const A&&) { std::cout << "Move Constructor" << std::endl; }  ~A() {}};static A getA(){  A a;  return a;}int main(){  A a = getA();  return 0;}

运行以上代码,输出结果:

Constructor
Move Constructor

这样就没有调用拷贝构造函数,而是调用移动构造。这里并没有看到移动构造的优点。

3.修改代码,给A类添加一个成员变量如下:

#include "stdafx.h"#include #include class B{public:  B() {}  B(const B&) { std::cout << "B Constructor" << std::endl; }};class A{public:  A(): m_b(new B()) { std::cout << "A Constructor" << std::endl; }  A(const A& src) :    m_b(new B(*(src.m_b)))  {     std::cout << "A Copy Constructor" << std::endl;  }  A(A&& src) :    m_b(src.m_b)  {    src.m_b = nullptr;    std::cout << "A Move Constructor" << std::endl;  }  ~A() { delete m_b; }private:  B* m_b;};static A getA(){  A a;  std::cout << "================================================" << std::endl;  return a;}int main(){  A a = getA();  std::cout << "================================================" << std::endl;  A a1(a);  return 0;}

运行以上代码,输出结果:

A Constructor
================================================
A Move Constructor
================================================
B Constructor
A Copy Constructor

"A a = getA();"调用的是A的移动构造,"A a1(a);"调用的是A的拷贝构造。A的拷贝构造需要对成员变量B进行深拷贝,而A的移动构造不需要,很明显,A的移动构造效率高。

4.std::move语句可以将左值变为右值而避免拷贝构造,修改代码如下:

#include "stdafx.h"#include #include class B{public:  B() {}  B(const B&) { std::cout << "B Constructor" << std::endl; }};class A{public:  A(): m_b(new B()) { std::cout << "A Constructor" << std::endl; }  A(const A& src) :    m_b(new B(*(src.m_b)))  {     std::cout << "A Copy Constructor" << std::endl;  }  A(A&& src) :    m_b(src.m_b)  {    src.m_b = nullptr;    std::cout << "A Move Constructor" << std::endl;  }  ~A() { delete m_b; }private:  B* m_b;};static A getA(){  A a;  std::cout << "================================================" << std::endl;  return a;}int main(){  A a = getA();  std::cout << "================================================" << std::endl;  A a1(a);  std::cout << "================================================" << std::endl;  A a2(std::move(a1));  return 0;}

运行以上代码,输出结果:

A Constructor
================================================
A Move Constructor
================================================
B Constructor
A Copy Constructor
================================================
A Move Constructor

"A a2(std::move(a1));"将a1转换为右值,因此a2调用的移动构造而不是拷贝构造。

5.赋值操作符也可以是移动赋值。

#include "stdafx.h"#include #include class B{public:  B() {}  B(const B&) { std::cout << "B Constructor" << std::endl; }};class A{public:  A(): m_b(new B()) { std::cout << "A Constructor" << std::endl; }  A(const A& src) :    m_b(new B(*(src.m_b)))  {     std::cout << "A Copy Constructor" << std::endl;  }  A(A&& src) :    m_b(src.m_b)  {    src.m_b = nullptr;    std::cout << "A Move Constructor" << std::endl;  }  A& operator=(const A& src)  {    if (this == &src)      return *this;    m_b = new B(*(src.m_b));    std::cout << "operator=(const A& src)" << std::endl;    return *this;  }  A& operator=(A&& src)  {    if (this == &src)      return *this;    m_b = src.m_b;    src.m_b = nullptr;    std::cout << "operator=(const A&& src)" << std::endl;    return *this;  }  ~A() { delete m_b; }private:  B* m_b;};static A getA(){  A a;  std::cout << "================================================" << std::endl;  return a;}int main(){  A a = getA();//移动构造  std::cout << "================================================" << std::endl;  A a1(a);//拷贝构造  std::cout << "================================================" << std::endl;  A a2(std::move(a1));//移动构造  std::cout << "================================================" << std::endl;  a2 = getA();//移动赋值  std::cout << "================================================" << std::endl;  a2 = a1;//拷贝赋值  return 0;}

运行以上代码,输出结果:

A Constructor
================================================
A Move Constructor
================================================
B Constructor
A Copy Constructor
================================================
A Move Constructor
================================================
A Constructor
================================================
A Move Constructor
operator=(const A&& src)
================================================
B Constructor
operator=(const A& src)

总之尽量给类添加移动构造和移动赋值函数,而减少拷贝构造和拷贝赋值的消耗。

感谢你能够认真阅读完这篇文章,希望小编分享的"C++11中右值引用和std::move语句的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

拷贝 移动 代码 函数 结果 输出 运行 语句 篇文章 中右 示例 分析 变量 成员 消耗 明显 价值 优点 兴趣 同时 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司华为 互联网科技有限公司图片 深圳互联网科技公司 合肥互联网科技公司 伴你行互联网科技有限公司 互联网高科技股票 互联网科技股有哪些 上海电发互联网科技有限公司 互联网科技实习生岗位职责 宝灵互联网科技有限公司 厦门千工互联网科技有限公司 互联网科技商业 互联网媒体平台算高科技产业 米聚互联网科技南京有限公司排面 互联网科技和信息 深圳育鹏互联网科技有限公司招聘 996高科技互联网公司 迪庆互联网科技招生 富国互联网科技002692 宇信科技在杭州互联网排第几 狮子座互联网科技有限公司 成都互联网科技公司100强 互联网媒体平台算高科技产业 呼和浩特新华互联网科技学院 燊美集互联网科技有限公司 南通创西澳互联网科技有限公司 江苏互联网智能科技软件 本届互联网大会上的黑科技 深圳互联网科技园地址 高科技和互联网的现代国家
0