Параметр функции в c++

115
20 июля 2019, 12:40
  • void f(int i) {} -- эта функция ожидает получить один параметр int и не вернёт ничего.
  • void f(int *i){} -- эта ожидает указатель, я так понимаю.
  • void f(int &i){} -- что ожидает на входе эта функция?
Answer 1

Вкратце можно сказать следующее.

Параметр этой функции

void f(int &i){}

определяет так называемую lvalue ссылку.

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

#include <iostream>
void g( int i )
{
    i += 10;
}
void h( int &i )
{
    i += 10;
}
int main() 
{
    int i = 0;
    std::cout << "Before call g( i ) i = " << i << '\n';
    g( i );
    std::cout << "After  call g( i ) i = " << i << '\n';
    std::cout << '\n';
    std::cout << "Before call h( i ) i = " << i << '\n';
    h( i );
    std::cout << "After  call h( i ) i = " << i << '\n';
    return 0;
}

Вывод программы на консоль

Before call g( i ) i = 0
After  call g( i ) i = 0
Before call h( i ) i = 0
After  call h( i ) i = 10

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

С другой стороны, функция h изменяет исходную переменную i, так как она передается в функцию по ссылке.

Имейте в виду, что можно параметр функции объявить также как

int &&i

Это так-называемая rvalue ссылка, предназначенная для работы с временными объектами.

Рассмотрите такую программу.

#include <iostream>
void f( int && )
{
    std::cout << "void f( int && )\n";
}
void f( int * )
{
    std::cout << "void f( int * )\n";
}
void f( int & )
{
    std::cout << "void f( int &  )\n";
}
int main() 
{
    int i = 0;
    f( 0 );
    f( i );
    f( &i );
    return 0;
}

Ее вывод на консоль:

void f( int && )
void f( int &  )
void f( int * )
Answer 2

Короткий ответ: эта функция ожидает на входе lvalue типа int. Параметр-ссылка i будет привязана к тому lvalue, которое вы передадите в качестве аргумента.

Длинный ответ: Почитайте литературу о ссылках в C++. Ссылки в C++ - базовое свойство языка C++ и слишком обширная тема, чтобы пытаться покрыть ее в одном ответе.

Чем отличаются ссылки от указателей в С++

READ ALSO
Как сравнить изображения на java?

Как сравнить изображения на java?

Есть ли встроенные методы, позволяющие сравнить изображения на полное сходство (Не просто == или imgequals(img2), ибо в первом это разные объекты,...

121
Android, java, view.setOnTouchListener

Android, java, view.setOnTouchListener

Был у меня recyclerview с адаптером и все было крутоЯ добавил view

121
Как связать поля из SQLite c textaria и labels в JavaFX?

Как связать поля из SQLite c textaria и labels в JavaFX?

Пишу программу на JavaFX И Scene BuilderВ качестве базы данных использую SQLite

132
JavaFX вращение контрола мышью вокруг своего центра

JavaFX вращение контрола мышью вокруг своего центра

Собственно, весь вопрос поставлен в заголовкеОднако, при вращении обнаружены некоторые баги

129