С++ ссылочный параметр &, значок & перед именем параметра в объявлении функции

Ссылочный параметравтоматически получает адрес соответствующего аргумента.

 

#include <iostream>
using namespace std;
void f (int &i); // в переменную i придет ссылка на переменную, которую мы вызовем в качестве аргумента
int main ()
{
    int k = 0;
    f(k); // передаем в функцию АДРЕС переменной К
    cout << k; // 20
    return 0;
}
void f (int &i){
    cout << &i << '\n'; // покажет адрес переменной напр.: 0x28ff0c
    cout << i; // покажет значение переменной
    i = 20; // присвоит переменной К НОВОЕ значение 20 !!!
}

Как видим, мы не пишем, что k = f(); мы не присваиваем К новое значение, мы в ее адрес передаем новое значение в функции.

 

Присваивая некоторое значение по ссылке, вы в действительности присваиваете это значение переменной, на которую указывает эта ссылка!! Поэтому применяя ссылку в качестве аргумента функции, при вызове функции вы в действительности ИСПОЛЬЗУЕТЕ ТАКУЮ ПЕРЕМЕННУЮ!

 

Например:

#include <iostream>
using namespace std;
void disp_binary (unsigned u);
enum resolution {low, medium, high};
class display {
    int width,height;
    resolution res;
    public:
    void set_dim(int w, int h) {width = w; height = h; }
    void get_dim(int &w, int &h) {w = width; h = height;}
    void set_res(resolution r) {res = r;}
    resolution get_res() {return res;}
};
char names[3][68] = {"low","middle","high"};
int main (){
    display display_mode[3];
    int i, w, h;
    display_mode[0].set_res(low);display_mode[0].set_dim(640, 480);
    display_mode[1].set_res(medium);display_mode[1].set_dim(800, 600);
    display_mode[2].set_res(high);display_mode[2].set_dim(1600, 1200);
    cout<< "Video modes:\n\n";
    for(i=0; i<3; i++) {
        cout << names[display_mode[i].get_res()];
        display_mode[i].get_dim(w,h);
        cout << ' ' << w << " x " << h << '\n';
    }
    return 0;
}

 

Здесь мы используем ссылочный параметр для получения ширины и высоты void get_dim(int &w, int &h) {w = width; h = height;}

Мы используем оператор & чтобы получить доступ к переменным которые получают новое значение в функции.

ТО ЕСТЬ МЫ ПЕРЕДАЕМ АДРЕС НАШИХ ДВУХ ПЕРЕМЕННЫХ w и h в функцию и получаем их значения.

Мы могли бы и без них вывести ширину и высоту, напрямую их используя: display_mode[i].width;

 

Так как мы с помощью display_mode[i].get_dim(w,h); не пишем явно присвоение к переменным w и h, однако с помощью операторa & мы получаем значения этих переменных.

 

Расширенно это выглядело бы так:

В объявлении класса мы пишем эту функцию как: int get_dim() {return width;}

И вызываем ее таким образом: w  = display_mode[i].get_dim();

Тоже самое и для высоты. То есть код будет больше.

При помощи ссылочных параметров код сокращается.



Оставить свой ответ:

Имя:*
E-Mail:
Вопрос:
Skolko buдет пять пдюс сeмь?
Ответ:*
QQpedia21.ru - cамые интересные вопросы