С++ для начинающих




Статические члены класса - часть 4


   ret2 = ac2->_interestRate * ac2->_amount;

   // ...

}

Как ac1._interestRate, так и ac2->_interestRate относятся к статическому члену Account::_interestRate.

Поскольку есть лишь одна копия статического члена класса, до нее необязательно добираться через объект или указатель. Другой способ заключается в том, чтобы обратиться к статическому члену напрямую, квалифицировав его имя именем класса:

// доступ к статическому члену с указанием квалифицированного имени

if ( Account::_interestRate < 0.05 )

Если обращение к статическому члену производится без помощи оператора доступа, то его имя следует квалифицировать именем класса, за которым следует оператор разрешения области видимости:

Account::

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

int compareRevenue( Account &ac1, Account *ac2 );

{

   double ret1, ret2;

   ret1 = Account::_interestRate * ac1._amount;

   ret2 = Account::_interestRate * ac2->_amount;

   // ...

}

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

  • статический член может принадлежать к типу того же класса, членом которого он является. Нестатические объявляются лишь как указатели или ссылки на объект своего класса:
  • class Bar {

    public:

       // ...

    private:

       static Bar mem1;   // правильно

       Bar *mem2;         // правильно

       Bar mem3;          // ошибка

    };

    • статический член может выступать в роли аргумента по умолчанию для функции-члена класса, а для нестатического это запрещено:
    • extern int var;

      class Foo {

      private:

         int var;

         static int stcvar;

      public:

         // ошибка: трактуется как Foo::var,

         // но ассоциированного объекта класса не существует

         int mem1( int = var );

         // правильно: трактуется как static Foo::stcvar,

         // ассоциированный объект и не нужен

         int mem2( int = stcvar );

         // правильно: трактуется как глобальная переменная var

         int mem3( int = :: var );

      };




      Содержание  Назад  Вперед