Знак :: определяет принадлежность функции show() контексту класса Point (Point::show()), хотя определение функции физически расположено вне описания класса.
В описании класса объявлен объект (переменная) p1 - типа Point, непосредственно при описании класса. Кроме того, после введения описания класс можно использовать как новый тип данных и объявлять объекты следующим образом:
Point P2,Center; //указывать ключевое слово class уже нет необходимости
Отметим, что описание класса Point задает только формальный шаблон для множества объектов данного класса. Объявленные переменные p1, Р2, Center - объекты типа Point, с элементами которых осуществляется работа в программе. Так можно записать Р2=Р1, что будет обозначать присвоение координат из Р1 (х и у) переменным объекта Р2. В то же время запись Point=Р2; - бессмысленна. Переменные Х и У определяют атрибуты (свойства) класса (то, что класс имеет), а методы (поведение) - то, что класс делает.
Добавим к описанию класса Point два простых метода GetX и GetY.
Запишем:
class Point { int X,Y,C;
public: void show (void); // void - пустое значение, используемое здесь
// в качестве типа /возвращаемого значения и в качестве списка
// передаваемых параметров
int GetX() {return X;}; //определение метода внутри класса
int GetY();}; //объявление метода внутри класса
void Point::show(void)
{ putpixel(X,Y,C); } //определение методов вне
int Point ::GetY( ) { return Y; } //описания классов
Метод GetX() в примере определен как встроенная функция. Такой способ определения метода – внутри описания класса – используется в случае "небольших" функций (на практике – до 40 операторов). Компилятор при этом способе выполняет не стандартный вызов функции, а реализует макрорасширение команды вызова кодом функции, т.е. встраивает код вызываемой функции в точку вызова вместо обычного перехода по адресу размещения функции с последующим возвратом в точку вызова. Это снижает накладные расходы, связанные с обращением к функции и выходом из нее. На встраиваемые функции налагается ряд ограничений. Если ограничения не позволяют компилятору выполнить макрорасширение вызовов встроенной функцией, это не рассматривается как ошибка. Выдается соответствующее предупреждение, а функция реализуется по типу метода, определенного вне описания (но в контексте) класса, и ее вызов оформляется стандартным образом (по аналогии с методом void show(void)).
Методы GetY() и show() объявляются внутри класса и определяются в произвольном месте программы вне тела описания класса. Использование операции :: в определении методов (например, Point::GetY) указывает, что GetY принадлежит классу Point, т.к. в принципе могут существовать и другие версии GetY, принадлежащие другим классам. Кроме того, операция определяет и то, что Y в "return Y" является элементом Y из класса Point. Отметим, что внутреннее определение GetX не требует модификатора "Point::".
ВЫЗОВ КОМПОНЕНТОВ КЛАССА
Каким бы из рассмотренных способов ни объявлялся метод, важно то, что он функционирует внутри области действия класса Point независимо от его физического расположения. Если определить объект Point P1, то к доступным компонентам (объявленным как public:) можно обращаться так же, как к компонентам структур или смесей в С (связывание операцией "." - точка).
Р1.GеtX(); P1.show();
Обобщенная форма вызова:
имя-объекта-класса.имя-метода(описание аргументов);
Переменные X и Y в классе Point являются частными (private). Это значит, что обращение к ним вида Р1.Х или Р1.У приведет к возникновению ошибки, так как к переменным private имеется доступ только из функции, принадлежащей данному классу, или в функции, объявленной другом (friend) данного класса. Так, внутри метода GetY() имеется обращение к частному компоненту класса переменной Y. Префикс точка здесь не используется. Если же функция обращается к компоненту другого класса, уточнение является обязательным.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.