#cpp
У меня есть код, с двумя вариантами, первый который работает с оператором a.first и второй который работает с оператором a->first для меня разницы нету, использовать первый или второй вариант. Но в википедии написано что оператор a->b перегружаемый, какая будет разница между a.b, если это будет работать с циклами. Я хочу знать точно a.b лучше будет чем a->b или значение не имеет?
Ответы
Ответ 1
Как это - "нет разницы"? Первое работает с самим объектом (ссылкой), второе - с указателем. Типа struct A { int b; } a, * ptr; Вы не сможете работать с a->b, как и с ptr.b - только a.b и ptr->b или (*ptr).b. Если вы не переопределяете оператор -> - то разницы никакой, это просто варианты записи одного и того же...Ответ 2
a->b подразумевает (*a).b То есть -> используется, если у нас есть указатель на объект и мы хотим получить его поле.Ответ 3
Вы говорите "У меня есть код, с двумя вариантами,... " Нам неизвестно какой код у вас имеется. Например, если у меня(у вас) имеется такие структуры: struct B { int first = 5; }; struct A { B b; int first = b.first + 1; B* operator->() { return &b; } }; то вполне можно записать два варианта одного и того же кода: A a; //первый вариант int version1() { //... return a.first - 1; } // второй вариант int version2() { //... return a->first ; } Результатом первой функции является значение first из структуры A(A::first == B::first` == 6) минус 1. Результатом второй функции будет уже B::first == 5. Оба варианта будут работать с тем же значением, содержащимся в разных обьектах. Так что, все таки, выражения a.first и a->first могут существовать одновременно и иметь разный результатОтвет 4
Перегрузка -> имеет смысл когда объект подразумевает абстрактную ссылку на что-то. # includeclass Int { public: int i; }; template < class T > class Link { public : Link ( T & t ):secret(&t){} T * operator -> (void) { return secret ; } private : T * secret ; }; void f ( Link l ) { l->i = 7 ; } int main(){ Int i; f(i); std::cout<<"i.i="<
Комментариев нет:
Отправить комментарий