Передача параметров функции. Перегрузка функций 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Передача параметров функции. Перегрузка функций



Рассмотрим заголовок функции

int area(int a, int b)

здесь для формальных параметров – переменных целого типа a и b используется механизм передачи «по значению», т.е. при вызове функции ей передаются только значения соответствующих фактических параметров.

Поэтому, если в качестве фактических параметров указаны имена переменных, значения этих переменных функцией не могут быть изменены, т.к. соответствующая область памяти ей недоступна. Для того чтобы функция могла изменять значения переменных, передаваемых в качестве фактических параметров, необходимо передавать ей не значения, а адреса, в которых переменные-фактические параметры размещаются в памяти, т.е. использовать механизм передачи по ссылке (адресу). Для этого используется операция получения адреса переменной: &<имя переменной>. В этом случае рассмотренный заголовок функции будет выглядеть так:

int area(int& a, int& b)

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

Пример (вычисление площади прямоугольника):

#include <iostream.h>

void get_dim(int& len, int& wid); // прототип функции get_dim

int area(int len, int wid); // прототип функции area

Void main()

{

int a,b;

get_dim(a,b); // ввод длины и ширины

cout <<"\nlen=" <<a <<" wid=" <<b;

cout <<"\narea=" <<area(a,b); // вывод площади

}

void get_dim(int& len, int& wid) // определение функции get_dim

{

cout <<"\ninput len win: "; cin >>len >>wid;

}

int area(int len, int win) // определение функции area

{

return len*win;

}

Одним из характерных свойств объектно-ориентированного языка, в том числе и C++, является полиморфизм – использование одного имени для выполнения различных действий над различными объектами. Применительно к функциям это называется перегрузкой. Со свойством перегрузки мы уже сталкивались при рассмотрении основных операций C++, например, у деления существует только одно имя, "/", но его можно применять для деления как целых, так и вещественных значений.

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

 

Пример: (вычисление площади прямоугольника и объема параллелепипеда - полиморфизм):

#include <iostream.h>

void get_dim(int& len, int& wid); // прототип-1 функции get_dim

void get_dim(int& len, int& wid, int& hig); // прототип-2 функции get_dim

int ar_vol(int len, int wid); // прототип-1 функции ar_vol

int ar_vol(int len, int wid, int hig); // прототип-2 функции ar_vol

Void main()

{

int a,b,c;

get_dim(a,b); // вызов-1 функции get_dim

cout <<"\nlen=" <<a <<" wid=" <<b;

cout <<"\narea=" <<ar_vol(a,b); // вызов-1 функции ar_vol

get_dim(a,b,c); // вызов-2 функции get_dim

cout <<"\nlen=" <<a <<" wid=" <<b <<" hig=" <<c;

cout <<"\nvolume=" <<ar_vol(a,b,c); // вызов-2 функции ar_vol

}

void get_dim(int& len, int& wid) // определение-1 функции get_dim

{

cout <<"\ninput len win: "; cin >>len >>wid;

}

void get_dim(int& len, int& wid, int& hig) // определение-2 функции get_dim

{

cout <<"\ninput len wid hig: "; cin >>len >>wid >>hig;

}

int ar_vol(int len, int win) // определение-1 функции ar_vol

{

return len*win;

}

int ar_vol(int len, int wid, int hig) // определение-2 функции ar_vol

{

return len*wid*hig;

}

 

Текстовые файлы в C++. Файловые потоки ввода-вывода.

Поток – это последовательный логический интерфейс, который используется для чтения (ввода) данных из файла и записи (вывода) данных в файл.

Мы уже имели дело со стандартными потоками ввода-вывода cin и cout при вводе данных с клавиатуры и выводе на экран дисплея. Важным свойством потока является последовательное помещение элементов в поток. При этом потоки ввода cin и вывода cout являются однонаправленными: получить (прочитать) данные в программе можно из потока ввода, отправить (записать) данные из программы можно в поток вывода. Стандартные потоки ввода cin и вывода cout подключаются к клавиатуре и экрану дисплея соответственно сразу после начала выполнения программы. Модель потока ввода-вывода можно представить как полубесконечную ленту с перемещающимся над ней «окном», через которое мы получаем доступ к текущему элементу потока. За последним элементом помещается метка конца потока. Такая модель соответствует файлу последовательного доступа. При этом данные удобно хранить и работать с ними в символьном виде, поэтому мы будем рассматривать текстовые файлы, элементами которых являются символы. Такие файлы могут быть подготовлены и просмотрены с помощью любого текстового процессора (редактора).

Как и в Паскале, данные в C++ могут быть введены в программу из любого файла, а не только из стандартного потока ввода cin. Аналогично обстоит дело и с выводом данных. Таким образом, кроме стандартных потоков cin и cout в программе можно работать с файловыми потоками ввода-вывода.

Список функций для работы с файловыми потоками хранится в библиотеке (заголовочном файле) fstream.h. Поэтому во всех рассматриваемых ниже фрагментах программ предполагается, что в начале программы есть соответствующая директива #include:

#include <fstream.h>

Создание потока ввода-вывода

Прежде чем начать работать с потоком необходимо его создать. Поток ввода создается инструкцией

ifstream <имя потока ввода>;

Поток вывода создается инструкцией

ofstream <имя потока вывода>;

Пример:

ifstream input;

ofstream output;

эти инструкции создают поток ввода input и поток вывода output.

Открытие и закрытие файла

После создания потока его можно подключить к файлу (открыть файл) инструкцией

<имя потока>.open (<имя файла>);

Здесь <имя файла> - текстовая константа или переменная.

Например, для подключения потока ввода ifstream с именем input к файлу data.txt надо выполнить инструкцию

input.open (“data.txt”);

действие которой аналогично инструкции подготовки файла к чтению в Паскале reset.

Аналогичная инструкция

output.open (“data.txt”);

подключит поток вывода output к файлу data.txt – файл подготовлен к записи данных. Важно отметить, что, как и при выполнении оператора подготовки файла к записи в Паскале rewrite, прежние данные из файла data.txt будут удалены.

Для отключения потока ввода-вывода от файла надо выполнить инструкцию закрытия файла:

<имя потока>.close ();

Так, инструкции

input.close();

output.close ();

отключают потоки ввода input и вывода output от файла data.txt,к которому они были подключены в предыдущих примерах. При закрытии файла вывода в конец файла записывается метка конца end_of_file.

Обработка ошибок

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

Один из простейших способов контроля корректности выполнения файловых операций заключается в вызове функии

<имя потока>.fail()

например,

Input.fail()

Эта инструкция выполняется как вызов булевской функции, которая возвращает значение false (0), если последняя операция с потоком input завершилась успешно и возвращает значение true (1), если последняя операция с потоком input привела к ошибке (например, была попытка открытия несуществующего файла). В случае возникновения ошибки поток может быть поврежден, поэтому работу с ним продолжать нельзя.

Распознать ошибку можно и с помощью перегруженной операции отрицания. Выражение !<имя потока> также принимаетзначение false (0), если последняя операция с потоком завершилась успешно и принимает значение true (1), если последняя операция с потоком привела к ошибке.

Пример:

ifstream input;

input.open (“data.txt”);

if(!input) exit(1); // завершение работы программы

функция exit() описана в библиотеке stdlib.h.



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 289; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.116.40.177 (0.02 с.)