/*

 * Compile with: 

 *       g++ move_test.c -o move_test -std=c++11 -g -fno-elide-constructors

 * -fno-elide-constructors disabled the return value optimize.

 */

#include <iostream>

#include <utility>





class A {

        public:

                A(void)

                {

                        a = new int;

                        std::cout << "Constructing(normal) A" << (void *)this << std::endl;

                }

                A(const class A &other)

                {

                        std::cout << "Constructing(copy) A" << (void *)this << std::endl;

                }

                A(class A &&other)

                {

                        std::cout << "Constructing(move) A" << (void *)this << std::endl;

                        a = other.a;

                        other.a = NULL;

                }





                ~A(void)

                {

                        std::cout << "Destructing A" << (void *)this << std::endl;

                        delete a;

                }

                void set(int i)

                {

                        *a = i;

                }

                int get(void)

                {

                        return *a;

                }

        private:

                int *a;

};





class B {

        private:

                class A a;

        public:

                B(void)

                {

                        std::cout << "Constructing(normal) B" << (void *)this << std::endl;

                }

                B(const class B &other)

                        : a(other.a)

                {

                        std::cout << "Constructing(copy) B" << (void *)this << std::endl;

                }

                B(class B &&other)

                        :a(std::move(other.a))

                {

                        std::cout << "Constructing(move) B" << (void *)this << std::endl;

                }

                ~B(void)

                {

                        std::cout << "Destructing B" << (void *)this << std::endl;

                }

                void set(int i)

                {

                        a.set(i);

                }

                int get(void)

                {

                        a.get();

                }

};





class B func(void)

{

        class B b;

        b.set(23);

        std::cout << "function Seperating..." << std::endl;

        std::cout << b.get() << std::endl;

        return b;

}





int main(void)

{

        class B b(func());









        std::cout << b.get() << std::endl;

        b.set('w');

        std::cout << "Seperating..." << std::endl;

        std::cout << b.get() << std::endl;





        return 0;

}

Running results:

Constructing(normal) A0xbf965d1c

Constructing(normal) B0xbf965d1c

function Seperating...

23

Constructing(move) A0xbf965d4c

Constructing(move) B0xbf965d4c

Destructing B0xbf965d1c

Destructing A0xbf965d1c

Constructing(move) A0xbf965d48

Constructing(move) B0xbf965d48

Destructing B0xbf965d4c

Destructing A0xbf965d4c

23

Seperating...

119

Destructing B0xbf965d48

Destructing A0xbf965d48

Move semantics(C++11)的更多相关文章

  1. C++11的value category(值类别)以及move semantics(移动语义)

    转载请保留以下声明 作者:赵宗晟 出处:http://www.cnblogs.com/zhao-zongsheng/p/value_categories_and_move_semantics.html ...

  2. c++11 移动语义move semantics

    performance, expensive object copies move semantics, temporary objects implemented with rvalue refer ...

  3. C++11之 Move semantics(移动语义)(转)

    转https://blog.csdn.net/wangshubo1989/article/details/49748703 按值传递的意义是什么? 当一个函数的参数按值传递时,这就会进行拷贝.当然,编 ...

  4. C++11新特性之 Move semantics(移动语义)

    https://blog.csdn.net/wangshubo1989/article/details/49748703 这篇讲到了vector的push_back的两种重载版本,左值版本和右值版本.

  5. 右值引用和std::move函数(c++11)

    1.对象移动 1)C++11新标准中的一个最主要的特性就是移动而非拷贝对象的能力 2)优势: 在某些情况下,从旧内存拷贝到新内存是不必要的,此时对对象进行移动而非拷贝可以提升性能 有些类如IO类或un ...

  6. C++11的new concepts (move semantic)

    MoveConstructible 和MoveAssignable MoveConstructible Specifies that an instance of the type can be mo ...

  7. C++11 move语意

        C++11带来的move语义     C++11引入了move语义,stl中的容器基本都支持move语义,因此我们在使用stl中的容器的时候,就已经使用过move语义了,在网上看了不少关于mo ...

  8. 【C/C++】C++11 Move, Forward

    左值与右值 Lvalue:可以出现在 operator= 左边的 Rvalue:只能出现在operator= 右边的 ; int a = b; a = b; a = a + b; a + b = a; ...

  9. 推荐使用C++ 11

    如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++ 11.当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢? 在我看来,答案毫无疑问是肯定的.我在下面给出了9个理由,它们分为 ...

随机推荐

  1. SWT 全接触

    http://www.ibm.com/developerworks/cn/opensource/os-swt/index.html 1.SWT简介 SWT-"Standard Widget ...

  2. golang包管理工具及环境管理工具;如何下载外网的依赖包

    简介: golang的包管理工具类似于java的maven.python的pip.js的npm,可以实现依赖包的统一管理:有很多:govendor.godep.glide,挑一个自己喜欢的用吧.mac ...

  3. 直播【95秀】JNI 基本实现 简洁

    2017-2-8 基本架构 1.使用SurfaceView在UI层面展示视频 2.通过JNI调用C代码控制视频的播放.停止 基本功能 1.从服务器获取正在直播的主播的列表信息 2.进入直播界面 3.可 ...

  4. GDB调试工具总结

    程序调试的基本思想是“分析现象->假设错误原因->产生新的现象去验证假设”这样一个循环过程,根据现象如何假设错误原因,以及如何设计新的现象去验证假设,需要非常严密的分析和思考.程序中除了一 ...

  5. (step4.1.2)hdu 1969(Pie——二分查找)

    题目大意:n块馅饼分给m+1个人,每个人的馅饼必须是整块的,不能拼接,求最大的. 解题思路: 1)用总饼的体积除以总人数,得到每个人最大可以得到的V.但是每个人手中不能有两片或多片拼成的一块饼. 代码 ...

  6. java 判断字符串是否相等 (转)

    http://blog.csdn.net/chtnj/article/details/7909720 判断字符串相等我们经常习惯性的写上if(str1==str2),这种写法在java中可能会带来问题 ...

  7. Idea代码可视化插件

    Idea代码可视化插件 https://plugins.jetbrains.com/plugin/7324-code-iris

  8. matlab中find函数的使用说明

    matlab中如何统计一个矩阵M中零的个数 size(find(M==0),1) 原文:http://blog.sina.com.cn/s/blog_707b64550100rbh3.html fin ...

  9. 两条Find指令

    # 列出所有包括a@b.c内容的xml文件 find / -type f -name "*.xml" | xargs grep "a@b.c" # 列出/opt ...

  10. 劣质代码评析——《写给大家看的C语言书(第2版)》附录B之21点程序(六)

    . #include <stdio.h> . #include <time.h> . #include <ctype.h> . #include <stdli ...