170 похожих чатов

В каких случаях вызывается конструктор копирования? При передаче фактического аргумента

функции по значению, насколько я знаю, при явном вызове конструктора с аргументом того же типа
Но может еще есть какие то ситуации?

16 ответов

14 просмотров

Конечно же: Foo lvalue; Foo b = lvalue;

Илья-Грошев Автор вопроса
Anton Semenov
Конечно же: Foo lvalue; Foo b = lvalue;

Могу ошибаться, но тут b сконструирован конструктором по умолчанию (без аргументов то бишь) А потом будет работать оператор "="

Илья Грошев
Могу ошибаться, но тут b сконструирован конструкто...

ошибаетесь, конечно =) оператор = нужен, как выше уже написали, когда уже существующему объекту присваивается новое значение. Вот так: Foo a, b; b = a; этот случай нельзя путать с предыдущим.

Илья Грошев
Могу ошибаться, но тут b сконструирован конструкто...

У класса может не быть конструктора по умолчанию, или он может быть приватным. Тогда бы по-вашему вообще бы ничего не работало.

есть еще неочевидный случай. #include <iostream> struct A { A() = default; A(const A&) { std::cout << "copy\n"; } A(A&&) { std::cout << "move\n"; } }; int main() { const A a; A b = std::move(a); // copy } когда муваем const A получаем тип const A&&, и он не попадет в A(A&&), потому что мы неконстанте присваиваем const (discards qualifiers). const A& примет и rvalue и lvalue и это const, поэтому выполнится конструктор копирования

Илья-Грошев Автор вопроса
Anton Semenov
ошибаетесь, конечно =) оператор = нужен, как выше...

Такая "ининициализация" в локальных переменных (даже main то бишь) на самом деле реализуется обычным присваиванием. В Си так точно, по поводу плюсов скорее всего тоже такая запись будет по настоящему инициализацией, когда это делается в глобальной области видимости, вот там тогда это попадет прям в секцию .data и не будет никакого присваивания, только лишь инициализация

дима
есть еще неочевидный случай. #include <iostream> ...

это еще и не самый неочевидный случай для мув-семантики. Я бы сказал, ` Movable a; Movable b = std::move(a); ` даже неочевиднее =) Но, кажется, пока рановато рассказывать про семантику перемещения, человеку с обычной бы разобраться

Илья Грошев
Такая "ининициализация" в локальных переменных (да...

что-то подобное может сработать только с POD, "чисто сишными структурами", не имеющих никаких специальных функций-членов и только из элементарных полей. Для объектов с поведением всегда работают более сложные правила.

Илья-Грошев Автор вопроса
Anton Semenov
что-то подобное может сработать только с POD, "чис...

Да, ты прав, сейчас протестировал Спасибо

Илья-Грошев Автор вопроса
Anton Semenov
что-то подобное может сработать только с POD, "чис...

выходит Foo A; Foo B = A; И Foo A; Foo B {A}; Это одно и то же?

При копировании объектов

Илья-Грошев Автор вопроса
Ilya Zviagin
При копировании объектов

пожалуй нужно было спросить "когда происходит копирование объекта" для таких остроумных как вы)

Илья Грошев
пожалуй нужно было спросить "когда происходит копи...

когда по каким-то причинам требуется создать копию :)

При инициализации переменной другим объектом класса

Илья Грошев
пожалуй нужно было спросить "когда происходит копи...

кстати, шутки шутками, а иногда это действительно не очевидно. Иногда компилятор может не делать копии в коде, семантика которого предполагает копирование. И наоборот, теоретически, такое тоже возможно (хотя лично я вспомнить примеры не могу)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта