Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
439.97 Кб
Скачать

1.11.3. Передача параметров в функцию по ссылке и указателю

Теперь, когда мы знакомы с понятиями указатель и ссылка, можно вернуться к вопросу передачи аргументов в функции. Существует несколько способов:

  • Передача по значению (call by value). Когда аргумент передается по значению, в вызываемой функции создается копия аргумента, и изменения копии внутри функции не влияют на значение исходной переменной вызывающей функции.

  • Передача по указателю (call by pointer). Не значения копируются в параметры, а передаются указатели на переменные, в которых хранятся значения переменных.

  • Передача по ссылке (call by reference). Самый удобный способ, когда передаются ссылки (псевдонимы) на переменные. Этот способ позволяет обходиться без оператора разыменования.

/////////////////////////////////////////////////////////////////////////////

// Прикладное программирование

// Пример 16. Передача аргументов в функцию по значению, по ссылке, по указателю

//

// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru

// СПб НИУ ИТМО

/////////////////////////////////////////////////////////////////////////////

// подключение библиотеки ввода-вывода

#include <iostream>

// подключение стандартного пространства имен для использования библиотек

using namespace std;

// прототипы функций

void swap_by_value(int i, int j);

void swap_by_reference(int &i, int &j);

void swap_by_pointer(int *i, int *j);

/////////////////////////////////////////////////////////////////////////////

// функция main начинает исполнение программы

void main()

{

int i1=5, i2=5, i3=5;

int j1=7, j2=7, j3=7;

swap_by_value(i1, j1); // передача параметров в функцию по значению

cout<<"main - swap_by_value: "<<i1<<" "<<j1<<endl;

swap_by_reference(i2, j2); // передача параметров в функцию по ссылке

cout<<"main - swap_by_reference: "<<i2<<" "<<j2<<endl;

swap_by_pointer(&i3, &j3); // передача параметров в функцию по указателю

cout<<"main - swap_by_pointer: "<<i3<<" "<<j3<<endl;

}

/////////////////////////////////////////////////////////////////////////////

// параметры i,j передаются в функцию по значению

void swap_by_value(int i, int j)

{

int t=i;

i=j;

j=t;

cout<<"swap_by_value: "<<i<<" "<<j<<endl;

}

/////////////////////////////////////////////////////////////////////////////

// параметры i,j передаются в функцию по ссылке

void swap_by_reference(int &i, int &j)

{

int t=i;

i=j;

j=t;

cout<<"swap_by_reference: "<<i<<" "<<j<<endl;

}

/////////////////////////////////////////////////////////////////////////////

// в функцию передаются указатели на параметры i,j

void swap_by_pointer(int *i, int *j)

{

int t=*i;

*i=*j;

*j=t;

cout<<"swap_by_pointer: "<<*i<<" "<<*j<<endl;

}

/////////////////////////////////////////////////////////////////////////////

2.1 Состав стандартной библиотеки C++

Что должно быть в стандартной библиотеке? Все! Но это невозможно, неразумно и все равно недостаточно. Стандартная библиотека C++ -- это набор функций и классов, который должен быть в каждой реализации языка, как основа, эффективно реализующая механизмы:

  • математические функции (в том числе комплексные числа, случайные числа);

  • работа с временем и дата;

  • строковый тип данных и форматные преобразования;

  • ввод/вывод.

STL (Stadard Template Library) -- стандартная библиотека шаблонов. Название обобщенное, может быть не совсем точное, так как ее составляют в основном шаблоны всевозможных контейнеров и алгоритмов их обработки (библиотека контейнеров). Библиотеку составляют:

  • контейнеры (объекты для хранения однотипных данных)

    • последовательные (vector, deque, list);

    • ассоциативные (set, multiset, map, multimap);

  • адапторы (объекты, созданные на основе базовых контейнеров, с измененным интерфейсом: например, queue, stack)

  • итераторы (объекты, которые используются для универсального доступа к элементам хранящимся в контейнере любого типа)

  • алгоритмы (обобщенные процедуры для обработки элементов любых контейнеров)

  • функции-объекты (объекты, у которых перегружен оператор вызова функций operator (): например предикаты, позволяющие без изменения шаблона изменять критерии сравнения элементов контейнера и другие подобные действия)

Это функции, механизмы, которые пользуются широкой потребностью, но многие из них сложны в реализации. Целесообразно осуществить стандартную реализацию этих функций и оформить ее в виде стандартной библиотеки языка С++. Теперь даже начинающий программист может воспользоваться низкоуровневыми функциями и механизмами.

Стандартную библиотеку языка нужно знать очень хорошо, чтобы оценивать какие задачи можно решить используя стандартные средства, а какие придется разрабатывать и отслеживать. Мы рассмотрим немногие, основные функции и механизмы представленные стандартной библиотекой. Остальную богатую и мощную часть стандартной библиотеки рекомендую вам активно осваивать самостоятельно.

Пространства имён

Пространства имён -- механизм логического группирования функций, классов, переменных, констант в именованный программный модуль.

namespace std {     ...     double cos(double x);     ... }

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

#include <cmath> using namespace std;

или

std::cos(0.);