|
Программирование >> Инициализация объектов класса, структура
#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:: Это необходимо, поскольку такой член не является глобальным объектом, а значит, в глобальной области видимости отсутствует. Следующее определение дружественной
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |