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

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

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

16 ответов

11 просмотров

Конечно же: 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
При копировании объектов

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

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

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

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

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

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

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

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

Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
13
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
11
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
Карта сайта