Программирование >>  Инициализация объектов класса, структура 

1 ... 201 202 203 [ 204 ] 205 206 207 ... 395


#include <string> class Account {

...

private:

static const string name;

const string Account::name( Savings Account );

Константный статический член целого типа инициализируется константой внутри тела класса: это особый случай. Если бы для хранения названия счета мы решили использовать массив символов вместо строки, то его размер можно было бы задать с

заголовочный файл class Account {

...

private:

static const int nameSize = 16; static const string name[nameSize];

исходный файл

const string Account::nameSize; необходимо определение члена

помощью константного члена типа int:

const string Account::name[nameSize] = Savings Account ;

Отметим, что константный статический член целого типа, инициализированный константой, - это константное выражение. Проектировщик может объявить такой статический член, если внутри тела класса возникает необходимость в именованной константе. Например, поскольку константный статический член nameSize является константным выражением, проектировщик использует его для задания размера члена-массива с именем name.

Даже если такой член инициализируется в теле класса, его все равно необходимо задать вне определения класса. Однако поскольку начальное значение уже задано в объявлении, то при определении оно не указывается.

Так как name - это массив (и не целого тина), его нельзя инициализировать в теле класса.

class Account {

...

private:

static const int nameSize = 16; правильно: це тип static const string name[nameSize] = Savings Account ; ошибка

Попытка поступить таким образом приведет к ошибке компиляции:

Член name должен быть инициализирован вне определения класса.

Обратите внимание, что член nameSize задает размер массива name в определении, находящемся вне тела класса:



class Account {

private:

friend int compareRevenue( Accounts, Account* ); остальное без изменения

мы используем ссылочный и указательный параметры, чтобы проиллюстрировать оба оператора доступа int compareRevenue( Account sac1, Account *ac2 );

double ret1, ret2;

ret1 = ac1. interestRate * ac1. amount;

ret2 = ac2-> interestRate * ac2-> amount;

...

статическому члену двумя способами. Во-первых, посредством операторов доступа:

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

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

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

if ( Account:: interestRate < 0.05 )

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

const string Account::name[nameSize] = Savings Account ;

nameSize не квалифицирован именем класса Account. И хотя это закрытый член, определение name не приводит к ошибке. Как такое может быть? Определение статического члена аналогично определению функции-члена класса, которое может ссылаться на закрытые члены. Определение статического члена name находится в области видимости класса и может ссылаться на закрытые члены, после того как распознано квалифицированное имя Account::name. (Подробнее об области видимости класса мы поговорим в разделе 13.9.)

Статический член класса доступен функции-члену того же класса и без использования

inline double Account::dailyReturn() {

return( interestRate / 365 * amount );

соответствующих операторов:

Что же касается функций, не являющихся членами класса, то они могут обращаться к



int compareRevenue( Account Sac1, Account *ac2 ); {

double ret1, ret2;

ret1 = Account:: interestRate * ac1. amount; ret2 = Account:: interestRate * ac2-> amount;

...

функции compareRevenue эквивалентно приведенному выше:

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

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

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 );

правильно: трактуется int mem3( int = :: var );

правильно: трактуется как глобальная переменная var mem3 ( int = :: var );

функции-члена класса, а для нестатического это запрещено:

Account::

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



1 ... 201 202 203 [ 204 ] 205 206 207 ... 395

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика