// конструктор копии для класса 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
// перегруженная операция присваивания;
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=
Извините за глупые вопросы, я просто новичок
в 29 строке нужно добавить &
, иначе при передаче параметра в функцию, нужно будет сделать копию объекта. А для этого нужно будет вызвать эту же функцию, которой в свою очередь нужно будет сделать ровно то же самое.
Array::Array( const Array& fiarrayToCopy )
Самопроисваиваение, это когда так
a = a;
В некоторых случаях это не страшно, но обычно это приводит к всяким неприятоностям (особенно, если память выделяется/удаляется).
И как в строке 69 *this позволяет писать x = y = z?
попробуйте поменять сигнутуру функции на void. компилятор сразу все расскажет:)
Код x = y = z
превращается в
x.operator=(y.operator=(z))
По поводу оператора 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
Ну или как ее умудрились перевести на русский "Вопросы И технологии безопасности исключений" - в книге "Решение сложных задач на С++" Герб Саттер
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть двумерный вектор std::vector< std::vector < int> > vecInt1Как задать и изменить кол-во элементов в строке и столбце во время исполнения программы?...
Выполнял задание, встал перед вопросом, все выполнено, но необходима проверка вводаПолучилось следующее
Допустим вам требуется вручную выровнять все поля структуры по 4 байтаВыглядит это примерно так: