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

1 ... 25 26 27 [ 28 ] 29 30 31 ... 159


компоненты-функции без спецификатора const нельзя вызывать для объектов со спецификатором const (при таком вызове компилятор выдает либо предупреждение, либо ошибку);

>- компоненты-функции со спецификатором const не могут изменить значение компонента объекта без явной записи указателя this (см. последний пример).

3.4. Инициализация объекта

(конструкторы)

Использование функций, подобных рассмотренным выше set string и set, для установки начальных значений компонентам-данным объекта (для инициализации объекта) неестественно и часто приводит к ошибкам (например, можно забыть проинициализировать объект или сделать это многократно). В связи с этим введена специальная функция, позволяющая инициализировать объект в процессе его объявления. Поскольку эта функция назначает начальные значения компонентам и по-английски это звучит как а function constructs values , то она названа конструктором (от англ. constructor ). Функция конструктор имеет то же имя, что и соответствующий класс. Ниже приведен пример использования конструктора для рассмотренного в § 3.1 класса string.

class string { char str[25]; public:

string (char* s) { strcpy(str,s); } это конструктор другие функции класса

Конструктор может иметь и не иметь аргументы и он никогда не возвращает значения (даже типа void). В нашем примере конструктор с именем string имеет один аргумент. Класс может иметь несколько конструкторов, что позволяет использовать несколько различных способов инициализации соответствующих объектов. Рассмотрим пример: class my class {



int a,b,c; public:

my class{void); a,b и с получают некоторые предопределенные значения (значения, заданные по умолчанию) my class(int); а - явное значение, b и с - по

умолчанию; my class(int,int); а и b - явные значения, с - по

умолчанию; my class{int,int,int); а, b и с - явные значения

Теперь мы можем объявить объект одним из следующих способов:

my class my object1; a,b и с задаются по умолчанию my class my object2(50); а=50, b и с задаются

по умолчанию my class my object3(50,60); а=50, b=60, с задается

по умолчанию my class my object4(50,60,70); а=50, b=60, с=70

В конструкторе можно также использовать аргументы, заданные по умолчанию. Рассмотрим пример:

class my class {

int a,b,c; public:

my class(int ia=10, int ib=20, int ic=30) {a=ia;b=ib;c=ic;}

Теперь мы можем объявить объекты так: my class my object1; а=10, b=20, с=30 my class my object2(100); а=100, b=20, с=30 my ciass my object3(100,150); a=100, b=150, c=30 my class my object4(100,150,170); a=100, b=150, c=170

По аналогии с конструктором любая функция в языке С++ может иметь аргументы, заданные по умолчанию. Здесь применяется такое правило. Если функция имеет аргумент, заданный по умолчанию, то после него могут идти только



аргументы, тоже заданные по умолчанию. Рассмотрим примеры:

int f1(int a.char b=#,float f); ошибка

int f2{int a.char b-#,float f=5.28); нет ошибки

Объект класса, у которого нет конструктора, можно инициализировать, присвоив ему значение другого объекта того же класса. Если у соответствующего класса есть конструктор, то либо этот конструктор должен иметь аргументы, заданные по умолчанию, либо необходимо объявить и описать конструктор для копирования (сору constructor). Последний тип конструктора будет рассмотрен позже. Приведем пример:

my class my object1;

my class my object = my object1;

Рассмотрим примеры использования конструкторов. Во всех программах для упрощения не производится обработка возможных ошибочных ситуаций. В реальных программах надо всегда производить такую обработку. Этим вопросам посвящена гл. 7.

В первом примере вводится конструктор в программу, рассмотренную в § 3.2.

#include <iostream.h> class my class { int x,y; public:

my class(int X,int Y) { x=X; y=Y; } это первы!

конструктор my class() { x=y=0; } это второй конструктор

my ciass f(my ciass);

my class* ff(void) { x=y=100; return this; }

void displayO { cout x V У endl; }

my class my class::f(my class M) { x-l-=M.x; y-l-=M.y;

return *this; }

void main(void)

{my class A(10,20),B; использование первого конструктора



1 ... 25 26 27 [ 28 ] 29 30 31 ... 159

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