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

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


Код: 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
Constructor initialization
    #39978997
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nnalogovik,

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

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

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


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

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


petrav

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


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

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


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

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

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

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

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

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



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

Конструктор копирования будет вызван дважды
...
Рейтинг: 0 / 0
Constructor initialization
    #39979044
nnalogovik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Constructor initialization
    #39979048
nnalogovik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Constructor initialization
    #39979051
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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

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

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

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


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