Мой вопрос:
Почему класс работает правильно? Не показывая каких-либо ошибок?
Я ожидал сбой или сбой, например, вывод значений мусора.
‘
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
Похоже, я нашел причину:
Благодаря @ Игорь Тандетник, он упомянул то же самое в комментарии в тот же день, когда был задан вопрос. Однако, так как комментарий был кратким, и я все еще на стадии изучения, я не смог получить полную картину из комментария. Поэтому решил написать ответ с небольшим объяснением. Что будет полезно для таких, как я, когда-нибудь :).
Причина:
— Я не использую никаких членов данных в классе.
— Я использую только метод класса в приведенном выше коде. Поскольку все объекты используют одни и те же методы класса (т.е. методы класса для каждого класса, а не для объекта.)
— Основным мотивом конструктора копирования является копирование элементов данных из одного объекта класса в другой объект.
— Я не объявил ни одного нестатического члена данных для класса, который создается для объекта. Объявление нестатических членов для вышеупомянутого наверняка приведет к неопределенному поведению класса. Такие члены данных имеют значения мусора.
— Следовательно, приведенный выше код прекрасно работает с некорректным конструктором копирования и оператором присваивания перемещения.
Ниже приведен код, который будет давать значения мусора для членов данных из-за неправильного оператора присваивания и конструктора копирования.
//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();
}
Нижняя линия: Конструктор копирования, конструктор перемещения, оператор присваивания наиболее целесообразен, только если в классе есть нестатические члены-данные.
Других решений пока нет …