Intereting Posts
как я могу узнать, не вызвал ли calloc инициализацию Стандартизирует ли стандарт C, что платформы не должны определять поведение, выходящее за frameworks, указанные в стандарте Программирование сокета для начинающих в C C macro: #if проверить равенство как передать массив указателей указателей на функцию? По умолчанию в корпусе коммутатора как преобразовать значение байта в int в объекте-c c – realloc () преуспевает в Windows 7, но не работает в Windows XP, почему? Почему не возникает segmentation fault, когда strcpy () вызывает переполнение буфера? Получение битов одиночной точности IEEE для поплавка Как создать эскиз для некоторых страниц PDF-файла? C: как бы я написал функцию поиска для поиска соответствия в массиве struct и возвращал (печатал) всю структуру, которую он сопоставлял? Как преобразовать шестнадцатеричное значение, содержащееся в символе (байт), в целое число? Использование функции C в Objective-C (для iPhone) Как вызвать lib, написанный на C ++ с C?

почему вы должны указать ключевое слово const в перегрузках оператора

Просто интересно, почему параметр должен быть const при перегрузке

CVector& CVector::operator= (const CVector& param) { x=param.x; y=param.y; return *this; } 

не могли бы вы легко сделать что-то подобное?

 CVector& CVector::operator= (CVector& param) //no const { x=param.x; y=param.y; return *this; } 

Разве нет, когда что-то становится константой, оно остается неизменным для остальной части приложений? Как это отличается от перегрузки?

Параметр const является const во всей используемой ему функции, он не изменяет его константу вне ее.

В этом случае вы хотите объявить аргумент const, чтобы ваш оператор присваивания принимал как неконстантные переменные, так и константные переменные; последний случай, в частности, включает результат выражений, который является временной константной переменной и которую вы обычно хотите поддерживать в назначениях.

Вам не нужна константа:

@ numerical25: Просто интересно, почему параметр должен быть const при перегрузке операции

Это не требуется, но это хорошее дизайнерское решение.

См. Стандарт C ++ Раздел 12.8-9:

Оператор присваивания пользователем X :: operator = – это нестатическая неclassическая функция-член classа X с точно одним параметром типа X, X &, const X &, volatile X или const volatile X &


Я думаю, что это хорошая идея:

Использование параметра const кажется мне логичным конструктивным решением, хотя вы хотите, чтобы другое значение не изменилось.

Он говорит другим людям, которые используют ваш class, что вы не будете изменять other значение, когда вы говорите что-то вроде: myObject = other; и он обеспечивает это, поэтому вы не можете случайно изменить other .

Также, если вы разрешили не const ссылки на объект в качестве параметра, то вы ограничиваете количество объектов, которые могут использовать вашу функцию. Если он const, он может использоваться для параметров, которые являются const и non const. Если ваш параметр не const, он может использоваться только параметрами, которые не являются константами.


const применяется только к текущей ссылке, а не к объекту:

@ numerical25: Разве это не то, что когда-то становится константой, она неизменна для остальной части приложений? Как это отличается от перегрузки?

Ссылка const является просто ссылкой, которая является константой. Он не изменяет константы фактического объекта, который вы проходите.


Пример неконстантной перегрузки оператора:

Вот пример перегрузки оператора, где параметр не const.
Я НЕ РЕКОМЕНДУЕТ СДЕЛАТЬ ЭТУ МЫСЛЬ:

 class B { public: const B& operator=(B& other) { other.x = 3; x = other.x; return *this; } int x; }; void main(int argc, char** argv[]) { B a; ax = 33; B b; bx = 44; a = b;//both a and b will be changed return 0; } 

Если вы использовали

 CVector& CVector::operator= (CVector& param) // no const 

затем сделал следующее:

 const CVector& my_vector = GetMyVector(); some_other_vector = my_vector; // call assignment operator - error! 

Вы получите ошибку, потому что my_vector является const CVector& и не может быть CVector& в CVector& (неконстантная ссылка). Это просто локальная ссылка на него внутри operator= function, который является const, а не всего самого объекта.

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

1) люди, вызывающие функцию, которая принимает неконстантную ссылку, не смогут вызвать ее с помощью константной переменной

2) когда у вас есть аргумент функции, который является неконстантной ссылкой, вы сигнализируете: «Я оставляю за собой право изменить это». Обычно, когда пользователь вашей функции записывает a = b ;, он не ожидает, что b изменится.

Обратите внимание, что есть третий вариант, который вы могли бы использовать для этого: pass-by-value:

 CVector& CVector::operator= (CVector param) //no reference 

Это не имеет ни одной из проблем, о которых я упоминал выше. Однако это очень неэффективно. Из-за этих трех факторов предпочтительным является передача по ссылке на-const, особенно в таких случаях, как вектор, где копирование может быть дорогостоящим.

По той же причине вы будете использовать const везде: чтобы будущие изменения в методе не случайно изменяли переданный параметр, чтобы помочь документировать интерфейс для уведомления абонентов о том, что безопасно передавать параметр без риска его изменения, и разрешить вызывающим абонентам передавать ссылки, объявленные как const в вызывающем коде.

Другая причина – разрешить конверсии. Например:

 string s = "foo"; s = "bar"; 

Здесь реализация может выбрать только предоставление оператора присваивания, который принимает константу ссылки на строку в качестве параметра и зависит от компилятора, используя конструктор для создания временной строки из char * “bar”. Это не сработает, если параметр op = не был const, поскольку вы не можете привязать временную ссылку к неконстантной ссылке.

Определитель const делает переданный параметр (в вашем примере это «const CVector & param») только для чтения. Определитель const гарантирует, что параметр (param) не изменяется внутри метода operator = ().

Без определителя константы возможно следующее:

 CVector& CVector::operator= (CVector& param) { x=param.x; y=param.y; param.x = 10; // some random value param.y = 100; return *this; } 

Вышеуказанный метод изменяет операнд правой руки «param» после присвоения значения операнду левой стороны. Определитель const поможет вам не нарушать семантику операции присваивания.