Главная » Статьи » Програмування » C++ [ Добавить статью ]

RUS Уроки по программированию на языке С++ (Константный метод.)

Константный метод.

Говорят, что метод объекта обладает свойством неизменности (константности), если после его выполнения состояние объекта не изменяется.Если не контролировать свойство неизменности, то его обеспечение будет целиком зависеть от квалификации программиста. Если же "неизменный" метод в процессе выполнения будет производить посторонние эффекты, то результат может быть самым неожиданным,отлаживать и поддерживать такой код очень тяжело.

Язык С++ позволяет пометить метод как константный. При этом неконстантные методы объекта запрещается использовать в теле помеченного метода, и в контексте этого метода ссылки на сам объект и все его поля будут константны. Для обозначения константности, используется модификатор const.

Примечание: Кстати!!! Также существует возможность пометить ссылку (или указатель) как константную. Применительно к ссылке свойство константности означает, что через эту ссылку можно вызывать только константные методы. Присвоение константной ссылки неконстантной запрещено.

Давайте, рассмотрим пример класса с константными методами:

# include <iostream>
# include <string.h>
using namespace std;
class Personal
{
public:
 // конструктор с параметрами
 // мы выделяем здесь память
 // однако в нашем примере нет
 // ни деструктора, ни конструктора
 // копирования - единственная цель,
 // которую мы преследуем показать 
 // работу константного метода
 Personal(char*p,char*n,int a){
 name=new char[strlen(n)+1];
 if(!name){
 cout<<"Error!!!";
 exit(0);
 } 
 picture_data=new char[strlen(n)+1];
 if(!picture_data){
 cout<<"Error!!!";
 exit(0);
 }
 strcpy(picture_data,p);
 strcpy(name,n);
 age=a;
 }

 // Группа константных методов
 // внутри них невозможно
 // изменить какое-то из свойств
 const char*Name()const{
 return name;
 }
 int Age()const{
 return age;
 }
 const char*Picture()const{
 return picture_data;
 }

 void SetName(const char*n){
 strcpy(name,n);
 }
 void SetAge(int a){
 age=a;
 }
 void SetPicture(const char*p){
 strcpy(picture_data,p);
 }

private:
 char*picture_data; // путь к фотографии
 char*name; // имя
 int age; // возраст
};

void main(){
 Personal A("C:\\Image\\","Ivan",23);
 cout<<"Name: "<<A.Name()<<"\n\n";
 cout<<"Age: "<<A.Age()<<"\n\n";
 cout<<"Path for picture: "<<A.Picture()<<"\n\n";
 A.SetPicture("C:\\Test\\");
 A.SetName("Leonid");
 A.SetAge(90);
 cout<<"Name: "<<A.Name()<<"\n\n";
 cout<<"Age: "<<A.Age()<<"\n\n";
 cout<<"Path for picture: "<<A.Picture()<<"\n\n";
}

В данном примере методы Name, Age, Picture объявлены константными. Кроме того, можно наблюдать и использование константных указателей: параметр методов SetName и SetPicture, возвращаемое значение методов Name и Picture. Компилятор обеспечит проверку того, что реализация константных методов не имеет побочных эффектов в виде изменения состояния объекта, реализующего класс Personal. Как только обнаружится попытка выполнить запрещенную операцию, компилятор сообщит об ошибке. 

Категория: C++ | Добавил: DEN-SHP (06.11.2012)
Просмотров: 1027 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]