Что делает '*&' в среднем объявлении функции?

Нет никакого селектора, который даст Вам предыдущий элемент с помощью CSS..

необходимо будет использовать JavaScript для обработки то, что Вы после.

20
задан Niall 2 October 2014 в 14:40
поделиться

9 ответов

Символ & в объявлении переменной C ++ означает, что это ссылка .

Это ссылка на указатель, который объясняет семантику, которую вы видите; вызываемая функция может изменить указатель в вызывающем контексте, поскольку у него есть ссылка на него.

Итак, повторюсь, «рабочий символ» здесь не * & , сама по себе эта комбинация ничего не значит. * является частью типа myStruct * , то есть «указатель на myStruct », а & делает его ссылкой, поэтому вы бы прочитали это как « out - это ссылка на указатель на myStruct ».

На мой взгляд, исходный программист мог бы помочь, написав это как:

void myFunc(myStruct * &out)

или даже (не мой личный стиль, но, конечно, все еще актуален):

void myFunc(myStruct* &out)

Конечно, есть много других мнений о стиле. :)

36
ответ дан 29 November 2019 в 22:38
поделиться

В C и C ++ & означает вызов по ссылке; вы позволяете функции изменять переменную. В этом случае ваша переменная является указателем на тип myStruct. В этом случае функция выделяет новый блок памяти и назначает его вашему указателю «data».

Раньше (скажем, K&R) это приходилось делать, передавая указатель, в данном случае указатель на указатель или **. Оператор ссылки обеспечивает более читаемый код и более строгую проверку типов.

13
ответ дан 29 November 2019 в 22:38
поделиться

Похоже, вы повторно реализуете конструктор!

Почему бы просто не создать соответствующий конструктор?
Обратите внимание, что в C ++ структура похожа на класс (у нее может быть конструктор).

struct myStruct
{
    myStruct()
        :field1(1)
        ,field2(2)
    {}
};

myStruct*  data1 = new myStruct;

// or Preferably use a smart pointer
std::auto_ptr<myStruct>   data2(new myStruct);

// or a normal object
myStruct    data3;
6
ответ дан 29 November 2019 в 22:38
поделиться

Возможно, стоит объяснить, почему это не & * , а наоборот. Причина в том, что объявления строятся рекурсивно, и поэтому ссылка на указатель создается как

& out // reference to ...
* (& out) // reference to pointer

. Скобки опускаются, поскольку они избыточны, но они могут помочь вам увидеть шаблон. (Чтобы понять, почему они избыточны, представьте, как это выглядит в выражениях, и вы заметите, что сначала адрес берется, а затем разыменовывается - это тот порядок, который нам нужен, и круглые скобки не меняются). Если вы измените порядок, вы получите

* out // pointer to ...
& (* out) // pointer to reference

Указатель на ссылку недопустим. Поэтому порядок * & , что означает «ссылка на указатель».

6
ответ дан 29 November 2019 в 22:38
поделиться

Как уже говорили другие, & означает, что вы вводите ссылку на фактическую переменную в функцию, а не на ее копию. Это означает, что любые изменения, внесенные в переменную в функции, влияют на исходную переменную. Это может особенно сбивать с толку, когда вы передаете указатель, который уже является ссылкой на что-то еще. В случае, если ваша сигнатура функции выглядела так

void myFunc(myStruct *out);

, могло бы произойти то, что вашей функции будет передана копия указателя для работы. Это означает, что указатель будет указывать на то же самое, но будет другой переменной. Здесь любые изменения, внесенные в * out (то есть, на что указывает out), будут постоянными, но изменения, внесенные в out (сам указатель), будут применяться только внутри myFunc . С помощью такой подписи

void myFunc(myStruct *&out);

вы объявляете, что функция будет использовать ссылку на исходный указатель. Теперь любые изменения, внесенные в переменную указателя out , повлияют на исходный указатель, который был передан.

При этом строка

out = new myStruct;

изменяет переменную указателя out и не * из . Все, что использовалось для указания out , все еще живо и хорошо, но теперь в куче был создан новый экземпляр myStruct, а out был изменен, чтобы указывать на него.

строка

out = new myStruct;

изменяет переменную указателя на выход , а не на * out . Все, что использовалось для указания out , все еще живо и хорошо, но теперь в куче был создан новый экземпляр myStruct, а out был изменен, чтобы указывать на него.

строка

out = new myStruct;

изменяет переменную указателя на выход , а не на * out . Все, что использовалось для указания out , все еще живо и хорошо, но теперь в куче был создан новый экземпляр myStruct, а out был изменен, чтобы указывать на него.

3
ответ дан 29 November 2019 в 22:38
поделиться

В C ++ это ссылка на указатель, своего рода эквивалент указателя на указатель в C, поэтому аргумент функции назначается.

3
ответ дан 29 November 2019 в 22:38
поделиться
2
ответ дан 29 November 2019 в 22:38
поделиться

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

myStruct *&out

out ] - ссылка ( & ) на указатель ( * ) на объект myStruct . Это должна быть ссылка, потому что вы хотите изменить то, на что указывает out (в данном случае

2
ответ дан 29 November 2019 в 22:38
поделиться

MyClass * & MyObject

Здесь MyObject - это ссылка на указатель MyClass. Таким образом, вызов myFunction (MyClass * & MyObject) является вызовом по ссылке, мы можем изменить MyObject, который является ссылкой на указатель. Но если мы сделаем myFunction (MyClass * MyObject), мы не сможем изменить MyObject, потому что он вызывается по значению, Он просто скопирует адрес во временную переменную, чтобы мы могли изменить значение, где MyObject указывает, но не MyObject.

, поэтому в этом случае писатель сначала присваивает новое значение out, поэтому необходим вызов по ссылке.

1
ответ дан 29 November 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: