У меня есть некоторые сомнения по поводу конструктора копирования и оператора присваивания.Я знаю, что когда я определяю конструктор, конструктор по умолчанию не синтезируется компилятором.Я сомневаюсь, что можно определить только конструктор копирования.Я бы сказал нет, поскольку, если я определю конструктор копирования, конструктор по умолчанию не синтезируется, поэтому я не могу инициализировать объекты, потому что мне нужен объект этого класса, которого у меня нет.Я не знаю, правильно ли это.Мое второе сомнение связано со значением-реализацией класса, содержащего указатель.Каждый код, который я видел до сих пор, использует оператор new внутри оператора копирования и присваивания.Например:
#include <string>
#include <vector>
#include "book.hh"
class Student
{
std::string name;
unsigned int id;
unsigned int age;
char gender;
std::vector<Book> * books;
/*Copy-constructor*/
Student (const Student & other)
{
name = other.name;
id = other.id;
age = other.age;
gender = other.gender;
books = new std::vector<Book> (*other.books);
}
/*Assignment operator*/
Student & operator = (const Student & other)
{
if (this != &other)
{
name = other.name;
id = other.id;
age = other.age;
gender = other.gender;
delete books;
books = new std::vector<book> (*other.books);
}
return *this;
}
}
В документе говорится, что конструктор должен быть реализован.Что насчет конструктора?Как я могу создать экземпляр класса, не имея конструктора (который не является конструктором копирования), в этом случае?Более того, я не понимаю, почему он использует new в конструкторе копирования и в операторе присваивания.Я бы сделал, например, в теле оператора присваивания, * books = * (other.books);это тоже правильно?