![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Передача параметров функции. Перегрузка функцийСодержание книги
Поиск на нашем сайте
Рассмотрим заголовок функции 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; просмотров: 327; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.12.166.151 (0.007 с.) |