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

 

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

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

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


Перегруженная операция [], использующая возвращение по ссылке

Мы перегрузим операцию индексации [] в классе safearray для использования стандартной записи С++ для доступа к элементам массива. Однако, так как эта операция обычно используется слева от знака равно, наша перегруженная функция должна возвращать свое значение по ссылке, как показано в предыдущей программе. Листинг программы ARR0VER3:

II arrover3.cpp

// демонстрация создания безопасного массива, проверяющего

Il свои индексы при использовании

Il используется перегрузка операции [ ]

finclude <iostream>

using namespace std:

!include <process.h> // для функции exit const int LIMIT = 100: // размер массива

Iiiiimmiiiiiiiiiiiiiimiiiiiiiimiiiiiiiiimmiiiii

class safearray {

private:

int arr [ LIMIT ]: public: 334

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

// обратите внимание, что функция возвращает ссылку!

int& operator[ ] ( int n ) {

if ( n < О II n >- LIMIT )

{ cout « 'ЛпОшибочный индекс!": exit ( 1 ); } return arr [ n ]:

}

}:

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

int main ( ) {

safearray sal:

// задаем значения элементов for ( int j - 0: j < LIMIT: j++ ) sal[ j ] - j * 10: // используем функцию слева от знака -

// показываем элементы

for ( J - 0; J < LIMIT: j++ ) {

int temp - sal [ j ]: // используем функцию справа от знака -cout « "Элемент " « j « " равен " « temp « end!:

}

return 0:

}

В этой программе мы можем использовать обычную запись операции индексации массива

sal [ J 3 - j * 10: и

temp - sal [ j ]:

для ввода и вывода элементов массива.

Преобразование типов

Вы уже знаете, что операция = используется для присваивания значения одной переменной другой в выражениях типа

intvarl = intvaг2:

где intvarl и intvar2 — целые переменные. Вы могли также заметить, что операция = присваивает значение одного объекта, определенного пользователем, другому объекту того же типа, как в строке

dist3 = distl + dist2;

где результат операции сложения, имеющий тип Distance, присвоен другому объекту типа Distance — dist3. Обычно если значение одного объекта присваивается другому объекту того же типа, то значения всех переменных объекта просто копируются в новый объект. Компилятору не нужны специальные инструкции, Преобразование типов_335

чтобы использовать операцию = для определенных пользователем типов, таких, как объекты класса Distance.

Таким образом, присвоение внутри типов, независимо от того, принадлежат они к основным или определенным пользователем типам, выполняется компилятором без усилий с нашей стороны, при этом с обеих сторон знака равно используются переменные одинаковых типов. Но что же случится, если с разных сторон знака равно будут стоять переменные разных типов? Это сложный вопрос, которому мы посвятим остаток этой главы. Сначала мы рассмотрим, как компилятор выполняет преобразование основных типов, которое происходит автоматически. Затем мы объясним несколько ситуаций, где компилятор не выполняет преобразование автоматически и мы должны определить, что он должен делать. В эти ситуации включены преобразования между основными и определенными пользователем типами и преобразования между различными определенными пользователем типами.

Может показаться, что это демонстрирует недостаточную практику программирования для конвертирования одного типа в другой. Ведь в таких языках, как Pascal, предприняты попытки избавить вас от проделывания подобных преобразований. Однако философия С++ (и С) — это гибкость, предоставленная возможностью преобразования, которая перевешивает недостатки. Это спорный вопрос, и мы вернемся к нему в конце этой главы.

Преобразования основных типов в основные типы

Когда мы пишем строку типа intvar - floatvar:

где intvar — переменная типа int, a floatvar — переменная типа float, то мы предполагаем, что компилятор вызовет специальную функцию для преобразования значения переменной floatvar, которая имеет формат числа с плавающей точкой, в формат целого числа, чтобы мы могли присвоить его переменной intvar. Конечно, существует множество таких преобразований: из float в double, из char во float и т. д. Каждое такое преобразование имеет свою процедуру, встроенную в компилятор, которая вызывается в зависимости от типов переменных, стоящих с обеих сторон знака равно. Мы говорим, что преобразования неявные, так как они не отражены в листинге.

Иногда мы хотим принудительно заставить компилятор преобразовать один тип в другой. Для этого используется оператор cast. Например, для преобразования float в int мы можем записать следующее выражение: intvar = static_cast<int>( floatvar ):

Использование этого оператора предоставляет нам явное преобразование: очевидно, что в листинге функция static_cast<int>() предназначена для преобразования float в int. Однако такое явное преобразование использует те же встроенные процедуры, что и неявное. 336_Глава 8. Перегрузка операций

Преобразования объектов в основные типы и наоборот
Предыдущая << 1 .. 120 121 122 123 124 125 < 126 > 127 128 129 130 131 132 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100