Move semantics(C++11)

Posted gcczhongduan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Move semantics(C++11)相关的知识,希望对你有一定的参考价值。

/*
 * 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)的主要内容,如果未能解决你的问题,请参考以下文章

C++11:移动语义Move Semantics和完美转发Perfect Forwarding

C++11:移动语义Move Semantics和完美转发Perfect Forwarding

我是如何明白C++的move semantics(右值引用)和perfect forwarding(完美转发)的

C++11新特性之move与forward

C++11 move()函数:将左值强制转换为右值

(译)C++11中的Move语义和右值引用