Почему мой класс работает правильно, даже после возврата ненужного значения в качестве возврата для оператора присваивания и пустого конструктора копирования?

  1. Я переопределил конструктор копирования по умолчанию и оператор присваивания только для печати и не возвращал ничего.
  2. Как бы то ни было, класс работает нормально, то есть он копируется и назначается правильно.
  3. Как вы можете видеть Дисплей () Метод также вызывается правильно. (Я ожидал сбой или ошибку сегментации, так как конструктор копирования и оператор присваивания переопределяются и ничего не делают.
  4. Я скомпилировал то же самое с различными компиляторами, включая онлайн, и все еще вывод остается тем же.

Мой вопрос:
Почему класс работает правильно? Не показывая каких-либо ошибок?
Я ожидал сбой или сбой, например, вывод значений мусора.

class Pizza
{
public:
Pizza(std::string string) { std::cout << "Ctor :" << string << std::endl; }
~Pizza() { std::cout << "Dtor" << std::endl; }

Pizza(const Pizza& rhs){ std::cout << "Copy Constructor" << std::endl; }
Pizza& operator=(const Pizza& rhs){ std::cout << "Assignment Operator" << std::endl;}
void display(){std::cout << "Display method is called on Pizza" << std::endl; }
};

int main()
{
Pizza pizza = Pizza("1");
Pizza tizza = pizza;
tizza = pizza;
pizza.display();
tizza.display();
}'

Вывод для кода с g ++ (Mingw Compiler) на Windows 10 и других компиляторах тоже:

Ctor :1
Copy Constructor
Assignment Operator
Display method is called on Pizza
Display method is called on Pizza
Dtor
Dtor

-2

Решение

Похоже, я нашел причину:
Благодаря @ Игорь Тандетник, он упомянул то же самое в комментарии в тот же день, когда был задан вопрос. Однако, так как комментарий был кратким, и я все еще на стадии изучения, я не смог получить полную картину из комментария. Поэтому решил написать ответ с небольшим объяснением. Что будет полезно для таких, как я, когда-нибудь :).

Причина:
— Я не использую никаких членов данных в классе.
— Я использую только метод класса в приведенном выше коде. Поскольку все объекты используют одни и те же методы класса (т.е. методы класса для каждого класса, а не для объекта.)
— Основным мотивом конструктора копирования является копирование элементов данных из одного объекта класса в другой объект.
— Я не объявил ни одного нестатического члена данных для класса, который создается для объекта. Объявление нестатических членов для вышеупомянутого наверняка приведет к неопределенному поведению класса. Такие члены данных имеют значения мусора.
Следовательно, приведенный выше код прекрасно работает с некорректным конструктором копирования и оператором присваивания перемещения.

Ниже приведен код, который будет давать значения мусора для членов данных из-за неправильного оператора присваивания и конструктора копирования.

//g++  5.4.0

#include <iostream>

class Pizza
{
public:
Pizza(std::string string, int data) : m_string(string), m_data(data) { std::cout << "Ctor :" << string << std::endl; }
~Pizza() { std::cout << "Dtor" << std::endl; }
void set(std::string string, int data) { m_string = string; m_data = data; }
Pizza(const Pizza& rhs){ std::cout << "Copy Constructor" << std::endl; }
Pizza& operator=(const Pizza& rhs){ std::cout << "Assignment Operator" << std::endl;}
void display()
{
std::cout << "Display method is called on Pizza" << std::endl;
std::cout << "string: " << m_string << " Data: " << m_data << std::endl;
}

private:
std::string m_string;
int m_data;
};

int main()
{
Pizza pizza = Pizza("Test", 99);
Pizza tizza = pizza;
tizza = pizza;
pizza.display();
tizza.display();
}

Нижняя линия: Конструктор копирования, конструктор перемещения, оператор присваивания наиболее целесообразен, только если в классе есть нестатические члены-данные.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector