Програмен език C++
Част 37
.
Постоянни обекти
(const Objects)
.
(съдържание)
.
Обекти от един клас могат да се декларират като константи, подобно на предефинираните типове, но за да действа това означение, трябва и някои от функциите на класа да се декларират и дефинират като константни. В тази лекция ще се запознаем с тази особеност.

1. Обект-константа. В примерната програма по-долу, взета от превъзходния курс на Лафоор [1], е деклариран обекта noon от класа airtime като постоянен с ключовата дума const. Споменатият клас ни е известен от лекция 12.
.
// consta.cpp
// class models time data type

#include <iostream.h>
#include <conio.h>           // for getch()
#include <iomanip.h>         // for setfill(), etc.

class airtime
{
   private:
      int hours;            // 0 to 23
      int minutes;          // 0 to 59

   public:                  // constructor
      airtime() : hours(0), minutes(0)
      {   }

      // copy constructor
      airtime(int h, int m) : hours(h), minutes(m)
      {   }

      void display() const;    // declaration

      void get();              // declaration

};  // end class airtime

// output to screen
void airtime::display() const
{
   cout << hours << ':'         // hours and colon
        << setfill('0')         // fill character is '0'
        << setw(2) << minutes;  // minutes is 2 chars wide
}

// input from user
void airtime::get()
{
   char dummy;        // for colon
   cout << "\nEnter time (format 12:59): ";
   cin >> hours >> dummy >> minutes;
}

void main()
{
   const airtime noon(12, 0);     // create noon
   cout << "noon = ";
   noon.display();                // display noon

   noon.get();                    // change noon (bad!)
   cout << "noon = ";
   noon.display();                // display noon

   getch();

}   // main()

Обектът noon е нарочно с това име и представлява обедния час (12 часа на обед) и затова е уместно да бъде константа, т.е. час, който не се променя. Разбира се, с учебна цел, в главната функция е извикана функцията get() на класа airtime, с която се въвежда ново време. Тъй като обектът е дефиниран в главната програма с ключовата дума const, то компилаторът издава предупреждение:

[C++ Warning] Non-const function airtime::get() called for const object.

което се отнася за реда

  noon.get();                    // change noon (bad!)

Въпреки това програмата се компилира. Такова съобщение няма за функцията на класа display(), която е декларирана и дефинирана с ключовата дума const.

! Забележете, че и при декларацията и дефиницията е необходимо наличието на ключова дума const! Също така тази ключова дума не стои пред типа на връщане на функцията (в случая такъв няма поради ключовата дума void), а след името на функцията и преди точката и запетаята в декларацията. Ако забравите в дефиницията ключовата дума const, но в декларацията я има, компилаторът издава съобщение за грешка:

[C++ Error] 'airtime::display()' is not a member of 'airtime'.

Това е така, защото ключовата дума const променя името на функцията, добавяйки я към него. Разбира се, ако функцията е дифинирана вътре в спецификацията на класа, то тя се нуждае само от една ключова дума const.

2. Постоянни функции (const Functions). Както видяхме, ако искаме да дефинираме постоянни обекти (като обекта noon в предишния пример) то трябва не само да използваме ключовата дума const в дефиницията на обекта, но и да декларираме и дефинираме някои от функциите на класа като константни (постоянни) със същата ключова дума. Тези постоянни функции не могат да променят променливите на обектите! Ако в програмата consta.cpp по-горе промените декларацията и дефиницията на функцията на класа get() на константна по следния начин:

void airtime::get() const;     // declare constant function

и

void airtime::get() const    // define constant function
{                            // input from user cannot be called for const objects
   char dummy;
   cout << "\nEnter time (format 12:59): ";
   cin >> hours >> dummy >> minutes;
}

то компилаторът ще издаде съобщение за грешка:

[C++ Error] 'operator>>' not implemented in type 'istream' for arguments of type 'int'.

Това е така, защото не може да променяме променливи на обект с константни функции! Последно ще споменем, че конструкторите не могат да бъдат константни функции!

В следващата лекция ще покажем нагледно с примерни програми как се създават обекти от различните Storage Classes, и кога се извикват техните конструктори и деструктори. След това започваме да се занимаваме с т.н. предефиниране на оператори (Operator Overloading), което е изключително интересна тема.
.

(съдържание)
.
Литература
.
[1] Robert Lafore; C++ Interactive Course. Waite Group Press, Macmillan Computer Publishing, 1996.
.
Автор: Проф. Процесор Аритметиков
.
[ това е материал от брой 43 от септември 2010 г на списание "Коснос" www.kosnos.com ]
Keywords: С++,  OOP prиентирано програмиране , пКлючови думи: клас , обект, обектно ор
CONSTRUCTORS
Introducing Constructors Initialization Creation od Objects Destructors Constructors and Destructors in Action Same Name as the Class No Return Value
Initializing Variables Initialization List Default Constructor
Constructor Arguments “Calling” the Constructor A No-Argument Constructor
The One-Argument Constructor Conversions
Arrays as Instance Data Array Sized with Constant Array Sized with External const Initializing Member Variables Instance Data Initialization Initialization Is Not Assignment Arrays Sized at Compile Time The enum Hack Static Constant Variables Initializing a Member Array
Copy Constructors Copying Variables Equivalent Syntax Copying Objects The Default Copy Constructor const for Function Arguments
Passing by Reference Passing by Value Argument Must Be Passed by Reference Argument Should Be const
Initialization List A Variation on strcpy() Other Reasons for Using Copy Constructors Copy Constructor Invoked in Pass by Value Passing by Value Creates a Copy Why the Copy Constructor Must Use a Reference Argument Copy Constructor Invoked in Return by Value
const Objects const Functions
Visualizing Construction and Destruction Variables in main() Passing by Value Local Variables