Что означает оператор стрелки (->
) синоним для?
Что я могу использовать вместо оператора стрелки, `->`?
Ответ 1
Следующие два выражения эквивалентны:
a->b
(*a).b
(при перегрузке оператора, как упоминает Конрад, но что необычно).
Ответ 2
a->b
обычно является синонимом (*a).b
. Скобки здесь необходимы из-за силы связи операторов *
и .
: *a.b
не будет работать, потому что .
связывается сильнее и выполняется первым. Это, таким образом, эквивалентно *(a.b)
.
Остерегайтесь перегрузки: поскольку как ->
, так и *
могут быть перегружены, их значение может сильно различаться.
Ответ 3
Язык С++ определяет оператор стрелки (->
) как синоним разыменования указателя, а затем использует .
-оператор на этом адресе.
Например:
Если у вас есть объект, anObject
и указатель, aPointer
:
SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
Чтобы иметь возможность использовать один из методов объектов, вы разыскиваете указатель и выполняете вызов метода по этому адресу:
(*aPointer).method();
Что можно записать с помощью оператора стрелки:
aPointer->method();
Основная причина существования оператора стрелки состоит в том, что он сокращает типизацию очень общей задачи, а также легко забыть круглые скобки вокруг разыменования указателя. Если вы забыли скобки, оператор. Будет связывать более сильный, чем * -оператор, и сделать наш пример выполненным как:
*(aPointer.method()); // Not our intention!
В некоторых других ответах упоминается также, что операторы С++ могут быть перегружены и что это не так часто.
Ответ 4
В С++ 0x оператор получает второе значение, указывающее тип возврата функции или лямбда-выражения
auto f() -> int; // "->" means "returns ..."
Ответ 5
Я в основном читаю его справа налево и вызываю "in"
foo->bar->baz = qux->croak
становится:
"baz в bar в foo становится квакающим в qux."
Ответ 6
->
используется при доступе к данным, на которые у вас есть указатель.
Например, вы можете создать указатель ptr на переменную типа int intVar следующим образом:
int* prt = &intVar;
Затем вы можете использовать функцию, такую как foo, только для разыменования этого указателя - для вызова функции в переменной, на которую указывает указатель, а не в числовом значении ячейки памяти этой переменной:
(*ptr).foo();
Без круглых скобок компилятор будет понимать это как *(ptr.foo())
из-за приоритета оператора, а это не то, что нам нужно.
Это на самом деле так же, как печатать
ptr->foo();
Поскольку ->
разыменовывает этот указатель, и поэтому вызывает функцию foo()
для переменной, на которую указывает указатель для нас.
Точно так же мы можем использовать ->
для доступа или установки члена класса:
myClass* ptr = &myClassMember;
ptr->myClassVar = 2;
Ответ 7
Вы можете использовать ->, чтобы определить функцию.
auto fun() -> int
{
return 100;
}
Это не лямбда. Это действительно функция. "->" указывает тип возвращаемого значения функции.