R0 CREW

Помогите понять копирующий конструктор

Привет народ . Я тут перевариваю Философию C++ Эккеля . Вроде все было относительно понятно , но вот дошел до копирующих конструкторов и поплыл . Чувствую что не осознаю где-то 70% текста . :frowning:
Подскажите хороший подробный материал по ним . И еще интересно , часто ли они используются на практике и в каких задачах ?

Для всех начинающих изучать C++, я всегда рекомендую книгу “Джесс Либерти, Освой самостоятельно C++ за 21 день”. Вот ссылка на неё, в интернете есть только старый вариант, за 2000 год. Сама книга легко читается, доступно излагается и покрывает все конструкции языка. Мое ИМХО, это одна из лучших книг для старта. После её прочтения уже можно будет читать любые книги на тему C++.

Книга “Философия C++” предназначена для читателей среднего-высокого уровня. И я бы её крайне не рекомендовал читать новичку.

Если тебя надоумили читать “Философию С++”, то наверняка еще и пытались впарить Страуструпа, как книгу для начального чтения (обычно этой ахинеей страдают преподаватели вузов). Если вздумаешь читать Страуструпа, то берись за него в последнюю очередь, поскольку уровень этой книги от высокого до over-высокого.

Очень часто… Во всех классах, которые содержат в качестве переменных указатели.

А я по поводу Страуструпа мнение не разделяю. Как по мне, так это - лучшая книга по С++, в которой есть если не всё, то почти всё о С++. Страуструп, стоит заметить, наваял множество книг, но мне особо нравится “Язык программирования С++. Специальное издание” 2010 года. По поводу копирующего конструктора - используются они очень часто, я бы сказал - невероятно часто. Говоря простоыми словами, если в коде у вас встречается объявление переменной-экземпляра некоторого класса с последующей инициализацией этой переменной, то это - применение конструктора копирования. Т.е. допустим, у вас был класс Human:

class Human{
private:
int Age;
std::string Name;
bool armed;

public:
Human(){}

};

А потом вы написали такой код:

Human m1 = m2;

где объявили переменную m1 как экземпляр класса Human и сразу присвоили ей некоторое значение, то здесь будет вызываться конструктор копирования. Т.к. он не определён явно, то в данном случае вызовется конструктор копирования по умолчанию.

Спасибствую , Либерти посмотрю , хотя врядли стану покупать на Озоне .
Философия тру . Чувствуется что автор понимает . Я не говорил что совсем чайник . На C вполне могу шлепать формы . И они даже компилятся .
Страуструпа читал давно и это был плохой Страуструп . Он обожал лирические отступления , posix и абстрактные примеры про шарообразных коней в вакууме . Вероятно это было какое-то старое издание . С тех пор ему недоверяю .

Озон был дан как пример, я других нормальных магазинов не знаю.

Важно не только понимание, но то как происходит подача информации.

Я имел ввиду “Язык программирования С++”.

Я и не спорю и нигде этого не отрицал, НО как сказал выше, для начального чтения, читай знакомства с языком - я бы её крайне не рекомендовал. Книга рассчитана на людей уже хорошо знакомых с синтаксисом языка. Если человек не имеет “базы”, читать эту книгу, в лучшем случае будет тяжело и человек мало чего поймет, в худшем через пару сотен страниц она полетит в мусорку и человек возненавидит С++. Книга “Язык программирования С++” - это не учебник по C++, это книга про то, как его лучше использовать. ИМХО

Вполне соглашусь что Страуструп хорош когда ты уже познал основы. Д.Либерти намного доступнее излагает материал, сам с нее начинал.

Дополню для полноты:

Human src;

Human m1(src); // вызывается конструктор копий
Human m2 = src; // вызывается конструктор копий

Human getMan(Human src /* вызывается конструктор копий */)
{
    return src /* вызывается конструктор копий, создается безымянный объект */;
}

Human m3;
m3 = src; // вызывается operator=

Копирующий конструктор нужен, когда есть необходимость замены конструктора по умолчанию.
Например:
class CFoo
{
private:
void * lpParam;
}

Тут копирующий конструктор нужен, чтобы значение переменой не потерялось, выделить память, и скопировать содержимое.

Раз уж подняли тему про С++, то советую соответствующий курс на Stepic.org. Сертификат уже не получить, но вроде как видео стали доступны всем