Константы — различия между версиями

Материал из Deeptown Manual
Перейти к: навигация, поиск
м (Константные функции)
м
Строка 21: Строка 21:
  
 
Например так можно узнать длину строки, используя свойство <tt>length</tt>:
 
Например так можно узнать длину строки, используя свойство <tt>length</tt>:
<source lang="kpp">var len = "hello world".length();</source>
+
<source lang="kpp">var len = "hello world".length;</source>
  
 
В общем случае, создать константный объект можно тем же способом что и обычную переменную-экземпляр класса:
 
В общем случае, создать константный объект можно тем же способом что и обычную переменную-экземпляр класса:

Версия 21:23, 6 сентября 2007

Понятие константы

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

Объявление любой константы начинается с ключевого слова const, за которым идут тип (можно не указывать), идентификатор имени константы и выражение-инициализатор.

Вот примеры объявления констант: <source lang="kpp"> const real e = 2.7182818; const pi = 3.1415926; const s = "hello world"; </source>

Тип константы можно либо указать явно как это происходит в случае константы e, либо неявно, при этом он будет назначен как тип инициализатора: константа pi будет иметь тип числа с плавающей точкой (real), а константа s — строковый тип (string).

Примечание: При объявлении констант следите за тем, чтобы их тип был ясно виден из строки объявления. Если выражение инициализатора представляет собой довольно сложное математическое выражение, либо содержит вызовы функций, лучше всего указать тип константы вручную (как в примере с константой e). Иначе, это может вызывать проблемы в будущем при отладке программы. В целом ситуация такая же, что и с инициализацией переменных (см. примечание).

Константные объекты

Как уже было сказано выше, константами могут являться или быть объявлены любые объекты языка. Даже числа и строки, фигурирующие в программе в явном виде — тоже являются константными объектами. И их тоже можно использовать как объекты.

Например так можно узнать длину строки, используя свойство length: <source lang="kpp">var len = "hello world".length;</source>

В общем случае, создать константный объект можно тем же способом что и обычную переменную-экземпляр класса: <source lang="kpp"> const myinstance = new MyClass; const myobject = MyClass.Create(); </source>

Константные функции

При работе с константными объектами подразумевается, что их значение (простые объекты, вроде числовой константы) или в общем случае их состояние (экземпляр некоторого класса) не будут изменено. Чтобы укзаать компилятору, какие методы и операторы можно использовать а какие нет, вводится понятие спецификатора функции. Спецификатор const, указанный в объявлении метода или оператора указывает на то, что этот метод не изменяет состояния объетка и может вызываться для констант:

<source lang="kpp"> class MyClass {

   var m_i;
   public const function ShowStatus() { println(m_i); } 
   public function Check() { return i > 5; }
   function SetI(value) { m_i = value; }
   property i read m_i write SetI;

} </source>

В этом случае, если где то в коде будет создан константный экземпляр класса, то он будет допускать чтение свойства i и вызовы метода ShowStatus(), но не SetI:

<source lang="kpp"> var v = new MyClass; //создаем экземпляр-переменную const c = new MyClass; //создаем экземпляр-константу

println('v =' + v.i); //можно, доступ на чтение println('c =' + c.i); //тоже можно, чтение свойства разрешено v.i = 5; //можно, v - переменная c.i = v.i; //нельзя, c - константа, запись свойства запрещена v.Check(); //можно

c.Check(); //нельзя. метод не помечен как const

                      //(хоть и не изменяет состояние)

v.ShowStatus(); //можно c.ShowStatus(); //тоже можно, метод не меняет состояния (помечен как const) </source>

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
информация
документация
Инструменты