BogoToBogo
  • Home
  • About
  • Big Data
  • Machine Learning
  • AngularJS
  • Python
  • C++
  • go
  • DevOps
  • Kubernetes
  • Algorithms
  • More...
    • Qt 5
    • Linux
    • FFmpeg
    • Matlab
    • Django 1.8
    • Ruby On Rails
    • HTML5 & CSS

C++11/C++14 5B. Move Semantics II - 2020

cplusplus_icon.png




Bookmark and Share





bogotobogo.com site search:



"If you're an experienced C++ programmer and are anything like me, you initially approached C++11 thinking, "Yes, yes, I get it. It's C++, only more so." But as you learned more, you were surprised by the scope of the changes. auto declarations, range-based for loops, lambda expressions, and rvalue references change the face of C++, to say nothing of the new concurrency features. And then there are the idiomatic changes. 0 and typedefs are out, nullptr and alias declarations are in. Enums should now be scoped. Smart pointers are now preferable to built-in ones. Moving objects is normally better than copying them.
- Effective Modern C++ by Scott Meyers





Move Semantics II
Move Semantics - Sample A
// t1.cpp
#include <iostream>
#include <string>

using namespace std;

class A
{
public:
    // default constructor
    A() : s("default") {}

    // copy constructor
    A(const A& o) : s(o.s) { cout << "move failed!\n";}

    // move constructor
    A(A&& o) : s(move(o.s)) {}

    string printObj() { return s; }
private:
    string s;
};

A temp(A a) {
    return a;
}

int main()
{
    // move-construct from rvalue temporary
    A a1 = temp(A());        

    // move-construct from lvalue 
    cout << "before move() : a1 = " << a1.printObj() << endl; 
    A a2 = move(a1);          
    cout << "after move() : a1 = " << a1.printObj() << endl;
    cout << "after move() : a2 = " << a2.printObj() << endl;

    return 0;
}

Output:

before move() : a1 = default
after move() : a1 = 
after move() : a2 = default

In the code, we constructed an object of class A (a1) using a returned object (rvalue) from the temp() function. Then, we constructed another A object a2 from a1 using move().




Move Semantics - Sample B
// t2.cpp
#include <iostream>
#include <string>

using namespace std;

class A
{
public:
    // default constructor
    A() : s("default") { cout << "default constructor A\n"; }

    // copy constructor
    A(const A& o) : s(o.s) { cout << "copy constructor A - move failed!\n";}

    // move constructor
    A(A&& o) : s(move(o.s)) { cout << "move constructor A(A&&) called\n"; }

    string printObj() { return s; }
private:
    string s;
};

A temp(A a) {
    return a;
}

class B : public A
{};

int main()
{
    // calls default constructor
    B b1;

    // calls implicit move constructor
    B b2 = std::move(b1);

    return 0;
}

Since we haven't declared move constructor for B, when we do:

 B b2 = std::move(b1);

the implicit move constructor B::(B&&) will be used. It calls A's move constructor A::(A&&). The output looks like this:

$ g++ t2.cpp -o t2 -std=c++11
$ ./t2
default constructor A
move constructor A(A&&) called




Move Semantics - Sample C

In this sample code for creating class C object, unlike the previous sample for class B, we defined a destructor.

// t3.cpp
#include <iostream>
#include <string>

using namespace std;
class A
{
public:
    // default constructor
    A() : s("default") { cout << "default constructor A\n"; }

    // copy constructor
    A(const A& o) : s(o.s) { cout << "copy constructor A - move failed!\n";}

    // move constructor
    A(A&& o) : s(move(o.s)) { cout << "move constructor A(A&&) called\n"; }

    string printObj() { return s; }
private:
    string s;
};

A temp(A a) {
    return a;
}

class B : public A
{};

class C : public B 
{
public:
    // this destructor prevents implicit move ctor C::(C&&)
    ~C() {};
};

Since we have our own destructor for C, the move() won't call C::(C&&), instead it uses copy constructor as shown in the output below:

default constructor A
copy constructor A - move failed!

If we comment out the destructor for C, we get the following output instead:

default constructor A
move constructor A(A&&) called




Move Semantics - Sample D

The following code is almost the same as the code in Sample C. But there is a primary difference. We declared default for the move constructor:

D(D&&) = default;

Here is the code:

// t4.cpp
#include <iostream>
#include <string>

using namespace std;
class A
{
public:
    // default constructor
    A() : s("default") { cout << "default constructor A\n"; }

    // copy constructor
    A(const A& o) : s(o.s) { cout << "copy constructor A - move failed!\n";}

    // move constructor
    A(A&& o) : s(move(o.s)) { cout << "move constructor A(A&&) called\n"; }

    string printObj() { return s; }
private:
    string s;
};

A temp(A a) {
    return a;
}

class B : public A
{};

class C : public B
{
public:
    // this destructor prevents implicit move ctor C::(C&&)
    //~C() {};
};

class D : public A
{
public:
    // default constructor
    D() {}

    // destructor would prevent implicit move constructor D::(D&&)
    ~D() {};

    // forced use of move constructor
    D(D&&) = default;
};

int main()
{
    D d1;
    D d2 = std::move(d1);

    return 0;
}
default constructor A
move constructor A(A&&) called

The syntax of forcing use of move constructor is:

class_name ( class_name && ) = default; 	

As we can see from the output, we can ask the compiler to use move constructor even though we defined destructor.








C++11/C++14 Thread Tutorials



C++11 1. Creating Threads

C++11 2. Debugging with Visual Studio 2013

C++11 3. Threading with Lambda Function

C++11 4. Rvalue and Lvalue

C++11 5. Move semantics and Rvalue Reference

C++11 5B. Move semantics - more samples for move constructor

C++11 6. Thread with Move Semantics and Rvalue Reference

C++11 7. Threads - Sharing Memory and Mutex

C++11 8. Threads - Race Conditions

C++11 9. Threads - Deadlock

C++11 10. Threads - Condition Variables

C++11 11. Threads - unique futures (std::future<>) and shared futures (std::shared_future<>).

C++11 12. Threads - std::promise





C++11/C++14 New Features



initializer_list

Uniform initialization

Type Inference (auto) and Range-based for loop

The nullptr and strongly typed enumerations

Static assertions and Constructor delegation

override and final

default and delete specifier

constexpr and string literals

Lambda functions and expressions

std::array container

Rvalue and Lvalue (from C++11 Thread tutorial)

Move semantics and Rvalue Reference (from C++11 Thread tutorial)





Ph.D. / Golden Gate Ave, San Francisco / Seoul National Univ / Carnegie Mellon / UC Berkeley / DevOps / Deep Learning / Visualization

YouTubeMy YouTube channel

Sponsor Open Source development activities and free contents for everyone.

Thank you.

- K Hong






Sponsor Open Source development activities and free contents for everyone.

Thank you.

- K Hong






C++ Tutorials

C++ Home

Algorithms & Data Structures in C++ ...

Application (UI) - using Windows Forms (Visual Studio 2013/2012)

auto_ptr

Binary Tree Example Code

Blackjack with Qt

Boost - shared_ptr, weak_ptr, mpl, lambda, etc.

Boost.Asio (Socket Programming - Asynchronous TCP/IP)...

Classes and Structs

Constructor

C++11(C++0x): rvalue references, move constructor, and lambda, etc.

C++ API Testing

C++ Keywords - const, volatile, etc.

Debugging Crash & Memory Leak

Design Patterns in C++ ...

Dynamic Cast Operator

Eclipse CDT / JNI (Java Native Interface) / MinGW

Embedded Systems Programming I - Introduction

Embedded Systems Programming II - gcc ARM Toolchain and Simple Code on Ubuntu and Fedora

Embedded Systems Programming III - Eclipse CDT Plugin for gcc ARM Toolchain

Exceptions

Friend Functions and Friend Classes

fstream: input & output

Function Overloading

Functors (Function Objects) I - Introduction

Functors (Function Objects) II - Converting function to functor

Functors (Function Objects) - General



Git and GitHub Express...

GTest (Google Unit Test) with Visual Studio 2012

Inheritance & Virtual Inheritance (multiple inheritance)

Libraries - Static, Shared (Dynamic)

Linked List Basics

Linked List Examples

make & CMake

make (gnu)

Memory Allocation

Multi-Threaded Programming - Terminology - Semaphore, Mutex, Priority Inversion etc.

Multi-Threaded Programming II - Native Thread for Win32 (A)

Multi-Threaded Programming II - Native Thread for Win32 (B)

Multi-Threaded Programming II - Native Thread for Win32 (C)

Multi-Threaded Programming II - C++ Thread for Win32

Multi-Threaded Programming III - C/C++ Class Thread for Pthreads

MultiThreading/Parallel Programming - IPC

Multi-Threaded Programming with C++11 Part A (start, join(), detach(), and ownership)

Multi-Threaded Programming with C++11 Part B (Sharing Data - mutex, and race conditions, and deadlock)

Multithread Debugging

Object Returning

Object Slicing and Virtual Table

OpenCV with C++

Operator Overloading I

Operator Overloading II - self assignment

Pass by Value vs. Pass by Reference

Pointers

Pointers II - void pointers & arrays

Pointers III - pointer to function & multi-dimensional arrays

Preprocessor - Macro

Private Inheritance

Python & C++ with SIP

(Pseudo)-random numbers in C++

References for Built-in Types

Socket - Server & Client

Socket - Server & Client 2

Socket - Server & Client 3

Socket - Server & Client with Qt (Asynchronous / Multithreading / ThreadPool etc.)

Stack Unwinding

Standard Template Library (STL) I - Vector & List

Standard Template Library (STL) II - Maps

Standard Template Library (STL) II - unordered_map

Standard Template Library (STL) II - Sets

Standard Template Library (STL) III - Iterators

Standard Template Library (STL) IV - Algorithms

Standard Template Library (STL) V - Function Objects

Static Variables and Static Class Members

String

String II - sstream etc.

Taste of Assembly

Templates

Template Specialization

Template Specialization - Traits

Template Implementation & Compiler (.h or .cpp?)

The this Pointer

Type Cast Operators

Upcasting and Downcasting

Virtual Destructor & boost::shared_ptr

Virtual Functions



Programming Questions and Solutions ↓

Strings and Arrays

Linked List

Recursion

Bit Manipulation

Small Programs (string, memory functions etc.)

Math & Probability

Multithreading

140 Questions by Google



Qt 5 EXPRESS...

Win32 DLL ...

Articles On C++

What's new in C++11...

C++11 Threads EXPRESS...

Go Tutorial

OpenCV...








Contact

BogoToBogo
contactus@bogotobogo.com

Follow Bogotobogo

About Us

contactus@bogotobogo.com

YouTubeMy YouTube channel
Pacific Ave, San Francisco, CA 94115

Pacific Ave, San Francisco, CA 94115

Copyright © 2024, bogotobogo
Design: Web Master