АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Перегрузка операторов преобразования типа

Читайте также:
  1. Артериальная гипертония, анемия перегрузка жидкостью и натрием
  2. Виртуальная память. Алгоритм преобразования виртуального адреса в физический
  3. Договорные отношения в туризме. Работа туроператоров с поставщиками туристических услуг и партнёрами
  4. Определение преобразования Фурье
  5. Основные приёмы преобразования рядов динамики. 1. Приёмы изучения сезонных колебаний.
  6. Первые преобразования большевиков в политической и социально-экономической сферах.
  7. Послевоенные преобразования оккупационного периода
  8. Преобразование переменных в регрессионных моделях. Базовая процедура преобразования переменных. Логарифмические преобразования. Нелинейные регрессионные модели.
  9. Преобразования Мэйдзи и их последствия для японской экономики.
  10. Преобразования Петра I
  11. Преобразования, уравнения которых в качестве лаговых объясняющих переменных включают значения зависимых переменных

 

В С++ существуют операторы преобразования типов. Это является хорошим способом использования конструктора для преобразования типа. Конструктор не может выполнять следующие преобразования:

ƒ неявное преобразование из типа, определяемого пользователем в базовый тип. Это связано с тем, что базовые типы не являются классами.

ƒ преобразование из нового класса в ранее определенный класс, не модифицируя объявление ранее определенного класса.

 

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

X::operator T() // определяет преобразования класса X в тип данных T (T — класс или базовый тип)

 

class Number

{

public:

operator int();

operator Complex();

};

Number::operator int()

{

...

}

Number::operator Complex()

{

...

}

 

Оператор преобразования типа возвращает значение типа T, однако в сигнатуре оператора он не указывается. В этом смысле операторы преобразования типа похожи на конструкторы. Хотя конструктор не может использоваться для неявного преобразования типа из класса в базовый тип, он может использоваться для неявного преобразования типа из класса в класс. В программе следует избегать любых неявных преобразований типов, так как это приводит к ошибкам. С помощью ключевого слова explicit можно запретить неявное преобразования типа конструкторам.

classFile

{

public:

File();

explicit File(const char* name); // одновременно не могут быть определены, надо выбирать один из них

explicit File(const char* name, intmode = FILE_READ);

};

 

File myFile;

myFile=”OOP.cpp” // используется File(const char* name), если нет explicit.

 

Когда компилятор использует функцию File(const char*name)? Если ключевое слово explicit присутствует в объявлении, то функция применяется только с явным приведением типов, в противном случае его можно использовать для неявного преобразования:

 

• Когда вы инициализируете объект File значением типа const char*.

• Когда вы присваиваете значение типа const char* объекту File.

• Когда вы передаете значение типа const char* функции, ожидающей аргумент типа File.

• Когда функция, объявленная как возвращающая значение File, пытается вернуть значение const char*.

• Когда любая из описанных ситуаций использует встроенный тип, который может быть автоматически преобразован в const char*.

 

Слово explicit записывается лишь для тех конструкторов, которые могут вызываться лишь с одним параметром. Если же они вызываются с несколькими параметрами, то неявное преобразование типов невозможно.

 

Если объект создается на стеке, то неявное преобразование типа часто бывает необходимо, тогда слово explicit писать не надо. Так же его надо писать, когда объект создается динамически. При перегрузке операторов нужно быть внимательным к типу возвращаемого значения: для некоторых операторов объект возвращается по ссылке, для некоторых – по значению:

 

X operator; // по значению

X &operator; // по ссылке

 

Для некоторых операторов возможен и первый и второй вариант перегрузки, поэтому программисту следует определяться с вариантом перегрузки.

 

Замечание по поводу преобразования типа в тернарном операторе(c? x: y).

 

class A {... };

class B: public A {... };

class C: public A {... };

 

A* p = cond? new B: new C;

 

вызовет ошибку компилятора, поскольку между типами выражений "new B" и "new C" выбирается общий тип, а такого нет. Ошибку следует устранить, выполнив преобразование " new B" или " new C" к общему типу, например:

 

A* p = cond? (A*) new B: new C;

или

A* p = cond? new B: (A*)new C;

или

A* p = cond? (A*)new B: (A*)new C; // самый лучший вариант

? Тип выражения выбирается исходя из 1го выражения


20. Шаблоны функций. Перегрузка шаблонов функций. Шаблоны классов. Специализации шаблонов. Стандартная библиотека шаблонов Standard C++ Library. Строки. Итераторы. Потоки ввода-вывода.


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)