- •1. Объектно-ориентированное программирование как методология проектирования программных средств.
- •1.2. Объект
- •Iarray a(10), b(25), c(45);
- •Int main(void)
- •2.1. Перегрузка имен функций
- •Int print(int);
- •Void print(int);
- •Int (*matrix)[10];
- •Void main(void)
- •Void incr(int &aa)
- •3.2 Объявление класса.
- •Имя_класса имя объекта;
- •Имя объекта. Имя элемента
- •Имя_объекта. Имя_метода( );
- •Имя класса *this;
- •Имя_класса (список формальных параметров)
- •Листинг 3.4
- •V_3d( double &X, double &y,double &z)
- •Void main(void)
- •Х:: х(const х&)
- •V_3d::v_3d(const v_3d& v1)
- •Void v_3d::print()
- •Сlass X
- •Void main (void)
- •4. Перегрузка операций
- •V_3d(double x1,double y1,double z1)
- •Void print();
- •Void main(void)
- •Void v_3d::print()
- •4.3.1. Использование дружественных функций при перегрузке операций
- •Void print();
- •Void main(void)
- •Void v_3d::print()
- •4.3.2.Особенности использования дружественных функций
- •Имя объекта. Имя_функции
- •Void f1( X& );
- •Void f2 ( X* );
- •Void main(void)
- •5. Производные классы
- •Int Bfunc( );
- •Int Xfunc( );
- •Int Efunc( X & x1 );
- •Istream
- •Iostream
- •Ifstream
- •С помощью манипуляторов – специальных операций, вставляемых непосредственно в поток вывода.
- •Int width( int w);
- •Int precision( int p);
- •Void main(void)
- •Void open(char* filename, int mode, int access);
- •If(!fout) {
- •7. Виртуальные функции
- •Circle a;
- •A.Build();
- •Virtual double a(double X)
- •Void main (void)
- •Void Graphics Object :: Build() { };
- •8.Шаблоны функций и классов
- •Void main(void)
- •Void Swap ( SwapType &X, SwapType &y)
- •Void main(void)
- •Int a, double b;
- •Int sloc,rloc;//начало и конец очереди
- •Void qput(t I); // помещение элемента в очередь
- •Int main(void)
- •1.Какой принцип ооп реализуется с помощью шаблонных функций и классов?
- •2.Когда целесообразно использовать шаблоны функций? Каков общий вид объявления шаблона функции?
Void main(void)
{
int i=44;
float f=3456.13246;
cout <<"Вывод вещественного с точностью, заданной по умолчанию\n";
cout << f;
// задание точности вывода для вещественного: 2 знака после запяиой
cout <<"\nВывод вещественного с заданной точностью\n";
cout <<setprecision(4);
cout <<f;
cout <<"\nВывод целого в различных системах счисления:\n";
cout << "десятичное i=" << setw(4) << i <<"\n";
cout << "шестнадцатеричное i=" << hex << i <<"\n";
cout << "восьмеричное i=" << oct << i <<"\n";
cout <<dec;
//установка символа-заполнителя и ширины поля вывода
cout << setfill('*') <<setw(20) << "ПРИВЕТ";
cout<< setfill('*') <<setw(20)<<endl;
}
Результаты работы этой программы имеют вид:
Вывод вещественного с точностью, заданной по умолчанию
3456.132568
Вывод вещественного с заданной точностью
3456.1326
Вывод целого в различных системах счисления:
десятичное i= 44
шестнадцатеричное i=2c
восьмеричное i=54
**************ПРИВЕТ*******************
6.4 Организация файлового ввода-вывода
Файловый ввод-вывод поддерживают классы:
ifstream – производный от istream, наследует операции извлечения из потока >>;
ofstrem - производный от ostream, наследует операции вставки << в поток ;
fstream - производный от iostream.
В программы, использующие эти классы, следует включить заголовочный файл
< fstream.h>.
В С++ файл открывается посредством его связывания с потоком. Имеется три типа потоков: входной, выходной и входной-выходной потоки. Перед тем, как открыть файл, нужно создать поток, например:
ifstream f1; // создание файлового потока для ввода данных;
ofstream f2; // создание файлового потока для вывода данных;
fstream f3; // создание файлового потока для ввода и вывода данных.
После создания потока его можно привязать к файлу с помощью функции open(). Прототип этой функции имеет вид:
Void open(char* filename, int mode, int access);
где:
filename – имя файла, может включать путь;
mode задает режим открытия файла, может принимать одно (или более) из следующих значений:
ios::app // добавление в конец файла, только для вывода;
ios::ate // позиционирование в конец файла;
ios::binary // открытие в двоичном режиме;
ios::in // открытие файла для ввода;
ios::nocreate // функция open вернет ошибку, если файл не существует;
ios::noreplace // функция open вернет ошибку, если файл уже существует;
ios::out // открытие файла для вывода;
ios::trunc // удаление содержимого ранее существовавшего файла с тем
// же названием и усечение его до нулевой длины;
По умолчанию mode для ifstream равен ios::in, а для ofstream он равен ios::out.
access задает права доступа к файлу. В среде DOS и Windows этот параметр обычно соответствует кодам атрибутов файлов и может иметь значения, показанные в таблице 6.3.
Таблица 6.3. Коды атрибутов файлов.
-
Атрибут
Значение
0
Обычный файл со свободным доступом
1
Файл только для чтения
2
Скрытый файл
4
Системный файл
8
Архивный файл
По умолчанию значение access равно нулю.
Например:
f1.open(“test.txt”, ios::nocreate);
f2.open(“c:\\user\\bi62\\dan.dat”, ios::out, 0);
f3.open( “test”, ios::in | ios::out);
Для потока f2 оператор привязки потока к файлу файла можно было бы записать короче, тогда будут использованы значения параметров открытия по умолчанию:
f2.open(“c:\\user\\bi62\\dan.dat”);
Примечание.
Если поток открывается как для ввода, так и для вывода, это поток f3 в примере, то использовать значение mode по умолчанию нельзя.
Если open() завершилась с ошибкой, поток будет равен нулю. Поэтому перед использованием файла следует убедиться в его успешном открытии, например:
if (!f2)
{
cout << “ Ошибка открытия файла \n” ;
exit (-1); // Завершение программы с кодом ошибки
}
Можно в одном операторе выполнить как создание потока, так и привязку его к файлу, например:
ifstream f1 ( “test.txt” ); // открытие файла для ввода;
ofstream f2 (“c:\\user\\bi62\\dan.dat”); // открытие файла для вывода.
Для закрытия файла следует использовать функцию-метод close(), например:
f1.close();
f2.close();
Функция close() не имеет параметров и возвращаемого значения.
По умолчанию все файлы открываются в текстовом режиме. В текстовом режиме имеет место преобразование некоторых символов, например, последовательность возврат каретки/перевод строки превращается в символ новой строки. Если же файл открывается в двоичном режиме, никакого преобразования символов не выполняется.
После открытия текстового файла, чтобы читать из файла или писать в него, достаточно воспользоваться операторами << и >>.
Для определения момента достижения конца файла следует использовать функцию-метод eof(), имеющую следующий прототип:
int eof();
При достижении конца файла она возвращает ненулевое число, в противном случае возвращает ноль.
В листинге 6.4 показан пример программы, выполняющей копирование файла и вывод числа скопированных символов. При запуске этой программы на исполнение из командной строки должны быть переданы имена копируемого файла и файла-копии из командной строки, например, если имя файла программы copyf.exe, и следует скопировать файл dan.dat в файл dancopy.dat, то командная строка должна иметь вид:
copyf dan.dat dancopy.dat
Листинг 6.4. Копирование текстовых файлов и вывод числа скопированных символов.
#include <iostream.h>
#include <fstream.h>
main(int argc, char *argv[ ])
{
if(argc!=3) {
cout << "Использование: CPY <input> <output>\n";
return 1;
}
ifstream fin(argv[ 1 ]); // открытие входного файла
ofstream fout(argv[ 2 ]); // создание выходного файла
if(!fin) {
cout << "Входной файл открыть невозможно\n";
return 1;
}
