Насколько мне известно, в первой строке метода is_equal будет создан другой объект (c), но атрибут arr будет указывать на те же данные исходного объекта.
Нет, не будет. Нет такой вещи, как создание мелкой копии фиксированного массива. Элементы массива в this
будут скопированы в массив в новом объекте c
. Так же, как элементы любого объекта Stack
, который вы передаете в is_equal()
, будут скопированы в массив в параметре s
, поскольку вы передаете его по значению .
Если вы действительно хотите поделиться массивом, вам необходимо динамически выделить массив с помощью new[]
или std::malloc()
, а затем Stack
сохранить указатель на массив. Копирование указателя с одного объекта на другой даст вам семантику мелкой копии, о которой вы думаете.
Таким образом, извлечение данных из c повлияет на исходную сумму стека.
Нет, не будет, потому что c
имеет свой собственный массив, который не зависит от массива в s
или this
.
Адрес arr стека c отличается от адреса arr исходного стека
Правильно. Потому что они являются отдельными массивами в памяти.
данные копируются правильно, как будто я перегружен оператором присваивания.
Да, потому что вы не реализовали свой собственный конструктор копирования или оператор присваивания копии, поэтому компилятор неявно реализовал их для вас. Неявная реализация скопирует элементы массива из массива исходного объекта в массив целевого объекта.
И кстати, ваш is_equal()
может быть реализован без необходимости делать какие-либо копии:
class Stack {
private:
int arr[1000];
int size;
public:
...
bool is_equal(const Stack &s) const {
if (size != s.size)
return false;
for (int i = 0; i < size; ++i) {
if (arr[i] != s.arr[i])
return false;
}
return true;
}
...
};
Или просто:
#include <algorithm>
class Stack {
private:
int arr[1000];
int size;
public:
...
bool is_equal(const Stack &s) const {
// pre-C++14...
return (size == s.size) && std::equal(arr, arr + size, s.arr);
// C++14 and later...
return std::equal(arr, arr + size, s.arr, s.arr + s.size);
}
...
};