Опубликован: 26.06.2003 | Уровень: для всех | Доступ: свободно
Лекция 7:

Классы и объекты

< Лекция 6 || Лекция 7: 12 || Лекция 8 >
Аннотация: Способы описания классов. Создание объектов. Обращение к атрибутам и методам объектов.

Понятие класса

До сих пор мы говорили о встроенных типах, т.е. типах, определенных в самом языке. Классы - это типы, определенные в конкретной программе. Определение класса включает в себя описание, из каких составных частей или атрибутов он состоит и какие операции определены для класса.

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

class Complex {
public:
     int real;   // вещественная часть
     int imaginary;   // мнимая часть
     void Add(Complex x); 
          // прибавить комплексное число
};

Приведенный выше пример - упрощенное определение класса Complex, представляющее комплексное число. Комплексное число состоит из вещественной части - целого числа real и мнимой части, которая представлена целым числом imaginary. real и imaginary - это атрибуты класса. Для класса Complex объявлена одна операция или метод - Add.

Определив класс, мы можем создать переменную типа Complex:

Complex number;

Переменная с именем number содержит значение типа Complex, то есть содержит объект класса Complex. Имея объект, мы можем установить значения атрибутов объекта:

number.real = 1;
number.imaginary = 2;

Операция "." обозначает обращение к атрибуту объекта . Создав еще один объект класса Complex, мы можем прибавить его к первому:

Complex num2;
number.Add(num2);

Как можно заметить, метод Add выполняется с объектом. Имя объекта (или переменной, содержащей объект, что, в сущности, одно и то же), в данном случае, number, записано первым. Через точку записано имя метода - Add с аргументом - значением другого объекта класса Complex, который прибавляется к number. Методы часто называются сообщениями. Но чтобы послать сообщение, необходим получатель. Таким образом, объекту number посылается сообщение Add с аргументом num2. Объект number принимает это сообщение и складывает свое значение со значением аргумента сообщения.

Определение методов класса

Данные рассуждения будут яснее, если мы определим, как выполняется операция сложения.

void
Complex::Add(Complex x)
{
   this->real = this->real + x.real;
   this->imaginary = this->imaginary + 
                     x.imaginary;
}

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

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

Теперь приведем этот небольшой пример полностью:

// определение класса комплексных чисел
class Complex {
public: 
     int real; // вещественная часть
     int imaginary; // мнимая часть
     void Add(Complex x);   
       // прибавить комплексное число
};
// определение метода сложения
void
Complex::Add(Complex x)
{
     real = real + x.real;
     imaginary = imaginary + x.imaginary;
}
int
main()
{
Complex number;
     number.real = 1;  
             // первый объект класса Complex
     number.imaginary = 3;
     Complex num2;   
             // второй объект класса Complex
     num2.real = 2;
     num2.imaginary = 1;
     number.Add(num2);  
             // прибавить значение второго
             // объекта к первому
     return 1;
}
< Лекция 6 || Лекция 7: 12 || Лекция 8 >
Андрей Одегов
Андрей Одегов
Можно ли пересдать ошибочно подтвержденный тест?
Елена Шумова
Елена Шумова
По поводу оплаты за сертификат
Максим Козинда
Максим Козинда
Россия, Тюмень, ТюмГАСА, 2009
Алишер Алькено
Алишер Алькено
Россия, Кокшетау