Различные способы вызова функций C ++ - PullRequest
4 голосов
/ 25 октября 2011

Я знаю, что это очень простой вопрос, но после нескольких поисков в Google и перехода по нескольким ссылкам я все равно не смог найти ответ.

Мой вопрос: в чем разница между "." И "->" в вызове функций на языке C ++?

Например, у меня есть программа с 2 различными структурами данных. Семафор ааа; List bbb;

Чтобы использовать функцию на семафоре, я должен сделать aaa.P (); но в списке я должен сделать List-> append (object);

Я не совсем понимаю, почему Семафор использует .P (), тогда как List использует -> append () когда семафор - это просто структура данных, содержащая целое число и список.

Ответы [ 6 ]

4 голосов
/ 25 октября 2011

Используйте оператор ., когда вы получаете доступ к членам, используя сам объект, или ссылку на объект.

struct Foo
{
  void bar() {}
};

Foo foo;
Foo& fooref = foo;

foo.bar();
fooref.bar();

Используйте оператор ->, когда вы получаете доступ к члену черезуказатель на объект.Продолжая приведенный выше пример

Foo *fooptr = &foo;

fooptr->bar();
(*fooptr).bar();  // same as preceding line
4 голосов
/ 25 октября 2011

На поверхности:

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

Дополнительная информация:

Переменная . не может быть перегружена, но -> может быть перегружена для классов (не указательных типов).Возвращаемое значение оператора -> является результатом применения оператора -> до достижения типа указателя.

Обратите внимание, что невозможно сделать с последовательностью разыменования-после выполнения операций доступа к члену (попробуйте и посмотрите), , хотя оператор * (разыменование) перегружен.Это связано с тем, что вам нужно «зациклить» результат вычисления возвращаемого типа из -> при времени компиляции , что невозможно сделать вручную.Это полезно для создания прокси объекта, который ведет себя как указатель на объект.

2 голосов
/ 25 октября 2011

В Foo.Bar(), Foo - это объект класса, который имеет Bar().

В Foo->Bar(), Foo - это указатель на объект, имеющий Bar().

Вопрос не в том, какой класс использует какой оператор, а в том, какой оператор использовать в зависимости от контекста.

1 голос
/ 25 октября 2011

. означает доступ к элементу внутри объекта (для обеих функций и ).-> то же самое, но использует указатель на объект.

Например:

struct abc { int xyz; } a;
struct abc *pointer_to_a = &a;
a.xyz = 271828;                  // manipulates the object directly.
pointer_to_a->xyz = 314159;      // manipulates the object through a pointer.
0 голосов
/ 25 октября 2011

Что касается вашего исходного вопроса, причина разницы в том, что Semaphore является типом класса, а List является типом указателя. Это факт о вашей конкретной программе, а не о языке. Скорее всего, есть некоторые typedef, делающие эту структурную особенность вашей программы не очевидной сразу.

0 голосов
/ 25 октября 2011

В дополнение к тому, что говорили другие, foo->bar() - это то же самое, что и (*foo).bar(). Это просто стенография и удобная запись. Это если оператор -> не перегружен для foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...