/*

 * 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. Unity知识结构总结

    前言 本篇以知识结构图的形式对Unity引擎的常用基础知识内容进行了总结和梳理. 如果你学了一点关于Unity引擎的知识,又觉得太杂乱,那么希望本篇会给你一些帮助. 对应引擎版本:Unity  4.6 ...

  2. KJHttp框架使用讲解

    摘要 本文原创,转载请注明地址:http://kymjs.com/code/2015/05/12/01写给那些在用.想用.还没有用过KJFrame的朋友. KJFrameForAndroid总共分为四 ...

  3. C#中使用NLua z

    直接下载NLua编译好的版本在c#项目中使用,运行的时候会提示无法加载lua52.dll,但lua52.dll这个文件又是在运行目录下的. 其实NLua不是无法加载lua52.dll本身,而是找不到l ...

  4. Sublime Text2安装emmet(原名Zen Coding)总结

    首先,安装好Sublime( 我用的是版本号2),之后注冊好.Sublime Text2.0.2注冊码:http://xionggang163.blog.163.com/blog/static/376 ...

  5. python笔记25-mock-server之moco

    前言 mock除了用在单元测试过程中,还有一个用途,当前端开发在开发页面的时候,需要服务端提供API接口 此时服务端没开发完成,或者说没搭建测试环境,这个时候前端开发会自己mock一个api服务端,自 ...

  6. Spark向HDFS中存储数据

    程序如下: import org.apache.spark.sql.Row; import org.apache.spark.SparkConf; import org.apache.spark.ap ...

  7. Android系统file_contexts二进制与文本转换工具

    #ifdef _WIN32 #define __USE_MINGW_ANSI_STDIO 1 #endif #include <stdio.h> #include <stdlib.h ...

  8. guess-number-higher-or-lower-ii

    // https://discuss.leetcode.com/topic/51353/simple-dp-solution-with-explanation // https://en.wikipe ...

  9. android.net.Uri 简介 API

    android.net.Uri 简介 public abstract class android.net.Uri extends Object implements Parcelable, Compa ...

  10. CSS 的优先级机制总结

    一.样式优先级: 多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使用多重样式的情况. 一般情况下,大家都认为优先级是:内联样式 > 内部样 ...