Чтение онлайн

на главную - закладки

Жанры

Освой самостоятельно С++ за 21 день.

Либерти Джесс

Шрифт:

Анализ: Класс Counter, определенный в строках 7—17, содержит только один конструктор, заданный по умолчанию. В нем не определено ни одного метода преобразования данных типа int в тип Counter, поэтому компилятор обнаруживает ошибку в строке 26. Компилятор ничего не сможет поделать, пока не получит четких инструкций, что данные типа int необходимо взять и присвоить переменной-члену itsVal.

В листинге 10.17 эта ошибка исправлена с помощью оператора преобразования

типов. Определен конструктор, который создает объект класса Counter и присваивает ему полученное значение типа int.

Листинг 10.17. Преобразование int в Counter

1: // Листинг 10.17.

2: // Использование конструктора в качестве оператора преобразования типа

3:

4: int

5: #include <iostream.h>

6:

7: class Counter

8: {

9: public:

10: Counter;

11: Counter(int val);

12: ~Counter{ }

13: int GetItsValconst { return itsVal; }

14: void SetItsVal(int x) { itsVal = x; }

15: private:

16: int itsVal;

17:

18: };

19:

20: Counter::Counter:

21: itsVal(0)

22: { }

23:

24: Counter::Counter(intval):

25: itsVal(val)

26: { }

27:

28:

29: int main

30: {

31: int theShort = 5;

32: Counter theCtr = theShort;

33: cout << "theCtr: " << theCtr.GetItsVal << endl;

34: return 0;

35: }

Результат:

the Ctr: 5

Анализ: Важные изменения произошли в строке 11, где конструктор перегружен таким образом, чтобы принимать значения типа int, а также в строках 24—26, где данный конструктор применяется. В результате выполнения конструктора переменной-члену класса Counter присваивается значение типа int.

Для присвоения значения программа обращается к конструктору, в котором присваиваемое значение передается в качестве аргумента. Процесс осуществляется в несколько шагов.

Шаг 1: создание переменной класса Counter с именем theCtr.

Это то же самое, что записать: int x = 5, где создается целочисленная переменная x и ей присваивается значение 5. Но в нашем случае создается объект theCtr класса Counter, который инициализируется переменной theShortTHna short int.

Шаг 2: присвоение объекту theCtr значения переменной theShort.

Но переменная относится к типу short, а не Counter! Первое, что нужно сделать, — это преобразовать ее к типу Counter. Компилятор может делать некоторые преобразования автоматически, но ему нужно точно указать, чего от него хотят. Именно для инструктирования компилятора создается конструктор класса Counter, который содержит единственный параметр,

например типа short:

class Counter

{

Counter (short int x);

// ...

};

Данный конструктор создает объект класса Counter, используя временный безымянный объект этого класса, способный принимать значения типа short. Чтобы сделать этот процесс более наглядным, предположим, что для значений типа short создается не безымянный объект, а объект класса Counter с именем wasShort.

Шаг 3: присвоение значения объекта wasShort объекту theCtr, что эквивалентно записи

"theCtr = wasShort";

На этом шаге временный объект wasShort, созданный при запуске конструктора, замещается на постоянный объект theCtr, принадлежащий классу Counter. Другими словами, значение временного объекта присваивается объекту theCtr.

Чтобы понять, как происходит этот процесс, следует четко уяснить принципы работы, справедливые для ВСЕХ перегруженных операторов, определенных с помощью ключевого слова operator. В случае с операторами с двумя операндами (такими как = или +) находящийся справа операнд объявляется как параметр функции оператора, заданной в конструкторе. Так, выражение

а = b

объявляется как

a.operator=(b);

Что произойдет, если изменить порядок присвоения, как в следующем примере:

1: Counter theCtr(5);

2: int theShort = theCtr;

3: cout << "theShort : " << theShort << endl;

Вновь компилятор покажет сообщение об ошибке. Хотя сейчас компилятор уже знает, как создать временный объект Counter для принятия значения типа int, но он не знает, как осуществить обратный процесс.

Операторы преобразования типов

 Чтобы разрешить эту и подобные ей проблемы, в C++ есть специальные операторы преобразования типов, которые можно добавить в пользовательский класс. В результате появится возможность явного преобразования типа пользовательского класса к любому из базовых типов данных языка программирования. Реализация этой возможности показана в листинге 10.18. Только одно замечание: в операторах преобразований не задается тип возврата. Даже если их работа напоминает возврат функции, в действительности они возвращают преобразованное значение.

Листинг 10.18. Преобразования данных типа Counter в тип unsigned short

1: #include <iostream.h>

2:

3: class Counter

4: {

5: public:

6: Counter;

7: Counter(int val);

8: ~Counter{ }

9: int GetItsValconst { return itsVal; }

10: void SetItsVal(int x) { itsVal = x; }

11: operator unsigned short;

12: private:

13: int itsVal;

14:

15: };

Поделиться:
Популярные книги

Мастер 9

Чащин Валерий
9. Мастер
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Мастер 9

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

В погоне за женой, или Как укротить попаданку

Орлова Алёна
Фантастика:
фэнтези
6.62
рейтинг книги
В погоне за женой, или Как укротить попаданку

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Королевская Академия Магии. Неестественный Отбор

Самсонова Наталья
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Королевская Академия Магии. Неестественный Отбор

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Жена на четверых

Кожина Ксения
Любовные романы:
любовно-фантастические романы
эро литература
5.60
рейтинг книги
Жена на четверых

Имя нам Легион. Том 3

Дорничев Дмитрий
3. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 3

Её (мой) ребенок

Рам Янка
Любовные романы:
современные любовные романы
6.91
рейтинг книги
Её (мой) ребенок

Отмороженный 11.0

Гарцевич Евгений Александрович
11. Отмороженный
Фантастика:
боевая фантастика
рпг
попаданцы
фантастика: прочее
фэнтези
5.00
рейтинг книги
Отмороженный 11.0

Утопающий во лжи 3

Жуковский Лев
3. Утопающий во лжи
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Утопающий во лжи 3

Третий. Том 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 4

Небо для Беса

Рам Янка
3. Самбисты
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Небо для Беса