Вопрос по memory, class, constructor, dynamic, c++ – Копировать конструктор не вызывается?

1

Насколько я знаю, вы вызываете конструктор копирования в следующих случаях:

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

2 При передаче объекта по значению.

3 Когда объект возвращается из функции по значению.

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

#include 

using namespace std;

class Circle{
private:
    double* data;
public:
    Circle();
    Circle(double* set);
    Circle(const Circle& tt1);
    ~Circle();
    Circle& operator=(const Circle& tt1);
};



Circle :: Circle()
{
    cout < "Default constructor called" < endl;
    data = NULL;
}

Circle :: Circle(double* set)
{
    cout < "Set up constructor called" < endl;
    data = new double[3];
    copy(set, set+3, data);
}

Circle :: Circle(const Circle& tt1)
{
    cout < "Copy constructor called" < endl;
    data = new double[3];
    copy(tt1.data, tt1.data+3, this->data);
}
Circle :: ~Circle()
{
    cout < "Destructor called!" < endl;
    delete[] data;
}

Circle& Circle :: operator=(const Circle& tt1)
{
    cout < "Overloaded = called" < endl;
    if(this != &tt1)
    {
        delete[] this->data;
        this->data  = new double[3];
        copy(tt1.data, tt1.data+3, this->data);
    }
    return *this;
}

void test2(Circle a)
{

}
Circle test3()
{
    double arr [] = { 3, 5, 8, 2};
    Circle asd(arr);
    cout< "end of test 3 function" < endl;
    return asd;
}

int main()
{
    cout 
Вы не ошиблись. Это было просто оптимизировано. jrok
Вот это да. Я буквально пару часов думал об этом. Ну, по крайней мере, я не забуду это сейчас! Stanimirovv
@ Bloodcount важно то, что ты выучил это и выигралне забудь это. Это пара часов, которые вы хорошо провели, если вы спросите меня. Nik Bougalis

Ваш Ответ

2   ответа
3

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

Вот почему при отладкеМы увидим много запутанных вещей, так как сгенерированный код делает что-то совершенно отличное от того, что вы написали, сохраняя наблюдаемое состояние без изменений. Это фактически затрудняет написание отладчиков - если, например, вы хотите проверить значение переменной во время отладки, компилятор может 'мы решили, что переменная недаже не нужно существовать, и что в таком случае должно показывать отладчик?

В очень небольшом числе случаев компилятору разрешено изменять смысл вашего кода.РВО и NRVO [та же ссылка, что и выше] являются двумя примерами из них - компилятору разрешено исключать конструктор копирования в этих ограниченных случаях - что вы и видите. Компилятор должен по-прежнему проверять, что ваш конструктор копирования существует и доступен - например, он неt приватный, удаленный или невозможный для генерации - но он не может его использовать.

По этой причине Копирующие Конструкторы [и деструкторы логического вывода] должны просто делать обычные вещи - как будто онипереубедили тебяЯ получу заметно другое поведение.

8

Оптимизация возвращаемого значения 3-й контрольный пример »Вызов конструктора копирования оптимизируется компилятором.

@ Bloodcount, пожалуйста! taocp
Спасибо! Отметил и узнал! Stanimirovv

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