Инициализация наследуемых классов.
Все действия по инициализации объектов выполняет конструктор порождённого класса.
Если конструктору базового класса требуются аргументы, то они должны быть указаны в списке аргументов конструктора. В общем виде конструктор имеет вид:
Конструктор_производного_класса(список аргументов): базовый_класс1( список аргументов)…базовый_класс_N (список аргументов) { тело конструктора}
Производный класс может иметь не один , а несколько базовых. В этом случае базовые классы указываются списком, через ,.
#include <iostream.h>
Class B1
{ public:
B1(){cout<<"работа конструктора B1\n";}
~B1(){cout<<" работа деструктора B1\n";}
};
Class B2
{ public:
B2(){cout<<"работа конструктора B2\n";}
~B2(){cout<<" работа деструктора B2\n";}
};
class D:public B1,public B2
{
public:
D(){cout<<"работа конструктора D\n";}
~D(){cout<<" работа деструктора D\n";}
};
Void main(void)
{
cout <<"результат работы программы: \n" ;
D ob;
cout<<"*********************\n" ;
}
результат работы программы:
Работа конструктора B1
Работа конструктора B2
Работа конструктора D
*********************
Работа деструктора D
Работа деструктора B2
Работа деструктора B1
Конструкторы базового класса должны быть объявлены с атрибутами protected или publicдля того, чтобы обеспечить возможность их вызова из класса-наследника.
Потоки.
Классы ввода-вывода iostream рассматривают информацию, как побитовый поток данных. Если данные выводятся на экран или заносятся в файл, то источник их как правила находится в программе. Если поток направлен в противоположную сторону, то данные могут поступать либо с клавиатуры или из файла, В этом случае они заносятся в переменные.
Операция записи на диск достаточно временноёмка, поэтому используют буфер обмена.
В С++ используется ОО подход к реализации обмена данными с буферными потоками.
§ Класс streambuf управляет буфером, его методы позволяют наполнить, опорожнить и очистить буфер.
§ Класс ios является базовым для классов ввода-вывода.
§ Классы istream и ostream являются произвольными от класса ios и отвечают соответственно за потоковый ввод и вывод данных.
§ Класс iosteam является произвольным от istream и ostream и обеспечивает методы ввода-вывода для печати на экран.
§ Классы fstream используются для ввода-вывода из файла.
В файле iostream.h определены классы iostream и ostream, именно то, что эти операторы ввода-вывода работают с классами, позволяет перегружать их для работы с классами пользователя. Оператор cin является глобальным объектом и перегружается таким образом, что можно вводить различные типы данных.
В частности при помощи этого объекта модно ввести тип *char, то есть строку символов. Можно использовать дополнительные методы этого класса, что бы более полно контролировать ввод-вывод. Пример : ввод одного символа можно реализовать при помощи метода cin.get()>>
#include <iostream.h>
#include <math.h>
Int main(void)
{
Char ch;
while((ch=cin.get())!=EOF)
{
cout << "ch: "<<ch<<endl;
}
cout <<"\n конец \n";
Return 0;
} //ввод EOF — Ctrl+Z
cin.get() возвращает не объект типа iostream, а тип int. А если вы используете параметр cin.get(a), то возвращается объект iostream, а параметру присваивается значение из потока. Для работы со строками подойдёт как оператор ввода <<, так и методы get() и getline(). Для ввода строки можно использовать get() и getline() с тремя параметрами:
§ указатель на массив символов.
§ максимально-возможное количество символов в строке, включая концевой символ;
§ разделитель строк.
Cin.get(str,80,”\n”);
Разница между этими двумя функциями в том, что первая оставляет символ разделения строк в буфере , а вторая удаляет его.
Существует ещё несколько дополнительных методов:
Ignore(80,”\n”) параметры — сколько пропускается символов без чтения и разделитель.
Peek() — просматривает, но не считывает очередной символ.
Putback() —вставляет символ в поток ввода.
#include <iostream.h>
#include <iomanip.h>
Int main(void)
{
Char ch;
cout <<"введите фразу: ";
While(cin.get(ch))
{
if(ch=='!') cin.putback('$');
else cout <<ch;
while(cin.peek()=='#')
cin.ignore(1,'\n');
}
Return 0;
}
Результат работы программы:
введите фразу: кен!!gh#ghj##sdfdgfh
// кен$$ghghjsdfdgfh
Для объекта cout существуют соответствующие методы put() и write().
Cout.put() и cout.write(мах. Размер вывода);
Кроме этого существуют так называемые флаги и манипуляторы для форматированного ввода.
Cout.Width() — устанавливается точное значение ширины поля ввода.
Cout.fill(‘*’) — заполнение пустых позиций поля * (можно другой символ).
Флаги позволяют оформить вывод:
Управление выводом данных:
§ \n— новая строка.
§ \t—табуляция (несколько пробелов).
§ \\— обратный слеш.
§ \a—звуковой сигнал.
Манипуляторы, не требующие включения файла iomanip.h:
§ flush—очищает буфер ввода
§ endl—вводит конец строки
§ oct —8- ричное представление числа
§ dec —10- ричное представление числа
§ hex —16- ричное представление числа
Манипуляторы, требующие включения файла iomanip.h:
§ setw(ширина) —ширина поля вывода.
§ setfill(символ) —символ заполнения пустых позиций.
§ setprecision (точность) —количество знаков после ,.
Все манипуляторы, кроме flush, end, setw() остаются включенными на протяжении работы всей программы, если не будет других установок.
Флаги используют формат написания setf(ios::флаг1 | ios::флаг2). (дом. Работа)
Лекция № 8.Использование файлов для ввода-вывола.
Дата добавления: 2015-12-26; просмотров: 771;