Что я могу использовать вместо оператора со стрелкой, `->`? - PullRequest
97 голосов
/ 21 октября 2008

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

Ответы [ 7 ]

126 голосов
/ 21 октября 2008

Следующие два выражения эквивалентны:

a->b

(*a).b

(при условии перегрузки операторов, как упоминает Конрад, но это необычно).

66 голосов
/ 21 октября 2008

a->b обычно является синонимом (*a).b. Скобки здесь необходимы, потому что сила связывания операторов * и .: *a.b не будет работать, потому что . связывается сильнее и выполняется первым. Таким образом, это эквивалентно *(a.b).

Остерегайтесь перегрузки, так как: -> и * могут быть перегружены, их значение может существенно различаться.

41 голосов
/ 21 октября 2008

Язык C ++ определяет оператор стрелки (->) как синоним для разыменования указателя, а затем использует оператор . для этого адреса.

Например:

Если у вас есть объект anObject и указатель aPointer:

SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;

Чтобы иметь возможность использовать один из методов объектов, вы разыменовываете указатель и выполняете вызов метода по этому адресу:

(*aPointer).method();

Что можно написать с помощью оператора со стрелкой:

aPointer->method();

Основная причина существования оператора со стрелкой заключается в том, что он сокращает типизацию очень распространенной задачи, а также позволяет легко забыть скобки вокруг разыменования указателя. Если вы забыли круглые скобки, оператор. -C связывает сильнее, чем * -operator, и заставляет наш пример выполняться как:

*(aPointer.method()); // Not our intention!

В некоторых других ответах также упоминается, что операторы C ++ могут быть перегружены и что это не так часто.

15 голосов
/ 06 ноября 2010

В C ++ 0x оператор получает второе значение, указывающее тип возвращаемого значения функции или лямбда-выражения

auto f() -> int; // "->" means "returns ..."
13 голосов
/ 21 октября 2008

Я в основном читаю это справа налево и звоню "в"

foo->bar->baz = qux->croak

становится:

"Баз в баре в foo становится кваком в qux."

0 голосов
/ 08 мая 2019

Вы можете использовать -> для определения функции.

auto fun() -> int
{
return 100;
}

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

0 голосов
/ 08 марта 2019

-> используется при доступе к данным, на которые у вас есть указатель.

Например, вы можете создать указатель ptr на переменную типа int intVar следующим образом:

int* prt = &intVar;

Затем вы можете использовать функцию, такую ​​как foo, только для разыменования этого указателя - для вызова функции в переменной, на которую указывает указатель, а не в числовом значении ячейки памяти этой переменной:

(*ptr).foo();

Без скобок здесь компилятор будет понимать это как *(ptr.foo()) из-за приоритета оператора, а это не то, что нам нужно.

На самом деле это то же самое, что набирать

ptr->foo();

Поскольку -> разыменовывает этот указатель, он вызывает функцию foo() для переменной, на которую указывает указатель.

Аналогичным образом, мы можем использовать -> для доступа или установки члена класса:

myClass* ptr = &myClassMember;
ptr->myClassVar = 2; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...