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),
което е изключително интересна тема.
.