Ukio_G
@Ukio_G
Незамысловатый юноша.

Почему не вызывается конструктор копирования?

Имеется код с простым классом:

class SimpleClass{
public:
    SimpleClass()
    {
      std::cout << "Simple class constructor has been called" << std::endl;
    };
    SimpleClass(SimpleClass const & simpleClass)
    {
        std::cout << "Simple class copy constructor has been called" << std::endl;
        this->data = simpleClass.data;
    }
    SimpleClass & operator=(SimpleClass const & simpleClass );
    void printData();
    void * data;
    char * name = "name";
    ~SimpleClass()
    {
        delete data;
    }
};

SimpleClass &SimpleClass::operator=(SimpleClass const & simpleClass) {
    std::cout << "equation operator has been called" << std::endl;
    this->data = simpleClass.data;
    return *this;
}

void SimpleClass::printData() {
    std::cout << reinterpret_cast<char*>(data) << std::endl;
}


SimpleClass getInstanceOfSimpleClass()
{
    SimpleClass simpleClass;
    char * data = new char;
    data = "data";
    simpleClass.data = reinterpret_cast<void*>(data);
    simpleClass.name = "instance from function";
    return simpleClass;
}

int main() {
    SimpleClass simpleClassInstance(getInstanceOfSimpleClass());
    simpleClassInstance.printData();
    return 0;
}


И, что очень странно, у меня следующий вывод после компиляции этого кода (и запуска того, что получилось):
Simple class constructor has been called
data


Напрашивается 2 вопроса:

1) Почему не вызывается конструктор копирования?

SimpleClass(SimpleClass const & simpleClass)
    {
        std::cout << "Simple class copy constructor has been called" << std::endl;
        this->data = simpleClass.data;
    }


2) Как так получается, что конструктор копирования не вызывается, а данные, которые содержались в объекте, который вернула функция getInstanceOfSimpleClass, записались в только что созданный объект?

MinGW G++ 8.2.0
  • Вопрос задан
  • 170 просмотров
Решения вопроса 1
hePPer
@hePPer
похоже на пропуск конструктора при оптимизации
Copy elision
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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