15.9.2. Конструктор как конвертер

15.9.2. Конструктор как конвертер

Набор конструкторов класса, принимающих единственный параметр, например, SmallInt(int) класса SmallInt, определяет множество неявных преобразований в значения типа SmallInt. Так, конструктор SmallInt(int) преобразует значения типа int в значения типа SmallInt.

extern void calc( SmallInt );

int i;

// необходимо преобразовать i в значение типа SmallInt

// это достигается применением SmallInt(int)

calc( i );

При вызове calc(i) число i преобразуется в значение типа SmallInt с помощью конструктора SmallInt(int), вызванного компилятором для создания временного объекта нужного типа. Затем копия этого объекта передается в calc(), как если бы вызов функции был записан в форме:

// Псевдокод на C++

// создается временный объект типа SmallInt

{

SmallInt temp = SmallInt( i );

calc( temp );

}

Фигурные скобки в этом примере обозначают время жизни данного объекта: он уничтожается при выходе из функции.

Типом параметра конструктора может быть тип некоторого класса:

class Number {

public:

// создание значения типа Number из значения типа SmallInt

Number( const SmallInt & );

// ...

};

В таком случае значение типа SmallInt можно использовать всюду, где допустимо значение типа Number:

extern void func( Number );

SmallInt si(87);

int main()

{ // вызывается Number( const SmallInt & )

func( si );

// ...

}

Если конструктор используется для выполнения неявного преобразования, то должен ли тип его параметра точно соответствовать типу подлежащего преобразованию значения? Например, будет ли в следующем коде вызван SmallInt(int), определенный в классе SmallInt, для приведения dobj к типу SmallInt?

extern void calc( SmallInt );

double dobj;

// вызывается ли SmallInt(int)? Да

// dobj преобразуется приводится от double к int

// стандартным преобразованием

calc( dobj );

Если необходимо, к фактическому аргументу применяется последовательность стандартных преобразований до того, как вызвать конструктор, выполняющий определенное пользователем преобразование. При обращении к функции calc()употребляется стандартное преобразование dobj из типа double в тип int. Затем уже для приведения результата к типу SmallInt вызывается SmallInt(int).

Компилятор неявно использует конструктор с единственным параметром для преобразования его типа в тип класса, к которому принадлежит конструктор. Однако иногда удобнее, чтобы конструктор Number(const SmallInt&) можно было вызывать только для инициализации объекта типа Number значением типа SmallInt, но ни в коем случае не для выполнения неявных преобразований. Чтобы избежать такого употребления конструктора, объявим его явным (explicit):

class Number {

public:

// никогда не использовать для неявных преобразований

explicit Number( const SmallInt & );

// ...

};

Компилятор никогда не применяет явные конструкторы для выполнения неявных преобразований типов:

extern void func( Number );

SmallInt si(87);

int main()

{ // ошибка: не существует неявного преобразования из SmallInt в Number

func( si );

// ...

}

Однако такой конструктор все же можно использовать для преобразования типов, если оно запрошено явно в форме оператора приведения типа:

SmallInt si(87);

int main()

{ // ошибка: не существует неявного преобразования из SmallInt в Number

func( si );

func( Number( si ) ); // правильно: приведение типа

func( static_cast Number ( si ) ); // правильно: приведение типа

}

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Софтерра: Вычислительный конструктор

Из книги Журнал «Компьютерра» № 9 от 7 марта 2006 года автора Журнал «Компьютерра»

Софтерра: Вычислительный конструктор Автор: Сергей Гладких sergeyxtr@gmail.comЧеловечество штурмует (или точнее будет сказать — осаждает?) неприступную крепость математики вот уже несколько тысячелетий. Раньше в этом бою мы могли полагаться только на свои собственные силы, на


Дополнительные инструменты окна Titler (Конструктор титров)

Из книги Видеосамоучитель монтажа домашнего видео в Adobe Premiere Pro CS3 автора Днепров Александр Г

Дополнительные инструменты окна Titler (Конструктор титров) Добавим еще два статичных титра в фильм, рассмотрев на примере их создания некоторые дополнительные инструменты окна Titler (Конструктор титров).1. Установите курсор текущей позиции редактирования на клип Image1.jpg.2.


Конструктор, заданный по умолчанию

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Конструктор, заданный по умолчанию Заданный по умолчанию конструктор агента "жестко" определяет значение URL удаленного Web-сервиса и запоминает это значение в наследуемом свойстве Url.public CalculatorWebService() { this.Url = "http://localhost/CalcServicе/Service.asmx";}Очевидным недостатком такого подхода


Конструктор узоров

Из книги Photoshop. Мультимедийный курс автора Мединов Олег

Конструктор узоров Фильтр Конструктор узоров позволяет создать узор из любого фрагмента изображения. При выборе команды меню Фильтр ? Конструктор узоров появляется окно фильтра (рис. 11.51). Рис. 11.51. Окно фильтра Конструктор узоровФильтр содержит множество настроек, с


Работа с диаграммами на вкладках Конструктор и Макет

Из книги Excel. Мультимедийный курс автора Мединов Олег

Работа с диаграммами на вкладках Конструктор и Макет Несколько изменим вид круговой диаграммы.• Выделите диаграмму и перейдите на вкладку Конструктор.• Раскройте галерею Макеты диаграмм и выберите Макет 1.Обратите внимание, что легенда справа от диаграммы исчезла. В


Конструктор класса

Из книги Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT автора Фролов Александр Вячеславович

Конструктор класса Класс CString имеет несколько различных конструкторов, позволяющих создавать строки на основе различных данных.Конструктор класса CString, используемый по умолчанию, не имеет параметров. Он создает пустую строку. В последствии вы можете записать в нее любой


Описание работы пакета OOoFBTools I Конвертер ExportToFB21 1. Описание

Из книги Описание работы пакета OOoFBTools Создание книг FB2 автора Кузнецов Вадим

Описание работы пакета OOoFBTools I Конвертер ExportToFB21 1. Описание 1.1. НазначениеКроссплатформенный конвертер ExportToFB21 предназначен для конвертации документов из форматов, поддерживаемых OpenOffice.org Writer в формат fb2.1.Т.о. входные форматы документов для ExportToFB21 следующие:.doc, dot, rtf, txt,


Конструктор

Из книги Как сделать свой сайт и заработать на нем. Практическое пособие для начинающих по заработку в Интернете автора Мухутдинов Евгений


Главный конструктор «Уралов»

Из книги Информационные технологии в СССР. Создатели советской вычислительной техники автора Ревич Юрий Всеволодович

Главный конструктор «Уралов» После завершения работ по «Стреле» он с удвоенной энергией берется за создание машины «Урал-1» (той самой, что на много лет стала потом «рабочей лошадкой» во многих ВЦ страны) с дальним прицелом создать семейство машин, начиная от ЭВМ малой


Конструктор ЭВМ

Из книги C++ для начинающих автора Липпман Стенли

Конструктор ЭВМ Будучи руководителем Вычислительного центра АН УССР, а затем директором Института кибернетики, костяком которых стал коллектив, работавший над первыми отечественными ЭВМ, В. М. Глушков просто не мог не втянуться в область создания средств вычислительной


14.2. Конструктор класса

Из книги автора

14.2. Конструктор класса Среди других функций-членов конструктор выделяется тем, что его имя совпадает с именем класса. Для объявления конструктора по умолчанию мы пишем2:class Account {public:// конструктор по умолчанию ...Account();// ...private:char *_name;unsigned int _acct_nmbr;double _balance;};Единственное


14.2.1. Конструктор по умолчанию

Из книги автора

14.2.1. Конструктор по умолчанию Конструктором по умолчанию называется конструктор, который можно вызывать, не задавая аргументов. Это не значит, что такой конструктор не может принимать аргументов; просто с каждым его формальным параметром ассоциировано значение по


14.2.3. Копирующий конструктор

Из книги автора

14.2.3. Копирующий конструктор Инициализация объекта другим объектом того же класса называется почленной инициализацией по умолчанию. Копирование одного объекта в другой выполняется путем последовательного копирования каждого нестатического члена. Проектировщик


17.4.1. Конструктор базового класса

Из книги автора

17.4.1. Конструктор базового класса В нашем базовом классе объявлено два нестатических члена: _solution и _loc:class Query {public:// ...protected:setshort *_solution;vectorlocation _loc;// ...};Конструктор Query по умолчанию должен явно инициализировать только член _solution. Для инициализации _loc автоматически вызывается


17.4.2. Конструктор производного класса

Из книги автора

17.4.2. Конструктор производного класса В классе NameQuery также определены два конструктора. Они объявлены открытыми, поскольку ожидается, что в приложении будут создаваться объекты этого класса:class NameQuery : public Query {public:explicit NameQuery( const string& );NameQuery( const string&, const vector* );// ...protected://