Что я могу использовать вместо оператора стрелки, `->`?

Что означает оператор стрелки (->) синоним для?

Ответ 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;
}

Это не лямбда. Это действительно функция. "->" указывает тип возвращаемого значения функции.