Конструктор за копиране на C++ Move и оператор за преместване на присвояване

Направих просто приложение с конструктор за копиране на преместване и оператор за присвояване на копие за преместване и за всеки от тях направих изявление cout само за да ми каже кои се изпълняват. Но по време на изпълнение не видях никакво изявление от операторите за копиране на движение, а само от този по подразбиране, който компилаторът вече предоставя. Ето моят код:

#include <iostream>
#include <string>
using namespace std;

class Names{
private:
    string* name;
public:
    Names(string place_name){
        cout << "Overloaded constructor" << endl;
        name = new string;
        *name = place_name;
    }
    //copy constructor
    Names(Names& cpy){
        cout << "Copy constructor" << endl;
        name = new string;
        *name = *cpy.name;
    }
    //assignment 
    Names& operator =(const Names& cpy){
        cout << "Assignment operator" << endl;
        name = new string;
        *name = *cpy.name;
        return *this;
    }
    //move constructor
    Names(Names&& cpym){
        cout << "Copy move constructor" << endl;
        name = cpym.name;
        cpym.name = NULL;
    }
    //move assignment operator
    Names& operator=(Names&& cpym){
        cout << "Copy assignment operator" << endl;
        delete name;
        name = cpym.name;
        cpym.name = NULL;
        return *this;
    }
    //destructor
    ~Names(){
        cout << "Deallocating memory" << endl;
        delete [] name;
    }
};

int main(){
    Names nme("Bob");
    Names copin("something");
    copin = nme;
    system("pause");
    return 0;
} 

и ето изхода

Изходен екран

така че основният въпрос е

1) Why isn't the cout statement being show for the move constructor?
2) Is my declaration for move constructor correct

и благодаря ти.


person user3264250    schedule 06.03.2014    source източник
comment
Трябва да придобиете навика да използвате списък с инициализатор на конструктор и nullptr. В противен случай не съм сигурен защо изобщо очаквате конструкторът за преместване да бъде извикан и компилаторът все още може да генерира версии за преместване вместо вас.   -  person chris    schedule 06.03.2014
comment
Харесайте как точно @chris, защото съм нов в c++ и бих бил още по-добър, ако можете да ми покажете кодираната версия   -  person user3264250    schedule 06.03.2014
comment
Тогава бих предложил книга. Освен това има тонове информация за всяко нещо, което споменах в Интернет.   -  person chris    schedule 06.03.2014
comment
@chris Получих тази информация от „Sams teaches yourself c++ in 21 days“ и къде мога да намеря вашите уроци?   -  person user3264250    schedule 06.03.2014
comment
Не имах предвид конкретен урок. Те са навсякъде и са достъпни чрез Google. Единственото конкретно нещо, което споменах, беше списъкът с книги (и имайте предвид, че тази конкретна книга не е много добре приета).   -  person chris    schedule 06.03.2014
comment
@chris добре все пак, какво може да е решението на това. Има ли нещо, което трябва да променя.   -  person user3264250    schedule 06.03.2014


Отговори (1)


Трябва да използвате std::move, за да работят конструкторът за преместване и операторът за присвояване на преместване. Вижте основната ми функция по-долу:

Names A(Names name) {
    return name;
}
int main(){
    Names nme("Bob");
    Names copin("something");
    cout << "before std::move(nme);" << endl;
    copin = std::move(nme);
    cout << "before std::move(GetName());" << endl;
    Names tom = std::move(nme);
    cout << "before A(Names(\"dick\");" << endl;
    // move constructor is also called when using temp rvalue
    Names dick = A(Names("dick"));
    system("pause");
    return 0;
}

Изход:

Overloaded constructor
Overloaded constructor
before std::move(nme);
Copy assignment operator
before std::move(GetName());
Copy move constructor
before A(Names("dick");
Overloaded constructor
Copy move constructor
Copy constructor
Deallocating memory
Deallocating memory
Press any key to continue . . .

Още един проблем, вашият деструктор не трябва да изтрива [] име, просто да изтрие име;

person uncletall    schedule 06.03.2014
comment
Това беше наистина хубаво @uncletall, но имам само един въпрос към вас. Трябва ли изрично да извикам move, за да извикам конструктора за преместване? Благодаря - person user3264250; 06.03.2014
comment
Да, трябва да го извикате изрично. Вижте тук: en.cppreference.com/w/cpp/language/move_constructor - person uncletall; 06.03.2014
comment
Благодаря, @uncletall, беше ми от голяма полза. - person user3264250; 06.03.2014