Вопрос про реализацию массива

215
29 сентября 2017, 18:58
  1. А где тут он возвращает ссылку и почему должна быть бесконечная рекурсия?
// конструктор копии для класса Array;
28 // для предотвращения бесконечной рекурсии должен возвращать ссылку
29 Array::Array( const Array &arrayToCopy )
30 : size( arrayToCopy.size )
31 {
32  ptr = new int[ size ] ; // выделить пространство для массива
33
34  for ( int i = 0; i < size; i++ )
35   ptr[ i ] = arrayToCopy.ptr[ i ]; // копировать в объект
36 } // конец конструктора копии Array
  1. Тут в 54 строке this это ссылка что сравнивает? И this не указатель на текущий объект, причем тут самоприсваивание? В каком смысле предотвращает (а1 = a2) = a3? И как в строке 69 *this позволяет писать x = y = z?
 // перегруженная операция присваивания;
    51 // возвращаемая константа предотвращает: ( al = а2 ) = аЗ
    52 const Array & Array::operator=( const Array &right )
    53 {
    54 if ( &right != this ) // избегать самоприсваивания
    55 {
    56 // для массивов разного размера освободить исходный массив
    57 //в левой части, затем выделить новый массив для левой части
    58 if ( size != right.size )
    59 {
    60 delete [] ptr; // освободить пространство
    61 size = right.size; // переустановить размер этого объекта
    62 ptr = new int[ size ]; // создать пространство для копии
    63 } // конец внутреннего if
    64
    65 for ( int i = 0; i < size; i++ )
    66 ptr[ i ] = right.ptr[ i ]; // копировать массив в объект
    67 } // конец внешнего if
    68
    69 return *this; // позволяет писать, например, х = у = z
    70 } // конец функции operator=

Извините за глупые вопросы, я просто новичок

Answer 1

в 29 строке нужно добавить &, иначе при передаче параметра в функцию, нужно будет сделать копию объекта. А для этого нужно будет вызвать эту же функцию, которой в свою очередь нужно будет сделать ровно то же самое.

Array::Array( const Array& fiarrayToCopy )

Самопроисваиваение, это когда так

a = a;

В некоторых случаях это не страшно, но обычно это приводит к всяким неприятоностям (особенно, если память выделяется/удаляется).

И как в строке 69 *this позволяет писать x = y = z?

попробуйте поменять сигнутуру функции на void. компилятор сразу все расскажет:)

Код x = y = z превращается в

x.operator=(y.operator=(z))
Answer 2

По поводу оператора new http://en.cppreference.com/w/cpp/memory/new/operator_new

throws std::bad_alloc or another exception derived from std::bad_alloc (since C++11) on failure to allocate memory

Поэтому функции следует реализовывать, по возможности так:

  • Подготовительные операции (могут приводить к исключениям, не меняют состояния объекта).

  • Изменение состояния объекта, используя данные первого этапа (используются операции не приводящие к исключениям)

  • возврат результата (не должен приводить к исключениям)

  • разрушения временных объектов (не должны приводить к исключениям).

Пример

const Array & Array::operator=(const Array &right)
{
    Array temp(right); //can throw - no change to this yet
    swap(temp); //noexcept
    return *this; //returning reference - cannot throw
}//destructor of temp - has to be noexcept
void Array::swap(Array &right) noexcept
{
    std::swap(size, right.size);//noexcept
    std::swap(ptr, right.ptr);//noexcept
}

Подробнее я бы порекомендовал почитать "Exception-Safety Issues and Techniques" в книге Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions By Herb Sutter

Ну или как ее умудрились перевести на русский "Вопросы И технологии безопасности исключений" - в книге "Решение сложных задач на С++" Герб Саттер

READ ALSO
Изменение размера двумерного вектора

Изменение размера двумерного вектора

Есть двумерный вектор std::vector< std::vector < int> > vecInt1Как задать и изменить кол-во элементов в строке и столбце во время исполнения программы?...

323
Проверка ввода цифр

Проверка ввода цифр

Выполнял задание, встал перед вопросом, все выполнено, но необходима проверка вводаПолучилось следующее

228
Замена не экспортируемой функции C++

Замена не экспортируемой функции C++

Дано: Главный mainexe файл, вызывающий библиотеку libs

228
Выравнивание структур вручную

Выравнивание структур вручную

Допустим вам требуется вручную выровнять все поля структуры по 4 байтаВыглядит это примерно так:

289