Функции C ++, принимающие значения, где они должны принимать ссылки
-
22-09-2019 - |
Вопрос
Я только изучаю c ++, и, исходя из c, некоторые вызовы функций, которые я вижу в книге, сбивают меня с толку:
char a;
cin.get(a);
В C это не могло бы сработать, если бы вы это сделали, не было бы способа получить выходные данные, потому что вы передаете по значению, а не по ссылке, почему это работает в c ++?Делаются ли ссылки и разыменования неявными (компилятор знает, что cin.get нуждается в указателе, поэтому на него ссылаются)?
Решение
C++
Это сработало бы в C ++, потому что сигнатура функции для get()
вероятно, это:
void get(char& a); // pass-by-reference
В &
символ после char
обозначает компилятору, чем когда вы передаете в char
значение, оно должно передаваться в ссылка к тому char
вместо того, чтобы делать его копию.
По сути, это означает, что любые изменения, внесенные в get()
будет отражено в стоимости a
вне метода.
Если сигнатура функции для get()
было ли это:
void get(char a); // pass-by-value
тогда a
был бы пропущен мимо значение, что означает копию a
создается перед передачей в метод в качестве параметра.Любые изменения в a
тогда метод был бы только локальным и терялся бы при возврате метода.
C
Причина, по которой это не сработало бы в C, заключается в том, что C имеет только передача по значению.Единственный способ подражать передача по ссылке поведение в C заключается в передаче его указателя по значению, а затем отмене ссылки на значение указателя (таким образом, доступ к той же ячейке памяти) при изменении значения в методе:
void get(char* a)
{
*a = 'g';
}
int main(int argc, char* argv[])
{
char a = 'f';
get(&a);
printf("%c\n", a);
return 0;
}
Запуск этой программы приведет к:
g
Другие советы
Ссылочные типы работают подобным образом (передаются по ссылке, вместо передачи по значению).Это похоже на передачу указателя (pass by pointer) в C, но с более приятным синтаксисом и большей безопасностью (проверки во время компиляции).Реализация передается по внутреннему указателю.
C ++ допускает передачу по ссылке (обратите внимание на &
, что означает , что используется ссылка):
void foo(char& bar) {
bar = 42;
}
int main() {
char a;
foo(a);
// a == 42 here
}
Вот почему некоторые программисты на C ++ не любят использовать подобные ссылки.
Это похоже на аргумент функции - из синтаксиса вы понятия не имеете, изменено 'a' или нет.
Предпочитайте передавать ссылки const (когда у вас большой объект и копирование будет дорогостоящим) и возвращать ссылки или, что лучше всего, передавать указатели.