|
Программирование >> Дополнительные возможности наследования
йасшш B.t. Двсшр к вшрышым чат щсшш шш Пример объявление класса с открытыми членами ffinclude <iostreaiii.h> для использования cout class Cat объявляем класс { public: следующие члены являются открытыми int itsAge; int itsWeight; }; int mainO { Cat Frisky; Frisky.itsAge =5; присваиваем значение переменной-члену cout Frisky is a cat who is ; cout Frisky.itsAge years old.\n ; return 0; Frisky is a cat who is 5 years old. В строке 6 содержится ключевое слово class. Оно сообщает компилятору о том, что следующий после него блок является объявлением класса. Имя нового класса стоит сразу после ключевого слова class. В данном случае у нас объявляется класс Cat. Тело объявления класса начинается с открывающей фигурной скобки в строке 7 и заканчивается закрывающей фигурной скобкой и точкой с запятой в строке 11. Строка 8 содержит ключевое слово public, которое означает, что до тех пор, пока не встретится ключевое слово private или конец объявления класса, все последующие члены объявляются открытыми. в строках 9 и 10 объявляются переменные-члены itsAge и itsWeight. в строке 14 начинается функция main() программы. Frisky определяется в строке 16 как экземпляр класса Cat, т.е. как объект класса Cat. В строке 17 возраст объекта Frisky (значение переменной itsAge) устанавливается равным 5. А в строках 18 и 19 переменная-член itsAge используется для вывода данных на экран. НРММЕЧАШЕ Попробуйте заблокировать символом комментария строку 8 и перекомпилировать профамму. Компилятор покажет сообщение об ошибке в строке 17, поскольку к переменной itsAge больше нет открытого доступа, ведь по умолчанию все члены класса объявляются как закрытые. Оставьте данные класса закрытыми Согласно общей стратегии использования классов переменные-членьг класса следует оставлять закрытыми. Благодаря этому достигается инкапсуляция данных внутри класса. Доступ следует открывать только к функциям-членам класса, обеспечивающим доступ к его закрытым данным (эти функции еще называют методами доступа). Эти методы можно вызывать из любого места в профамме для возвращения или установки значений закрытьгх переменных-членов. Зачем же используются в профамме такие посредники между закрытыми членами класса и остальной профаммой? Не проще ли открыть данные класса для внещнего доступа, вместо того чтобы работать с методами доступа? Дело в том, что применение методов доступа позволяет скрыть от пользователя детали хранения данных в объектах, в то же время снабжая их методами использования этих данных. В результате можно модернизировать способьг хранения и обработки данных внутри класса, не переписывая при этом методы доступа и вьгзовы их во внещнем программном коде. Если для некоторой внешней функции в профамме, возвращающей возраст объекта Cat, открыть непосредственный доступ к переменной itsAge, то эту функцию пришлось бы переписывать в том случае, если автор класса Cat решит изменить способ хранения этого компонента данных. Однако если между внешней функцией и данными класса будет стоять функция-член GetAgeO, то класс Cat можно будет модернизировать сколько угодно раз, что никак не повлияет на способ вызова функции GetAgeO в основном коде профаммы. При вызове в программе метода доступа не нужно знать, хранится ли нужное значение в переменной типа unsigned integer или long либо оно вычисляется при запросе. Такой подход облегчает эксплуатацию вашей профаммы и ее поддержку в будущем. Можно сказать, что он продлевает жизнь профамме, поскольку, изменяя классы, можно существенно модернизировать выполнение профаммы, не затрагивая при этом основного кода. В листинге 6.2 показан класс Cat, в котором в этот раз объявлены закрытьге пере-менньге-члены и открытые методы доступа к закрытым данным. Обратите внимание, что перед вами не выполняемый вариант профаммы, а только объявление класса. Листинг 6.2. ООъявявннв мвтвднв доступа к уаииым кдасса Объявление класса Cat Переменные-члены объявляются закрытыми, а открытые методы доступа обеспечивают инициализацию переменных-членов и возвращение их значений class Cat { public: открытые методы доступа unsigned int GetAgeO: void SetAge(unsigned int Age); unsigned int GetWeightO; void SetWeight(unsigned int Weight); открытые функции-члены 17 18 19 20 21 22 23 void MeowO; закрытые переменные-члены private: unsigned int itsAge; unsigned int itsWeight; Этот класс имеет пять открытых методов. В строках 9 и 10 содержатся объявления методов обеспечения доступа к переменной-члену itsAge. А в строках 12 и 13 объявляются методы доступа к переменной-члену itsWeight. Эти функции-члены инициализируют переменные и возвращают их значения. в строке 16 объявляется открытая функция-член Meow(). Функция Meow() не является методом доступа. Она не получает и не устанавливает значение переменной-члена, а выполняет другой вид сервиса для класса, выводя слово Meow на экран. Сами переменные-члены объявляются в строках 20 и 21. Чтобы установить возраст кота Frisky, нужно передать соответствующее значение методу SetAgeO: Cat Frisky; Frisky.SetAge(5); устанавливаем возраст Frisky с помощью открытого метода доступа Ограничение yocmgna к данным - зто не способ защиты данных, а лишь средство облегченпя орограммирования Объявление методов или данных закрытыми позволяет компилятору заблаговременно находить ошибки программирования. Начинающие программисты часто ошибочно полагают, что объявляя данные закрытыми, тем самым скрывают некоторую секретную информацию от пользователей, не имеющих соответствующих прав доступа. В действительности это не так. По этому поводу Страустрап (Stroustrup), изобретатель языка С++, сказал; Механизмы управления доступом в С++ обеспечивают защиту от несчастного случая, но не от мошенника (ARM, 1990). Рекомендуется Объявляйте закрытыми переменные-члены класса (с помощью ключевого слова private). Объявляйте открытыми методы доступа к закрытым данным-членам класса. Используйте для обработки данных-членов закрытые функции-члены класса. Не рекомендуется Не пытайтесь использовать закрьпые переменные-члены вне класса.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |