Функции C ++, принимающие значения, где они должны принимать ссылки

StackOverflow https://stackoverflow.com/questions/2323627

Вопрос

Я только изучаю 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 (когда у вас большой объект и копирование будет дорогостоящим) и возвращать ссылки или, что лучше всего, передавать указатели.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top