Программирование >>  Расширенная версия языка c++ 

1 ... 130 131 132 [ 133 ] 134 135 136 ... 227


Здесь у конструктора класса 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 ; *



1 ... 130 131 132 [ 133 ] 134 135 136 ... 227

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика