На этом шаге мы закончим рассматривать перегрузку операции вывода.
Как показано на предыдущем шаге, перегрузка операции вывода << позволяет не только организовать с ее
помощью вывод значений пользовательских типов, но и обеспечивает программиста широкими возможностями оформления результатов.
К сожалению, расширить действие операции можно только на пользовательские типы и поэтому невозможно непосредственно изменить
формат вывода какого-либо из базовых типов. Например, не удастся ввести процедуру operator << (), с помощью которой
при использовании операнда типа char * в стандартный поток будет выводиться и длина символьной строки, и ее содержимое.
Чтобы решить указанную задачу, необходимо определить структуру, компонентами которой будут связанный со строкой указатель char *
и целая переменная со значением, равным длине строки. Вот для такой структуры перегрузка операции вывода << вполне допустима.
В следующей программе это реализовано:
//OOР9_1.СРР - вывод информации о структуре-строке. #include <iostream.h> #include <string.h> // Для работы со строковыми функциями. //Определение класса (пользовательского типа): struct string { int length; char line[80]; }; // Прототип операции-функции для перегрузки операции <<: ostream& operator << (ostream& out, string str); void main() { string st; // Объект st класса string. strcpy(st.line,"Содержимое строки."); st.length = strlen(st.line); cout << st; } ostream& // Тип возвращаемого значения. operator << (ostream& out, string str) { out << "\n Длина строки: " << str.length; out << "\n Значение строки: " << str.line; return out; }
Текст этой программы можно взять здесь.
Результат выполнения программы:
Длина строки: 18 Значение строки: Содержимое строки.
Отметим, что в файле с тестом программы определение операции-функции помещено ниже, чем обращение к ней. Поэтому в вызывающую
программу пришлось поместить прототип операции-функции.
На следующем шаге мы рассмотрим перегрузку операции ввода.