Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОС_ответы.doc
Скачиваний:
35
Добавлен:
27.10.2018
Размер:
21.59 Mб
Скачать

Void define(double re,double im)

{real=re; imag=im;}

Void display()

{cout<<real<<"i"<<imag<<endl;}

};

введенный нами класс обладает правами типа. Таким образом, с его помощью можно определить объекты класса, или, как говорят, экземпляры класса:

complex x,y;

complex *py=&y;

complex z[5];

В созданных объектах имеются методы define() и display(), которые могут работать с членами-данными своих объектов. В памяти для каждого объекта создаются участки памяти и в этих участках размещаются собственные члены-данные. В отличие от членов данных, функции создаются в одном экземпляре.

После создания объектов, к их компонентам можно обращаться с помощью квалифицированных имен. Синтаксис доступа следующий:

имя_объекта.имя_элемента;

имя_объекта.имя_метода();

указатель_на_объект–>имя_компонента;

Например:

x.real=2;

x.imag=3;

py–>real=7;

py–>imag=8;

X.Define(1,2);

x.display(); //1+i2

py–>define(6,9);

py–>display(); //6+i9

Мы, только что, рассмотрели одну форму определения компонентных функций. Существует и другая форма, при которой в определении класса функции только описываются, т.е. помещается только прототип функции. А определение функции выполняется отдельно. Синтаксис такой:

тип_функции имя_класса :: имя_функции(параметры)

{тело функции;}

Например:

struct myclass{

int a;

Void set(int);

int get():

};

Void myclass::set(int c)

{a=c;}

Int myclass::get()

{return a;}

Здесь знак :: – это оператор расширения области видимости.

Такая форма обычно используется и имеет преимущество, поскольку описание класса можно поместить в любой заголовочный файл *.h, а реализацию методов, т.е. определение функций поместить в файл *.срр, оформить этот файл в виде библиотеки и, таким образом, защитить собственную реализацию методов от пользователя. Кроме того, поскольку функции обычно бывают большими, отсутствие их определений в описании класса повышает наглядность последних.

У созданного нами класса complex есть несколько существенных недостатков. Прежде всего, общедоступность его членов-данных. Для регулирования видимости или доступа к членам класса существует спецификаторы доступа: private, protected, public, после которых ставится двоеточие.

Все члены класса (члены-данные, члены-функции) приобретают тот статус по доступу, после какого спецификатора они стоят, вплоть до следующего встретившегося спецификатора. Например:

stuct complex1{

private:

double real;

double imag;

void display();

public:

void define(double,double);

};

void complex1::display()

{cout<<real<<"+i"<<imag<<endl;}

void complex1::define(double r,double i)

{real=r;

imag=i;

display();

}

int main()

{ complex1 x;

x.define(3,5);

//x.real=8; ошибка

//x.display(); ошибка

}

Ключевое слово protected регулирует доступ при наследовании, о нем будет сказано позднее.

Таким образом, введением механизма регулирования доступа к членам класса мы защищаем данные и методы от их возможного неправильного использования. Создание класса с использованием ключевого слова class по умолчанию защищает все члены класса, т.е. делает их приватными и изменить их видимость можно также с помощью названных спецификаторов. Приведем более сложный пример:

class complex{

double real, imag;

void display();

public:

void define(double,double);

void add(complex *,complex *);

};

void complex::display()

{cout<<real<<"+i"<<imag<<endl;}

void complex::define(double re,double im)

{real=re;

imag=im;

display();

}

void complex::add(complex *a,complex *b)

{real=a–>real+b–>real;

imag=a–>imag+b–>imag;

display();

}

int main()

{complex x,y,z;

x.define(3,5); //3+i5

y.define(2,4); //2+i4

z.define(&x,&y); //5+i9

return 0;

}