Конструктор копирования

Android256

Здраствуйте! Ниже приведено 2 исходника. Подскажите, пожалуйста, в котором из них нужно вставить конструктор копирования, или может быть в обеих? Примеры простые, но я никак не могу понять, в каких случаях надо использовать конструктор копирования. С прочитанной литературы я может быть ошибочно решил, что конструктор копирования используется только при выделении динамической памяти, во время использования оператора new.Исходник 1:
#include <iostream>
using namespace std;
 
class ClassName
{
    public:
        ClassName()
        {
            cout<<"ClassName!!!\n";
        }
        ~ClassName()
        {
            cout<<"~ClassName!!!\n";
        }
};
void f(ClassName o)
{
    cout<<"Function f!!!\n";
}
void main()
{
    ClassName c1;
    f(c1);
}
Исходник 2:
#include <iostream>
#include <string.h>
using namespace std;
 
class student
{
    public:
        student()
        {
            cout<<"class student\n";
        }
        ~student()
        {
            cout<<"~class student\n";
        }
};
void function2(student *C)
{
    cout<<"In function2\n";
}
void main()
{
    student *C;
    C=new student();
 
    function2(C);
    delete C;
}
3 ответа

Android256

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


Android256

Спасибо за ответ, но я еще больше запутался. Вот смотри: если мы создаем объект "A",выделив при этом для него память с пом.new, передаем его в Функцию, то создается отдельная копия этого объекта (назовем ее формально "Acopy"), которая будет указывать на выделенную память под исходный объект А. После того, когда функция завершит свое выполнение, копия объекта "Аcopy" с пом. деструктора разрушиться, при этом она разрушит память, на которую она указывала, т.е. память объекта "А". А если память под объект "A" разрушиться, то, соответственно у нас преждевременно разрушиться сам объект "A". Поэтому, как я понимаю, нужен констр коп. И указывать его вручную, наверное, стоит. Тем более, деструктор всегда надо указывать в программе, а после выполнения программы, количество деструкторов д.б равным количеству конструкторов. Если я не прав, то ответь, пожалуйста.


Android256

то, что ты описал:
typename *A=new typename; //"мы создаем объект "A""
void F(A); //"передаем его в Функцию"
//если внутри функции ты не делал delete A; то после завершения функции объект А продолжает //жить, его копия внутри функции уничтожена
Тем более, деструктор всегда надо указывать в программе
не обязательно, он будет создан автоматически, если не указан руками