На этом шаге мы закончим рассматривать перегрузку операции вывода.
Как показано на предыдущем шаге, перегрузка операции вывода << позволяет не только организовать с ее помощью вывод значений пользовательских типов, но и обеспечивает программиста широкими возможностями оформления результатов. К сожалению, расширить действие операции можно только на пользовательские типы и поэтому невозможно непосредственно изменить формат вывода какого-либо из базовых типов. Например, не удастся ввести процедуру 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 Значение строки: Содержимое строки.
Отметим, что в файле с тестом программы определение операции-функции помещено ниже, чем обращение к ней. Поэтому в вызывающую программу пришлось поместить прототип операции-функции.
На следующем шаге мы рассмотрим перегрузку операции ввода.