Рубрики

Проверка самостоятельного назначения в операторе назначения

В C ++ оператор присваивания должен быть перегружен самопроверкой проверки.

Например, рассмотрим следующий класс Array и перегруженную функцию оператора присваивания без проверки самопредставления.

// Пример класса

class Array {

 private:

   int *ptr;

   int size;

 public:

   Array& operator = (const Array &rhs);

   // конструкторы и другие функции класса ........

};

  
// перегруженный оператор присваивания для класса Array (без self
// проверка назначения)

Array& Array::operator = (const Array &rhs)

{

  // Освободить старую память

  delete [] ptr;

  

  // выделить новое пространство

  ptr = new int [rhs.size];

  

  // копировать значения

  size = rhs.size;

  for(int i = 0; i < size; i++)

    ptr[i] = rhs.ptr[i];

  

  return *this

}

Если у нас есть объект, скажем, a1 типа Array, и если у нас где-то есть строка, похожая на a1 = a1 , программа приводит к непредсказуемому поведению, поскольку в приведенном выше коде нет проверки самоназначения. Чтобы избежать вышеупомянутой проблемы, должна выполняться проверка самоназначения при перегрузке оператора присваивания. Например, следующий код выполняет проверку самоназначения.

// перегруженный оператор присваивания для класса Array (с self
// проверка назначения)

Array& Array::operator = (const Array &rhs)

{

  / * ПРОВЕРКА САМОУПРАВЛЕНИЯ * /

  if(this != &rhs)

  {

    // Освободить старую память

    delete [] ptr;

  

    // выделить новое пространство

    ptr = new int [rhs.size];

  

    // копировать значения

    size = rhs.size;

    for(int i = 0; i < size; i++)

      ptr[i] = rhs.ptr[i];    

  }  

  

  return *this

}

Ссылки:
http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Проверка самостоятельного назначения в операторе назначения

0.00 (0%) 0 votes