Cтраница 3
Компилятор не может автоматически определить, как выполнять преобразования между типами, определяемыми пользователем, и встроенными типами. Программист должен определить в явном виде, как проводить такие преобразования. Эти преобразования могут осуществляться с использованием конструктора преобразования, т.е. конструктора с одним аргументом, который просто превращает объект некоторого типа в объект данного класса. [31]
Компилятор не может сам по себе знать, как осуществлять преобразования между встроенными типами и типами, определенными пользователем. Программист должен явно указать, как выполнять такие преобразования. Эти преобразования могут быть выполнены с помощью конструкторов преобразований - конструкторов с единственным аргументом, которые преобразуют объекты разных типов ( включая встроенные типы) в объекты данного класса. [32]
Этот конструктор берет аргумент char ( это по умолчанию пустая строка) и создает объект String, который включает эту строку символов. Конструктор преобразования преобразует соответствующую строку в объект String, который затем присваивается объекту-адресату String. Наличие этого конструктора преобразования означает, что нет необходимости применять перегруженную операцию специально для присваивания строк символов объектам String. Компилятор автоматически активизирует конструктор преобразования для создания временного объекта String, содержащего строку символов. [33]
Наличие такого конструктора преобразования означает, что нет необходимости предусматривать специальную операцию присваивания для присвоения объекту String строки символов. Компилятор автоматически вызывает конструктор преобразования, чтобы создать временный объект String, содержащий указанную строку. После этого вызывается перегруженная операция присваивания, чтобы присвоить временный объект String другому объекту String. Обратите внимание, что когда C использует конструктор преобразования таким образом, он может применить лишь один конструктор, чтобы попробовать удовлетворить потребности перегруженной операции присваивания. Наоборот, невозможно реализовать такое присваивание посредством выполнения ряда неявных преобразований, определенных пользователем. Конструктор преобразования вычисляет длину строки символов и присваивает это значение закрытому элементу данных length; использует new, чтобы присвоить указатель на выделенную под строку память закрытому элементу данных sPtr; вызывает assert для проверки успешности вызова new и, если память выделена, вызывает strcpy, чтобы скопировать строку символов в объект. [34]
Но как насчет типов, определяемых пользователем. Компилятор не может автоматически знать, как проводить преобразования между типами, определяемыми пользователем, и встроенными типами. Программист должен определить в явном виде, каким образом проводить такие преобразования. Преобразования такого рода могут проводиться с использованием конструктора преобразований, т.е. конструктора с одним аргументом, который просто превращает объект некоторого типа в объект данного класса. [35]
Компилятор не может сам по себе знать, как выполнять преобразования между встроенными типами и типами, определенными пользователем. Программист должен явно указать, как выполнять такие преобразования. Эти преобразования могут быть выполнены с помощью конструкторов преобразований - конструкторов с единственным аргументом, которые преобразуют объекты разных типов ( включая встроенные типы) в объекты данного класса. [36]
Рассмотрим специальные свойства конструкторов, имеющих единственный параметр. Это - конструкторы с дополнительными параметрами и стандартными значениями, которые, следовательно, могут быть вызваны с единственным параметром. Если единственный ( или первый) параметр является ссылкой на тот же тип данных, что и класс, то конструктор называется конструктором копирования. Если же параметр имеет тип, отличающийся от класса конструктора, то такой конструктор называется конструктором преобразования. [37]
Этот конструктор берет аргумент char ( это по умолчанию пустая строка) и создает объект String, который включает эту строку символов. Конструктор преобразования преобразует соответствующую строку в объект String, который затем присваивается объекту-адресату String. Наличие этого конструктора преобразования означает, что нет необходимости применять перегруженную операцию специально для присваивания строк символов объектам String. Компилятор автоматически активизирует конструктор преобразования для создания временного объекта String, содержащего строку символов. [38]
Порядок, в котором вызываются конструкторы и деструкторы базового и производного классов ( часть 5 из 5. [39] |
Несмотря на то, что объект производного класса также является и объектом базового, типы объектов производного класса и базового класса различны. Это имеет смысл, так как производный класс содержит элементы, соответствующие каждому из элементов базового класса, - как вы помните, обычно производный класс имеет больше элементов, чем базовый класс. В обратном направлении операция не имеет смысла, так как преобразование объекта базового класса в объект производного класса оставило бы дополнительные ( по отношению к базовому классу) элементы неопределенными. Хотя такое преобразование естественно не допускается, ему можно придать смысл при наличии соответствующей перегруженной операции присваивания или конструктора преобразования. [40]
Наличие такого конструктора преобразования означает, что нет необходимости предусматривать специальную операцию присваивания для присвоения объекту String строки символов. Компилятор автоматически вызывает конструктор преобразования, чтобы создать временный объект String, содержащий указанную строку. После этого вызывается перегруженная операция присваивания, чтобы присвоить временный объект String другому объекту String. Обратите внимание, что когда C использует конструктор преобразования таким образом, он может применить лишь один конструктор, чтобы попробовать удовлетворить потребности перегруженной операции присваивания. Наоборот, невозможно реализовать такое присваивание посредством выполнения ряда неявных преобразований, определенных пользователем. Конструктор преобразования вычисляет длину строки символов и присваивает это значение закрытому элементу данных length; использует new, чтобы присвоить указатель на выделенную под строку память закрытому элементу данных sPtr; вызывает assert для проверки успешности вызова new и, если память выделена, вызывает strcpy, чтобы скопировать строку символов в объект. [41]