Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Почему выводится значение без разыминовывание ссылки

Ущчшчшвдыдщы Ученик (154), открыт 3 недели назад
Вопрос . Если вместо функции, в код подставляется то - что она возвращает,тогда почему : int &foo(int &x) {return x},почему в данном случаи если например попытаться присвоить эту функцию переменной или вывести эту функцию то выводится значение а не ссылка ? Хотя вместо функции подставляется то что она возвращает ,с возвращает она &x,то при cout << &x должно вывестись ссылка ,но почему этого не происходит ? Мы нигде не указывали что мы ее разыминовываем
3 ответа
Никита Матвеев Знаток (471) 3 недели назад
Привет! Попробую объяснить, почему происходит то, что ты описал.

Когда ты пишешь функцию, которая возвращает ссылку, как, например:

```cpp
int& foo(int &x) {
return x;
}
```

эта функция действительно возвращает ссылку на `x`. Однако, важно понимать, как эта ссылка используется в дальнейшем.

### Пример с `cout`

Рассмотрим следующий код:

```cpp
int main() {
int a = 10;
int& ref = foo(a);

std::cout << ref << std::endl; // Выводит значение a, т.е. 10
std::cout << &ref << std::endl; // Выводит адрес a, т.е. адрес переменной a
}
```

В первом случае (`std::cout << ref`) выводится значение, на которое ссылается `ref`. То есть, значение переменной `a`, так как `ref` это ссылка на `a`.

Во втором случае (`std::cout << &ref`) выводится адрес переменной, на которую ссылается `ref`. В этом случае, это адрес переменной `a`.

### Почему выводится значение?

Когда ты пишешь просто `std::cout << foo(a);`, происходит следующее:
1. Функция `foo` вызывается и возвращает ссылку на переменную `a`.
2. Ссылка на переменную `a` интерпретируется в контексте `std::cout` как значение переменной `a`.

Таким образом, в контексте `std::cout`, если ты передаешь переменную или ссылку на переменную без оператора `&`, то выводится значение этой переменной. Это связано с тем, как устроен оператор вывода `<<` для стандартных типов данных в C++. Оператор `<<` перегружен для вывода значений, а не ссылок.

### Как вывести адрес?

Если ты хочешь вывести адрес переменной, на которую ссылается функция, то тебе нужно явно указать, что ты хочешь вывести адрес:

```cpp
std::cout << &foo(a) << std::endl;
```

Этот код выведет адрес переменной `a`, так как ты используешь оператор `&` для получения адреса.

### Подытожим

Функция `foo` действительно возвращает ссылку на `x`. Однако, при выводе этой ссылки через `std::cout`, выводится значение, на которое она указывает, если явно не указать, что ты хочешь вывести адрес (с использованием `&`). Это поведение связано с тем, как работает оператор `<<` в стандартной библиотеке C++.
/bin/laden Искусственный Интеллект (104741) 3 недели назад
потому что весь смысл ссылок в их прозрачности
Сергей Гений (57540) 3 недели назад
В зависимости от того, где находится символ & он может быть как оператором взятия адреса, так и признаком ссылочного типа. А еще может быть побитовым И.
если он стоит после обьявления типа (в том числе auto) - это будет ссылочный тип.
если перед переменной - это будет взятие адреса этой переменной
если между двумя переменными - это оператор "побитовое И".

int a = 34;
int b = 10;

int& c = a; //стоит после типа (int) значит это ссылочный тип (int&).
Ссылочный тип ведет себя как и обычный. Его не нужно разыменовывать.
int* d = &a; //стоит перед переменной, значит это взятие адреса
указатель int* нужно разыменовывать чтобы получить из него "a".
int e = a&b; //стоит между двумя переменными, значит это побитовое И.
Похожие вопросы