|
Программирование >> Расширенная версия языка c++
Здесь у конструктора класса myclass имеется один параметр. Обратите особое внимание на то, как в функции mainO объявлен объект ob. Значение 4, заданное в скобках сразу за объектом ob, - это аргумент, который передается параметру х конструктора и с помощью которого инициализируется переменная а. Именно такая форма инициализации использовалась в примерах программ, начиная с первых глав этой книги. Однако это не единственный способ инициализации. Рассмотрим, к примеру, следующую инструкцию: myclass ob = 4; эта инструкция автоматически преобразуется в инструкцию myclass оЬ(4),- Как показано в комментариях, эта форма инициализации автоматически преобразуется в вызов конструктора myc]ass() со значением 4 в качестве аргумента. Таким образом, предыдущая инструкция обрабатывается компилятором так, как будто на ее месте находится инструкция: myclass ob(4) ; Как правило, всегда, когда у конструктора имеется только один аргумент, можно использовать любую из представленных выше двух форм инициализации объекта. Смысл второй формы инициализации в том, что для конструктора с одним аргументом она позволяет организовать неявное преобразование типа этого аргумента в тип класса, к которому относится конструктор. Неявное преобразование можно запретить с помощью спецификатора explicit (явнгй). Спецификатор explicit применим только к конструкторам. Для конструкторов, заданных со спецификатором explicit, допустим только обычный синтаксис. Автоматического преобразования для таких конструкторов не выполняется. Например, если в предыдущем примере конструктор класса myclass объявить со спецификатором explicit, то для такого конструктора автоматического преобразования поддерживаться не будет. В представленном ниже классе конструктор myclass() объявлен со спецификатором explicit. ttinclude <iostream> .- ; < : .>: . using namespace std; . .; , v-.Ъ. - ;. -.i-r. : class myclass { int a; piiblic; . explicit SS (int x) { a } . . - ... in a() { return a; } Для такого класса допустима только одна форма конструкторов: myclass 1. В классе может быть более одного преобразующего конструктора. Например, рассмотрим следующую версию класса myclass. , ♦include <iostreain> .- >~ tinclude <cstdlib> . ;t. using namespace Stdf class myclass { ...... int a; public: myclass (intx) { a = x; } у ,y ч.-лм-.у: .; --. . myclass (char *str) { (str); } .i; ч.:.. int getaO { return a; } i > . . t ; . 1 /У ! .. n i jij int mainO .1. . . . . зовамие в вызов конструктора myclass ob{4) / i myciass оЫ = 4; , , , ,- , - .- эование эов конструктора myclass ob( 123 ) - myclass ob2 = 123 ; cou obl.getaO endl; cout ob2: ob2.geta() endi; return 0; Поскольку типы аргументов обоих конструкторов различны (как это и должно быть) каждая инструкция инициализации автоматически преобразуется в соответствующий вызов конструктора. 2. Автоматическое преобразование на основе типа первого аргумента конструктора в вызов самого конструктора имеет интересное применение. Например, для класса myclass из примера 1, чтобы присвоить объектам оЫ и оЬ2 новые значения, функция main() выполняет преобразования из типа int в тип char *. finclude <iostreaii:i> finclude <cstdlib> using namespace std; : ; , class myclass { int a; * . public: myclass (iLnt x) { a = x; } myclass (char *str) { (str); } i .; гл.- ... in () { return a; } int main О преобразование в вызов конструктора myclass ob(4) myclass оЫ = 4; преобразование в вызов конструктора myclass ob( 123 ) class ob2 = 123 ; cou obl.getaO endl; , . cout ob2: ob2.geta() endl; /* использование автоматического преобразования для присваивания новых значений преобразование в вызов конструктора myclass ob( 1776 ) myclass obi = 1776 ; преобразование в вызов конструктора myclass myclass ..;..u = 2 001; cout endl; cout ob2: ob2.geta() endl; return 0; ;) - . 3. Чтобы запретить показанные в предыдущих примерах преобразования, для конструкторов можно задать спецификатор explicit: ♦include <iostream> ftinclude<cstdlib> using namespace std; class myclass ( int a; public: . . , explicit ss (int x) { a = x; } . . explicit myclass(char *str) { a = atoi(str); } int { return a; } int main0 ,i ::.,.Ta> . .....u --i { r-.i-c. преобразование в вызов конструктора myclass myclass obi = 4; . преобразование в вызов конструктора myclass myclass 1 - 123 ; *
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |