Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Лафоре Р. -> "Объектно-ориентированное программирование в С++" -> 128

Объектно-ориентированное программирование в С++ - Лафоре Р.

Лафоре Р. Объектно-ориентированное программирование в С++ — М.: Питер, 2004. — 992 c.
Скачать (прямая ссылка): obektnoorentprogramm2004.djvu
Предыдущая << 1 .. 122 123 124 125 126 127 < 128 > 129 130 131 132 133 134 .. 341 >> Следующая


mtrs = static_cast<float>( distl );

или с помощью простого присваивания

mtrs - dist2;

В обоих случаях происходит преобразование объекта типа Distance в его эквивалентное значение типа float, представляющее собой метры.

Преобразования строк в объекты класса string и наоборот

Рассмотрим другой пример, в котором использованы конструктор с одним аргументом и оператор преобразования. Здесь используется класс String, который мы видели в примере STRPLUS ранее в этой главе.

// strconv.срр

// перевод обычных строк в класс String finclude <iostream> using namespace std:

finclude «string.h> // для функций str* Преобразование типов 339

///////////////////////////////////////////////////////////

class String {

private:

enum { SZ - 80: } Il размер массива

char str [ SZ ]: ' Il массив для хранения строки public:

// конструктор без параметров String ( )

{ str [ 0 ] - 1 \х0': } // конструктор с одним параметром String ( char s [ ] )

{ strcpy ( str. s ); } // сохраняем строку в массиве Il показ строки void display ( ) const

{ cout « str; } // перевод строки к обычному типу operator char* ( ) { return str; }

}:

lllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

int main ( ) {

String si: // используем конструктор без параметров

char xstr [ ] - "Ура, товарищи! "; // создаем обычную строку

si - xstr: Il неявно используем конструктор с одним параметром

si.display ( ): // показываем строку

String s2 = "Мы победим!": // снова используем конструктор с параметром

cout « static_cast<char*>( s2 ): II используем оператор перевода типа cout « endl;

Конструктор с одним аргументом преобразовывает обыкновенную строку (массив элементов типа char) в объект класса String:

String ( char s [ ] ) { strcpy ( str. s ): }

Строка передается в качестве аргумента и копируется в переменную класса str заново созданного объекта класса String, используя библиотечную функцию strcpy().

Это преобразование будет применено, когда создается объект класса String String s2 = "Мы победим!":

или будет применено в выражении присваивания si = xstr:

где Sl — объект класса String, а переменная xstr — просто строка. 340

Глава 8. Перегрузка операций

Операция преобразования используется для перевода объекта класса String в строку:

operator char* ( ) { return str: }

Звездочка в этом выражении означает указатель па. Мы не будем вдаваться в объяснения указателей до главы 10, но их использование нетрудно понять. Это означает указатель на char, что почти то же, что и массив типа char. То есть запись char* — почти то же, что char[]. Это просто другой способ объявления переменной строкового типа.

Оператор преобразования используется компилятором в строке

cout « static_cast<char*>( s2 ):

Здесь s2 — переменная, использованная в качестве аргумента для перегруженной операции «. Так как операции « ничего не известно об определенном пользователем типе String, то компилятор будет пытаться преобразовать переменную s2 к одному из известных ему типов. Мы определяем тип, к которому хотим преобразовать переменную, с помощью оператора static_cast для char*. Оператор ищет преобразование от типа String к строковому типу и, найдя нашу функцию char*(), использует ее для генерации строки, которая затем будет выведена через операцию «. (Результат похож на вызов метода String::display(), но делает легким и интуитивно понятным вывод с помощью операции «, а метод displayO будет уже лишним и может быть удален.)

Вот результат работы программы STRC0NV: Ура. товарищи! Мы победим!

Пример STRC0NV демонстрирует, что преобразование типов происходит автоматически не только в выражениях присваивания, но и в других подходящих местах, таких, как пересылка аргументов операциям (например, «) или функциям. При передаче в операцию или функцию аргумента неправильного типа, они преобразуют его к приемлемому типу, если вы определили такое преобразование.

Заметим, что вы не можете использовать явное выражение присваивания для преобразования объекта класса String к переменной строкового типа:

xstr = s2; ' .< , „

Строка xstr — это массив, и вы не можете ничего ему присвоить (хотя, как мы увидим в главе 11, если мы перегрузим операцию присваивания, то все станет возможным).

Преобразования объектов классов в объекты других классов

Что мы можем сказать о преобразованиях между объектами различных, определенных пользователем классов? Для них применяются те же два метода преобразования, что и для преобразований между основными типами и объектами опре- Преобразование типов_341

деленных пользователем классов. То есть вы можете использовать конструктор с одним аргументом или операцию преобразования. Выбор зависит от того, хотите ли вы записать функцию преобразования в классе для исходного объекта или для объекта назначения. Например, предположим, что мы записали: objecta - objectb;

где objecta — объект класса A, a objectb — объект класса В. Где же расположить функцию преобразования, в классе А (это класс назначения, так как objecta получает значение) или в классе В? Мы рассмотрим оба варианта.
Предыдущая << 1 .. 122 123 124 125 126 127 < 128 > 129 130 131 132 133 134 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100