Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
12 / 7 / 9
Регистрация: 08.04.2017
Сообщений: 118
1

Поясните про конструктор перемещения

04.12.2020, 10:12. Показов 1004. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не могу понять, почему при создании объектов a8 - a11 не вызывается конструктор перемещения, да и вообще никакой не вызывается по сути.
Объясните почему так происходит и почему я не прав?) Спасибо

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>
 
class A {
private:
    std::string string;
public:
    A() { std::cout << "Конструктор по умолчанию" << std::endl; }
    A(int a) { std::cout << "Конструктор с параметрами" << std::endl; }
    A(const std::string& str) : string(str) { std::cout << "Конструктор преобразования" << std::endl; }
    A(A&) { std::cout << "Конструктор копирования" << std::endl; }
    A(A&&) { std::cout << "Конструктор перемещения" << std::endl; }
    A&operator=(A&){ std::cout << "Оператор копирования" << std::endl; }
    A&&operator=(A&&) { std::cout << "Оператор перемещения" << std::endl; }
};
 
A get1() {
    return A();
}
 
A get2() {
    A a;
    return a;
}
 
A&& get3() {
    return A();
}
 
A&& get4() {
    A a;
    return std::move(a);
}
 
int main()
{
    std::cout<<"A a1: ";
    A a1; // Конструктор по умолчанию +
 
    std::cout<<"A a2(a1) : ";
    A a2(a1); // Конструктор копирования +
 
    std::cout<<"A *a3 = new A(a1) : ";
    A *a3 = new A(a1); // Конструктор копирования +
 
    std::cout<<"a1 = a2 : ";
    a1 = a2; // Оператор копирования +
 
    std::cout<<"A a4(12) : ";
    A a4(12); // Конструктор с параметрами +
 
    std::cout<<"A a5 = std::string(\"hello\"); : ";
    A a5 = std::string("hello"); // Конструктор преобразования +
 
    std::cout<<"A a6 = *a3; : ";
    A a6 = *a3; // Конструктор копирования +
 
    std::cout<<"A a7(*a3); : ";
    A a7(*a3); // Конструктор копирования +
 
    std::cout<<"A a8 = get1(); : ";
    A a8 = get1(); // Конструктор перемещения
 
    std::cout<<"A a9(get1()) : ";
    A a9(get1()); // Конструктор перемещения
 
    std::cout<<"A a10 = get2() : ";
    A a10 = get2(); // Конструктор перемещения
 
    std::cout<<"A a11(get2()) : ";
    A a11(get2()); // Конструктор перемещения
 
    std::cout<<"A a12 = get3() : ";
    A a12 = get3(); // Конструктор перемещения +
 
    std::cout<<" A a13(get3()) : ";
    A a13(get3()); // Конструктор перемещения +
 
    std::cout<<"A a14 = get4() : ";
    A a14 = get4(); // Конструктор перемещения +
 
    std::cout<<"A a15(get4()); : ";
    A a15(get4()); // Конструктор перемещения +
 
    std::cout<<"a13 = get1() : ";
    a13 = get1(); // Оператор перемещения +
 
    std::cout<<"a13 = get2() : ";
    a13 = get2(); // Оператор перемещения +
 
    std::cout<<"a13 = get3() : ";
    a13 = get3(); // Оператор перемещения +
 
    std::cout<<"a13 = get4() : ";
    a13 = get4(); // Оператор перемещения +
 
    delete a3;
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2020, 10:12
Ответы с готовыми решениями:

C++11 Конструктор перемещения
Добрый день. Решил тут познакомится с конструктором перемещения, и сразу протестировал кое-что....

Конструктор перемещения
Здравствуйте, пытаюсь уже некоторое время разобраться с move-семантикой. Честно говоря возникли...

Конструктор перемещения
#include &lt;iostream&gt; #include &lt;memory&gt; using namespace std; class A { int x; public: ...

Конструктор перемещения
Правильно написан конструктор, значения в right нужно обнулять или не нужно? class Test {...

3
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
04.12.2020, 10:35 2
Цитата Сообщение от boganet Посмотреть сообщение
Не могу понять, почему при создании объектов a8 - a11 не вызывается конструктор перемещения, да и вообще никакой не вызывается по сути.
Объясните почему так происходит и почему я не прав?) Спасибо
Цитата Сообщение от boganet Посмотреть сообщение
A&&operator=(A&&) { std::cout << "Оператор перемещения" << std::endl; }
A &operator=
C++
1
2
3
4
5
A&operator=(A&&) 
{ 
std::cout << "Оператор перемещения" << std::endl; 
return *this;
}
Добавлено через 30 секунд
Цитата Сообщение от boganet Посмотреть сообщение
A&& get3() {
    return A();
}
A&& get4() {
    A a;
    return std::move(a);
}
C++
1
2
A get3()
A get4()
0
12 / 7 / 9
Регистрация: 08.04.2017
Сообщений: 118
04.12.2020, 10:44  [ТС] 3
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
A &operator=
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
A get3()
A get4()
Ну по сути это ничего не меняет в контексте создания объектов 8-11. Вызывается только конструктор по умолчанию в самой функции get
Код
A a8 = get1(); : Конструктор по умолчанию
A a9(get1()) : Конструктор по умолчанию
A a10 = get2() : Конструктор по умолчанию
A a11(get2()) : Конструктор по умолчанию
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
04.12.2020, 10:46 4
Лучший ответ Сообщение было отмечено boganet как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
    std::cout<<"A a8 = get1(); : ";
    {
        A a;
        A a8 = std::move(a); // Конструктор перемещения
    }
 
    std::cout<<"A a9(get1()) : ";
    {
        A a;
        A a9(std::move(a)); // Конструктор перемещения
    }
Иначе компилятор, похоже, оптимизирует все эти вызовы, даже в дебаге

Добавлено через 57 секунд
Цитата Сообщение от boganet Посмотреть сообщение
Ну по сути это ничего не меняет в контексте создания объектов 8-11. Вызывается только конструктор по умолчанию в самой функции get
Ты возвращаешь ссылку на локальный объект. Смотри предупреждения компилятора
0
04.12.2020, 10:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2020, 10:46
Помогаю со студенческими работами здесь

Конструктор перемещения
Здравствуйте. У меня есть такой класс: class Organization { char *name; int year,...

Конструктор перемещения и оптимизация
Имеем тестовый код: #include &lt;iostream&gt; using namespace std; struct A { A( int v ) ...

Синтезируемый конструктор перемещения
Насколько я знаю, при определении в классе пользовательского конструктора копирования компилятор не...

Не срабатывает конструктор перемещения
Есть класс у которого удалён конструктор перемещения. Но тем не менее, при передаче обьекта данного...

Не работает конструктор перемещения (C++11)
Прив. Пишу класс подобный string'гу, ну и в процессе изучаю C++. Добрался до оператора и...

Почему не вызывается конструктор перемещения?
#include &lt;iostream&gt; #include &lt;vector&gt; class Object { public: Object() { std::cout &lt;&lt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru