Операторы равенства и присваивания, используемые в массивах на С++

Мне задали вопрос о домашнем задании, который меня действительно смущает. Возникает вопрос:

В С++ тест равенства == может быть применяется к массивам, но задание operator = не может применяться к массивы. Объясните, почему.

Это меня смущает, потому что я понимаю, что оператор == просто сравнивал бы адреса первых двух элементов (что, если бы два массива фактически хранились в отдельных ячейках памяти, конечно, было бы иначе). И оператор =, когда он используется как array1 = array2;, просто заставляет array1 указывать на то же место памяти, что и массив2.

Что мне здесь не хватает? Кажется, что любой оператор может быть использован, но ни один из них не даст результатов, обычно предназначенных для этих операторов.

Ответ 1

Я понимаю, что оператор == просто сравнивает адреса первых двух элементов

Это правильно: если вы сравниваете два массива с помощью ==, он будет сравнивать адреса массивов, поэтому он будет давать только true, если вы сравниваете массив с самим собой (или с указателем на элемент один и тот же тип). Ниже приведено описание ниже.

the = operator, когда используется как array1 = array2; просто заставит массив1 указывать на ту же ячейку памяти, что и массив2.

Это неверно, потому что массив не является указателем. array1 не может указывать на ту же ячейку памяти, что и array2, потому что array1 не является указателем, это массив элементов.

Массив - это последовательность элементов. В большинстве контекстов имя массива неявно преобразуется в указатель на его исходный элемент. Вот почему вы можете делать такие вещи, как:

void f(int*);

int data[10];
int* p = data; // this is the same as 'int* p = &data[0];'
f(data);       // this is the same as 'f(&data[0]);'

array1 = array2; не будет работать, потому что массивы не назначаются (в основном по историческим причинам, я никогда не слышал убедительных технических причин, почему это не разрешено: в C не было разрешено, а C было вокруг Десятилетие. Обсуждалось это в комментариях и ответах на Почему C поддерживает членное назначение массивов внутри структур, но не в целом?).

Следующая программа не будет компилироваться:

int main() {
    int a[10], b[10];
    a = b;
}

Для "присваиваемого" массива вы можете использовать контейнер-подобный класс array, найденный в Boost (boost::array), С++ TR1 (std::tr1::array) или С++ 0x (std::array). Это фактически класс, содержащий массив; он может быть скопирован и обеспечивает многие преимущества контейнеров стандартной библиотеки, а также характеристики производительности массива и возможность использовать его данные в качестве массива, когда вам нужно.