c ++ подписи, указатели - PullRequest
1 голос
/ 05 апреля 2010

в чем разница между этими подписями?

<code>
T * f(T & identifier);
T & f(T & identifier);
T f(T & identifier);</p>

<p>void f(T * identifier);
void f(T & identifier);
void f(T identifier);
Я встретил указатели в c, но амперстенд в сигнатуре функции является новым для меня. Кто-нибудь может объяснить это?

Ответы [ 2 ]

3 голосов
/ 05 апреля 2010

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

int i = 4;
int& refi = i;  // reference to i
int* ptri = &i; // pointer to i

refi = 6;  // modifies original 'i', no explicit dereferencing necessary
*ptri = 6; // modifies through the pointer

Ссылки имеют много общего с указателями, но они проще в использовании и менее подвержены ошибкам, если адресная арифметика не нужна. Кроме того, в отличие от указателей, ссылки не могут быть восстановлены для «указания» на другой объект после их инициализации. Просто спросите в Google ссылки и указатели в C ++.

1 голос
/ 05 апреля 2010

T * f(T & identifier);
Это функция, которая берет ссылку на T и возвращает указатель на T.

T & f(T & identifier);
Это функция, которая принимает ссылку на T и возвращает ссылку на T.

T f(T & identifier);
Этот берет ссылку на T и возвращает копию T.

void f(T * identifier);
Этот берет указатель на T и ничего не возвращает.

void f(T & identifier);
Этот берет ссылку на T и ничего не возвращает.

void f(T identifier);
Этот принимает значение T (копии) и ничего не возвращает.

Ссылки ведут себя почти точно так же, как указатели, за исключением того, что ссылка никогда не будет установлена ​​в NULL, а ссылка неявно создается и разыменовывается для вас, поэтому вам не нужно иметь дело с синтаксисом указателя при вызове функции или внутри функции .

...