Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 318; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.14.143.149 (0.008 с.) |