Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Constructor initialization / 15 сообщений из 15, страница 1 из 1
13.07.2020, 14:36
    #39978993
nnalogovik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
Здравствуйте

Помогите понять почему


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class TT {
public:
  TT(){};

  TT &operator=(const TT &other) = delete;
};

class TT1 {
  TT mObject{};

public:
  explicit TT1(TT theObject) : mObject(theObject){};
};

int main() {
  TT obj{};
  TT1 *tt = new TT1(obj);
}



Вот так работает, а


Код: plaintext
1.
2.
3.
4.
5.
public:
  explicit TT1(TT theObject) {
     mObject=theObject;
  };
};



вот так нет
...
Рейтинг: 0 / 0
13.07.2020, 14:46
    #39978997
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
nnalogovik,

Мне кажется, что оно в обоих случаях работать не должно. Потому что в конструктор TT1 аргумент TT передаётся по значению - а это вызов заблокированного оператора копирования.
...
Рейтинг: 0 / 0
13.07.2020, 14:46
    #39978999
nnalogovik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
Я проверял - первый вариант работает
...
Рейтинг: 0 / 0
13.07.2020, 14:48
    #39979001
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
nnalogovik
Я проверял - первый вариант работает

А что тебе не понятно? Во втором случае для TT ты явно вызываешь оператор копирования. Он заблокирован. А в первом случае ты вызываешь конструктор копирования. Он не заблокирован.
...
Рейтинг: 0 / 0
13.07.2020, 14:49
    #39979003
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
В первом случае идёт инициализация копи-конструктором.
Во втором - явное присваивание.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.07.2020, 14:49
    #39979004
nnalogovik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
petrav

А что тебе не понятно?


Полегче ладно?

Если раздражает сам факт заданного вопроса - можно было проигнорировать


petrav

А в первом случае ты вызываешь конструктор копирования. Он не залокирован.


Это было неочевидно
...
Рейтинг: 0 / 0
13.07.2020, 14:50
    #39979005
nnalogovik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
Dimitry Sibiryakov

В первом случае идёт инициализация копи-конструктором.
Во втором - явное присваивание.


Спасибо
...
Рейтинг: 0 / 0
13.07.2020, 14:52
    #39979008
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
Dimitry Sibiryakov

В первом случае идёт инициализация копи-конструктором.
Во втором - явное присваивание.

Но ведь в первом случае в конструктор TT1 объект ТТ передаётся по значению с заблокированным оператором копирования. Как же оно компилируется?
...
Рейтинг: 0 / 0
13.07.2020, 15:04
    #39979021
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
petravТТ передаётся по значению с заблокированным оператором копирования.

Не существует в природе "оператора копирования".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.07.2020, 15:20
    #39979039
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
petrav

Но ведь в первом случае в конструктор TT1 объект ТТ передаётся по значению с заблокированным оператором копирования. Как же оно компилируется?
Чтобы удостовериться в том, что говорит Дмитрий, запрети конструктор копирования для первого случая и получишь ошибку.
Код: plaintext
1.
TT(const TT& other) = delete;
...
Рейтинг: 0 / 0
13.07.2020, 15:24
    #39979043
nnalogovik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
AmKad
petrav

Но ведь в первом случае в конструктор TT1 объект ТТ передаётся по значению с заблокированным оператором копирования. Как же оно компилируется?
Чтобы удостовериться в том, что говорит Дмитрий, запрети конструктор копирования для первого случая и получишь ошибку.
Код: plaintext
1.
TT(const TT& other) = delete;



Совершенно верно

Конструктор копирования будет вызван дважды
...
Рейтинг: 0 / 0
13.07.2020, 15:25
    #39979044
nnalogovik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
Dimitry Sibiryakov

petravТТ передаётся по значению с заблокированным оператором копирования.

Не существует в природе "оператора копирования".




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <iostream>

class TT {
public:
  TT(){};

  TT(const TT &other) { std::cout << "copy"; };

  TT &operator=(const TT &other) = default;
};

class TT1 {
  TT mObject{};

public:
  explicit TT1(TT theObject) { mObject = theObject; };
};

int main() {
  TT obj{};
  TT1 *tt = new TT1(obj);
}
...
Рейтинг: 0 / 0
13.07.2020, 15:28
    #39979048
nnalogovik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#include <iostream>

class TT {
public:
  TT(){};

  TT(const TT &other) { std::cout << "copy"; }

  TT(const TT &&other) { std::cout << "move"; }

  TT &operator=(const TT &other) = default;
};

class TT1 {
  TT mObject{};

public:
  explicit TT1(TT& theObject) : mObject(std::move(theObject)){};
};

int main() {
  TT obj{};
  TT1 *tt = new TT1(obj);
}



Вот так вызовется ровно 1 move конструктор
...
Рейтинг: 0 / 0
13.07.2020, 15:30
    #39979051
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
Dimitry Sibiryakov

petravТТ передаётся по значению с заблокированным оператором копирования.

Не существует в природе "оператора копирования".

Ну пусть будет оператор присваивания.

Да что-то я затупил. На стеке конструктора TT1 объект ТТ создаётся конструктором копирования (это очевидно), а не оператором присваивания.
...
Рейтинг: 0 / 0
13.07.2020, 15:37
    #39979058
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Constructor initialization
nnalogovik

Вот так вызовется ровно 1 move конструктор
Для параметров move-конструкторов спецификатор const-обычно не ставят.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Constructor initialization / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]