Правило трех. Конструктор копирования, реализация оператора присваивания

Правило трех. Конструктор копирования, реализация оператора присваивания

#include <iostream>
using namespace std;

class IntPart
{
public:
IntPart(); // default constructor
IntPart(int n);

private:
unsigned int* Counts;
unsigned int numParts;
unsigned int size;
};

IntPart::IntPart()
{
Counts = new int[101] (); // allocate all to 0s
numParts = 0;
}

IntPart::IntPart(int n)
{
Counts = new int[n+1] (); // allocate all to 0s
Counts[n] = 1;
numParts = 1;
}

int main ()
{
IntPart ip2(200);
IntPart ip3(100);

IntPart ip(ip2); // call default and copy constructor?

IntPart ip4; // call default constructor
ip4 = ip3;

system("pause"); return 0;
}

Очевидно, что это должно иметь правило трех.
Не могли бы вы помочь мне определить их?

Q0.

IntPart ip(ip2);

Создает ли этот один объект ip вызов конструктора по умолчанию
и после этого вызывать конструктор копирования?
Я прав?

Q1. Определить деструктор.

IntPart::~IntPart()
{ delete [] Counts; }

это правильно?

Q2. Определить конструктор копирования.

IntPart::IntPart(const IntPart& a)
{ // how do I do this? I need to find the length... size.... could anybody can do this?
}

Q3. Определить оператор присваивания.

IntPart& IntPart::operator= (const IntPart& a)
{
if ( right != a)
{
// Anybody has any idea about how to implement this?
}
return *this;
}

Спасибо,
Буду премного благодарен!

-1

Решение

Q0. Нет, это вызывает только конструктор копирования. Это довольно большое недоразумение, объекты только когда-либо построены один раз.

Q1. Правильно

Q2. Предположительно, вы должны хранить размер массива в size, Например.

IntPart::IntPart()
{
Counts = new int[101] (); // allocate all to 0s
numParts = 0;
size = 101; // save array size
}

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

Q3. Я бы посмотрел копировать и менять местами идиома. Это позволяет вам написать оператор присваивания, используя конструктор копирования.

3

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

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

По вопросам рекламы [email protected]