Step 2 (S-11063)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/559/step/2

Step 2 (S-11063) 1.png

[00:00 - 00:18] в данном сегменте мы поговорим о правилах перевозки некоторых операторов по правилам есть понимание что то обязательно а скорее правило хорошего тона я расскажу о том как естественно логично город некоторые операторы и мы также обсудим зачем стоит особенно следить


[00:18 - 00:34] при перегрузке операторов начнем мы с перегрузки бинарных арифметических и битвах оператор в которых есть короткая например + + равно рассмотрим это на примере класса строки пусть есть


[00:34 - 00:49] класс строки и для этого класса мы хотим определить оператор склеивания строк оператор конкатенации на танцевать а и будем выражать это при помощи оператора + перегноем оператора +


[00:49 - 01:06] предлагаю перегрузить этот оператор + при помощи внешней функции реализовать его при помощи короткая версия то оператора то есть оператор + равно а сам оператор + равно реализовать


[01:06 - 01:23] внутри класса как метод дать объясни почему разумно реализовывать оператор при все равно внутри класса дело в том что внутри данного оператора мы меняем левый аргумент меняем значение некоторых уже существующего объекта


[01:23 - 01:41] таракана к ней что то прибавляем ты записываешь для изменения этого объекта нам нужно получить доступ к его внутренним полям это намного удобнее естественно делать прямо внутри нет теперь давайте я объясню почему разумно реализовывать


[01:41 - 01:59] обычной версии оператора то есть просто катер + снаружи как внешний фонт ну во 1 как ведь это получается довольно коротко и такая реализация будет работать для любого оператора при условии что вы определили его короткую версию


[01:59 - 02:15] но есть еще и некоторый дополнительный бонус давайте сравним окуривали 26 реализации которые можно было бы сделать то есть если бы мы определили оператор + как метод принципе это можно было сделать есть вот


[02:15 - 02:33] заключительном коде написано как бы выглядел оператор + есть метод давайте сравним оказывается что если мы реализуем такой оператор + как метод то при вызове оператор не будет работать при ведении или в аргумента что это значит


[02:33 - 02:50] пусть у нас есть некоторое строка 1 которая хранит слово world и мы хотим составить фразу hello world для этого мы переменную с 2 и записываем в нее конкатенацию 2 трубочек hello с пробелом собственно


[02:50 - 03:09] строки слово при этом покрытие левом аргументом оператора + здесь является строка в стиле c то есть обычный чар кон звездочка почему я ожидаю что это все скомпилировать но дело в том что у нашего класса строки есть конструктор


[03:09 - 03:27] от 1 параметра параметры типа чарку звездочка а таких конструкторов сдает привидение от типа свой аргумент как диктовка которое конструкторами то есть этот конструктор он задает привидение от строки к строке


[03:27 - 03:45] которым определять поэтому оператор + которые мы определили он может быть вызван данном случае при этом для вызывает в оператор потребуется привести левой аргумент код и значению типы стрижек и это будет вызвано просто


[03:45 - 04:05] конструктор то 1 аргумента недавно передает можно увидеть если же данный оператор + реализовать при помощи метода для вызова метода нужно чтобы лего аргумент был уже существует то есть э


[04:05 - 04:21] так как метод называется в некоторых объектов для того чтобы вызвать этот метод нужно чтобы этот объект рассуждал о в данном случае при вызове оператора + лего объекта еще не существует для того чтобы он появился надо сначала вызвать а


[04:21 - 04:39] конструктор который приведет аргумент типа строка к строке которая определяет поэтому если мы будем определять оператор + внутри то данная точка не скомпилируется если мы определим оператор + снаружи то все будет хорошо работать и компилироваться


[04:39 - 04:56] если у тебя аргументы достали то будет работать то есть и в том случае если например него снаружи и внутри но для такой работы требуется чтобы оператор + было реализовано


[04:56 - 05:10] так как это удобно естественно то разумно определять такие бинарные операторы как внешних функций еще хочется обратить внимание на то как я конкретно реализовал температура +


[05:10 - 05:26] заметьте что 1 аргумент то оператора + передаются по значению а 2 по константной ссылке 2 место по константной ссылке для того чтобы сэкономить на копировать то есть есть не происходит копирование строки почему же 1 аргумент передал


[05:26 - 05:44] не по константной ссылке можно было бы передать а по константной ссылке но тогда для того чтобы внутри вызвать у какого то значение типа строки оператор + равно мне потребовалось бы скопировать 1 аргумент и то есть я скопировал и аргумент после это вызвало бы не оператора + равно и верну обозначения


[05:44 - 05:59] для того чтобы сэкономить на коде ну то есть чтобы не писать код который потребуется писать можно скопировать этот 1 аргумент при передаче функцию поэтому естественной и удобно и


[05:59 - 06:15] принимать 1 аргумент таком операторе по значению тогда в тот момент эта функция будет вызвана 1 оператор 1 операнд уже скопируется и дальше осталось вызвать оператор + равно


[06:15 - 06:32] и вернуть значение которое вернет оператор прислала важно отметить что данный код будет работать и для других операторов при условии что мы перегрузили короткую то есть если эти заменю + на умножить то


[06:32 - 06:46] это будет единственным меня который потребуется для того чтобы заставить работать оператором умножения при условии того что уже реализовано оператор умножения короткой версию внутри класса как метод