Napisałem klasę z przeładowanymi konstruktorami i operatorami przypisania, czy mogę ją jakoś ulepszyć?
- Czy są sytuacje kiedy nie pisze się
Example& operator=
tylkoExample operator=
? - Czy zawsze trzeba pisać instrukcję
if (this != &ex)
?
class Example
{
private:
size_t size;
int *tab;
public:
Example() = default;
Example(size_t size) : size(size), tab(new int[size])
{
std::cout << "Constructor!" << std::endl;
std::iota(tab, tab + size, 1);
}
~Example()
{
std::cout << "Destructor!" << std::endl;
delete[] tab;
}
Example(const Example& ex)
{
std::cout << "Copy Constructor!" << std::endl;
size = ex.size;
tab = new int[size];
std::copy(ex.tab, ex.tab + ex.size, tab);
}
Example& operator=(const Example& ex)
{
std::cout << "Copy Assignment Operator!" << std::endl;
if (this != &ex)
{
delete[] tab;
size = ex.size;
tab = new int[size];
std::copy(ex.tab, ex.tab + ex.size, tab);
}
return *this;
}
Example(Example&& ex)
{
std::cout << "Move Constructor!" << std::endl;
if (this != &ex)
{
size = ex.size;
tab = new int[size];
std::copy(ex.tab, ex.tab + ex.size, tab);
delete[] ex.tab;
ex.size = 0;
ex.tab = nullptr;
}
}
Example& operator=(Example&& ex)
{
std::cout << "Move Assignment Operator!" << std::endl;
if (this != &ex)
{
size = ex.size;
tab = new int[size];
std::copy(ex.tab, ex.tab + ex.size, tab);
delete[] ex.tab;
ex.size = 0;
ex.tab = nullptr;
}
return *this;
}
};