Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Языки программирования.docx
Скачиваний:
3
Добавлен:
09.09.2019
Размер:
64.85 Кб
Скачать

Встроенная функция

…Многопропусков…

Присваивание параметрам в классе значений по умолчанию.

Class Bar

{

Public:

Box(){cout<<”default constructor called\n”;}

Box(double fr=1.0, double hv=1.0, double bv=1.0

{ cout<<”Constructor called\n”;

L=lv;H=hv;W=bv;} double Volume() {return L*H*W;}

Double L,H,W;

};

Int main()

{

Box box1;

Box matchbox(1.5,2.5,2.0);

Double V=box1.volume();

Cout<<”the volume of box1=”<<V<<endl;

Cout<<”the volume of matchbox=”<< matchbox.volume()<<endl;

Return 0;

}

Если запустить такую программу, то мы получим сообщение об ошибке, а именно, компилятор считает, что определено множество конструкторов по умолчанию и он не может решить, какой из них следует вызывать для того, чтобы создать объект без параметров (Box1). Дело в том, что объект Box1 требует конструктор без параметров, а теперь оба конструктора могут быть вызваны без параметров. Решение подобной проблемы заключается в том, чтобы избавиться от конструктора без параметра. Закомментируем строчку под public и все заработает.

Class Box

{

Public:

Box(double fr=1.0, double hv=1.0, double bv=1.0

{ cout<<”Constructor called\n”;

L=lv;H=hv;W=bv;} double Volume() {return L*H*W;}

Double L,H,W;

};

Int main()

{

Box matchbox(1.5,2.5,2.0);

Box box1(matchbox);

Double V=box1.volume();

Cout<<”the volume of box1=”<<V<<endl;

Cout<<”the volume of matchbox=”<< matchbox.volume()<<endl;

Return 0;

}

Допустим, мы хотим инициализировать объект box1 через matchbox. Это значит, что мы хотим создать объект box1 через matchbox. В таких случаях вызывается конструктор копирования по умолчанию. Конструктор копирования создает объект класса, инициализируя его объектом того же класса. В каких то случаях, компилятор генерирует версию конструктора копирования по умолчанию. Такой конструктор создает новый объект путем копирования существующего член за членом. Однако, этого достаточно для таких простых классов, как наш класс box, в которых не содержатся указатели или массивы, в качестве членов. В каких то случаях мы сами обязаны создать конструктор копирования.

Приватные или защитные члены класса

Для защиты членов класса используется ключевое слово private. Члены класса, специфицированные или объявленные, как приватные, в общем случае могут быть доступны только функциям-членам этого же класса.

Class Box

{

Private: double L,H,W;

Public:

Box(double fr=1.0, double hv=1.0, double bv=1.0

{ cout<<”Constructor called\n”;

L=lv;H=hv;W=bv;} double Volume() {return L*H*W;}

};

Int main()

{

Box matchbox(1.5,2.5,2.0);

Box box1(matchbox);

Double V=box1.volume();

Cout<<”the volume of box1=”<<V<<endl;

Cout<<”the volume of matchbox=”<< matchbox.volume()<<endl;

Return 0;

}

Наличие возможности спецификации членов класса как приватные, позволяет отделить интерфейс класса от его внутренней реализации, где интерфейс класса состоит из общедоступных (public) функций членов, поскольку они могут обеспечить непрямой доступ ко всем членам класса, включая приватные. Сохраняя внутренности класса приватными, позднее их можно модифицировать без необходимости модификации остального кода, который используется этим классом через его общедоступный интерфейс.