|
Язык программирования C++ |
Классы и объекты
Понятие класса
До сих пор мы говорили о встроенных типах, т.е. типах, определенных в самом языке. Классы - это типы, определенные в конкретной программе. Определение класса включает в себя описание, из каких составных частей или атрибутов он состоит и какие операции определены для класса.
Предположим, в программе необходимо оперировать комплексными числами. Комплексные числа состоят из вещественной и мнимой частей, и с ними можно выполнять арифметические операции.
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;
}