Хорошая ссылка на C ++ FAQ, опубликованная Eli, и сообщение gbacon верное.
Чтобы явно ответить на вторую часть вашего вопроса: да, когда вы передаете экземпляр объекта по значению, конструктор копирования будет использоваться для создания локального экземпляра объекта в области вызова функции. Каждый объект имеет «конструктор копирования по умолчанию» (gbacon ссылается на это как «сгенерированный компилятором по умолчанию»), который просто копирует каждый элемент объекта - это может быть не то, что вам нужно, если ваши экземпляры объекта содержат указатели или ссылки, например. *
Что касается хороших книг для (пере) изучения C ++ - я впервые выучил его почти два десятилетия назад, и с тех пор он сильно изменился - я рекомендую Брюса Экеля «Мышление в C ++» версии 1 и 2, свободно доступного здесь ( как в формате PDF, так и в формате HTML):
http://www.ibiblio.org/pub/docs/books/eckel/