Static c что это
Перейти к содержимому

Static c что это

Статические поля и методы

Рассмотрим ещё раз класс Box. Здесь для простоты все поля сделаны публичными:

Box.h Box.cpp main.cpp

Код очень простой, здесь нет никаких особых моментов. Особо хочется обратить снимание на то, что каждый экземпляр класса Box имеет собственный набор значений depth, width, height. Поля класса принадлежат экземпляру класса.

Метод getVolume, несмотря на то, что является общим для всех экземпляров класса, применяется к конкретному объекту и работает с его конкретными полями.

Кроме таких полей и методов класса можно также определять статические поля и методы. Статические члены класса принадлежат классу, а не его экземплярам. То есть, они будут являться общими для всех созданных объектов.

Например, создадим статическое поле counter, которое будет увеличиваться на 1 каждый раз, когда создаётся новый экземпляр.

Статическое поле создаётся с помощью служебного слова static

Здесь нужно обратить внимание на следующие моменты.

  • 1. Обращение к статическому полю ведётся через имя класса Тем не менее, обращаться к статическому полю можно и через указатель this
  • 2. Статическое поле необходимо инициализировать. Инициализация происходит в любом месте cpp файла. Для инициализации необходимо написать полное имя статической переменной, опустив static. В нашем случае
  • 3. Статическая переменная объявлена как protected. То есть, обратиться извне к ней сможет только наследник. Как и с обычными нестатическими переменными, методы класса могут без проблем обращаться к своей собственной переменной.

Теперь необходимо каким-то образом получить доступ к нашей переменной. Для этого напишем метод, возвращающий значение counter.

В данном случае, обращение a.getCounter() эквивалентно обращению b.getCounter(), так как они обращаются к общей переменной counter.

Так как метод обращается к статическому полю, то он не нуждается в экземпляре класса для того, чтобы его можно было вызвать. Сделаем метод getCounter статическим

Изменим объявление метода

Определение останется тем же

Обращаться к методу теперь можно через имя класса

Тем не менее, обращаться к статическому методу можно и через экземпляр класса

Этот метод можно переписать так

Или, воспользовавшись законом де-Моргана, так

При использовании статических методов запрещён модификатор const метода, так как метод по определению не может обращаться к нестатическим полям и изменять их.

email

Всё ещё не понятно? – пиши вопросы на ящик

Статические классы в C#

В C# разрешено создавать статический класс с помощью ключевого слова static . Статический класс может содержать только статические поля, статические методы и статический конструктор. Не допускается создание объектов статического класса. Статические классы являются изолированными, что означает, что вы не можете наследовать статический класс от другого класса.

Синтаксис:

В C # статический класс содержит два типа статических членов, а именно:

    Статические поля: поскольку статический класс всегда содержит статические поля, поэтому статические поля объявляются с использованием ключевого слова static, и к ним осуществляется прямой доступ с использованием имени класса. Память статических полей распределяется индивидуально без какой-либо связи с объектом.

Static c что это

Ключевое слово static

В этой статье я хочу рассказать об использовании ключевого слова static в программах, написанных на C#. Это ключевое слово может относится (может быть указано) к методам, полям, свойствам, событиям, конструкторам, операторам классов (и даже к самим классам, но об этом будет отдельный разговор). Ключевое слово static, указанное перед какой-либо сущностью класса, делает её статической. Это значит то, что данная сущность принадлежит не конкретному объекту класса, а всему классу, как типу данных. Другими словами, если обычное поле класса принадлежит объекту, и у каждого конкретного объекта есть как бы своя копия данного поля, то статическое поле одно для всего класса. Для примера, посмотрите на код ниже:

Так вот, при создании объектов этого класса, для для каждого из них индивидуально будет вызываться конструктор, каждый объект будет иметь свою «копию» поля «name» и свойство «Name» будет возвращать именно его. Но иногда, мы хотим иметь сущности, которые относятся не к каждому отдельно взятому объекту, а ко всему классу.

На самом деле, когда мы объявляем в классе константу, она уже по сути, относится ко всему класса, так как для всех объектов будет имеет одно и тоже значение.

Для чего это может пригодиться? Ну например, мы разрабатываем класс, и хотим, что бы его пользователи знали, кем и для чего разработан этот класс (хотя, соглашусь, пример сильно надуманный):

Как видите, мы добавили в класс статическое поле «about«, с информацией о предназначении класса и статическое свойство (только для чтения) «About» для возврата значения этого поля. А теперь, я покажу как можно воспользоваться статическим свойством приведенного выше класса:

Все довольно просто, для вызова статического свойства класса, нам даже не нужно создавать объект этого класса (и действительно, зачем это делать, если статические сущности относятся не к конкретным объектам, а ко всему классу). Мы просто пишем имя класса (в данном случае, это «Student»), а потом, через точку, имя свойства. Точно так же производится работа со статическими методами, например, статический метод, возвращающий значение поля «about» может выглядеть примерно так:

А его вызов вот так:

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

Использовать такой класс можно так:

Видите как всё просто… Не нужно создавать никакие объекты для выполнения необходимой операции!

Примером класса, с большим набором статических методов, выполняющих математические операции, служит стандартный класс Math (из пространства имен System). На самом деле, этот класс вообще является статическим, т.е. при его создании, перед словом class, было указано ключевое слово static. Но о том что такое статические классы и в чем их особенности, я расскажу в следующей статье.

И еще, хочу сказать пару слов про статические конструкторы:

  • у класса может быть только один статический конструктор;
  • у статического конструктора не может быть ни аргументов ни модификатора доступа (такого как public, private и т.п.);
  • статический конструктор вызывается автоматически системой и один раз (либо при создании первого объекта класса, либо при первом обращении к статической сущности класса);
  • ну и самое главное, статический конструктор предназначен для инициализации статических полей класса.

Для класса «Student», статический конструктор может выглядеть примерно так:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *