Опубликован: 26.06.2003 | Доступ: свободный | Студентов: 1 / 0 | Оценка: 4.07 / 3.80 | Длительность: 15:08:00
ISBN: 978-5-9556-0017-8
Лекция 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 >
Андрей Одегов
Андрей Одегов
Язык программирования C++
Елена Шумова
Елена Шумова

Здравствуйте! Я у Вас прошла курс Язык программировая Си++.

Заказала сертификат. Хочу изменить способ оплаты. Как это сделать?


( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.1109101554448watchdog( )../bootstrap.inc:0
23.1111101556888module_invoke( )../bootstrap.inc:967
33.1111101558744call_user_func_array ( )../module.inc:462
43.1111101559080devel_watchdog( )../module.inc:462
53.1112101559928decode_entities( )../devel.module:382
63.1113101561848drupal_error_handler( )../devel.module:340
73.1113101565456watchdog( )../common.inc:663
83.1113101567496module_invoke( )../bootstrap.inc:967
93.1113101569352call_user_func_array ( )../module.inc:462
103.1113101569688devel_watchdog( )../module.inc:462
113.1114101570384decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.1109101554448watchdog( )../bootstrap.inc:0
23.1111101556888module_invoke( )../bootstrap.inc:967
33.1111101558744call_user_func_array ( )../module.inc:462
43.1111101559080devel_watchdog( )../module.inc:462
53.1112101559928decode_entities( )../devel.module:382
63.1113101561848drupal_error_handler( )../devel.module:340
73.1113101565456watchdog( )../common.inc:663
83.1113101567496module_invoke( )../bootstrap.inc:967
93.1113101569352call_user_func_array ( )../module.inc:462
103.1113101569688devel_watchdog( )../module.inc:462
113.1114101570384decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.1109101554448watchdog( )../bootstrap.inc:0
23.1111101556888module_invoke( )../bootstrap.inc:967
33.1111101558744call_user_func_array ( )../module.inc:462
43.1111101559080devel_watchdog( )../module.inc:462
53.1112101559928decode_entities( )../devel.module:382
63.1121101562040drupal_error_handler( )../devel.module:340
73.1121101565728watchdog( )../common.inc:663
83.1121101567768module_invoke( )../bootstrap.inc:967
93.1121101569624call_user_func_array ( )../module.inc:462
103.1122101569960devel_watchdog( )../module.inc:462
113.1122101570736decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.1109101554448watchdog( )../bootstrap.inc:0
23.1111101556888module_invoke( )../bootstrap.inc:967
33.1111101558744call_user_func_array ( )../module.inc:462
43.1111101559080devel_watchdog( )../module.inc:462
53.1112101559928decode_entities( )../devel.module:382
63.1121101562040drupal_error_handler( )../devel.module:340
73.1121101565728watchdog( )../common.inc:663
83.1121101567768module_invoke( )../bootstrap.inc:967
93.1121101569624call_user_func_array ( )../module.inc:462
103.1122101569960devel_watchdog( )../module.inc:462
113.1122101570736decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.1127101554992watchdog( )../bootstrap.inc:0
23.1127101557032module_invoke( )../bootstrap.inc:967
33.1127101558888call_user_func_array ( )../module.inc:462
43.1127101559224devel_watchdog( )../module.inc:462
53.1128101559928decode_entities( )../devel.module:382
63.1128101561848drupal_error_handler( )../devel.module:340
73.1128101565456watchdog( )../common.inc:663
83.1128101567496module_invoke( )../bootstrap.inc:967
93.1128101569352call_user_func_array ( )../module.inc:462
103.1128101569688devel_watchdog( )../module.inc:462
113.1129101570384decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.1127101554992watchdog( )../bootstrap.inc:0
23.1127101557032module_invoke( )../bootstrap.inc:967
33.1127101558888call_user_func_array ( )../module.inc:462
43.1127101559224devel_watchdog( )../module.inc:462
53.1128101559928decode_entities( )../devel.module:382
63.1128101561848drupal_error_handler( )../devel.module:340
73.1128101565456watchdog( )../common.inc:663
83.1128101567496module_invoke( )../bootstrap.inc:967
93.1128101569352call_user_func_array ( )../module.inc:462
103.1128101569688devel_watchdog( )../module.inc:462
113.1129101570384decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.1127101554992watchdog( )../bootstrap.inc:0
23.1127101557032module_invoke( )../bootstrap.inc:967
33.1127101558888call_user_func_array ( )../module.inc:462
43.1127101559224devel_watchdog( )../module.inc:462
53.1128101559928decode_entities( )../devel.module:382
63.1133101562040drupal_error_handler( )../devel.module:340
73.1133101565728watchdog( )../common.inc:663
83.1134101567768module_invoke( )../bootstrap.inc:967
93.1134101569624call_user_func_array ( )../module.inc:462
103.1134101569960devel_watchdog( )../module.inc:462
113.1134101570736decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
13.1127101554992watchdog( )../bootstrap.inc:0
23.1127101557032module_invoke( )../bootstrap.inc:967
33.1127101558888call_user_func_array ( )../module.inc:462
43.1127101559224devel_watchdog( )../module.inc:462
53.1128101559928decode_entities( )../devel.module:382
63.1133101562040drupal_error_handler( )../devel.module:340
73.1133101565728watchdog( )../common.inc:663
83.1134101567768module_invoke( )../bootstrap.inc:967
93.1134101569624call_user_func_array ( )../module.inc:462
103.1134101569960devel_watchdog( )../module.inc:462
113.1134101570736decode_entities( )../devel.module:382