Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Namespace CounterNameSpace 15 страница




fzm = 199.22F;

 

izm = static_cast < int > (fzm);

cout << izm;

 

getch (); return 0;

}

20.2.4. Оператор перетворення типу reinterpret_cast

Оператор reinterpret_cast перетворить один тип у принципово інший. Наприклад, його можна використовувати для перетворення покажчика в ціле значення і ціле значення у покажчик. Його також можна використовувати для приведення спадково несумісних типів покажчиків. Цей оператор має такий загальний формат запису:

reinterpret_cast < type > (expr)

У цьому записі елемент type задає новий тип операції приведення, а елемент expr означає вираз, який приводиться до цього нового типу.

Оператор reinterpret_cast виконує фундаментальну зміну типу.

Використання оператора reinterpret_cast продемонстровано в такій програмі.

Код програми 20.11. Демонстрація механізму використання оператора reinterpret_cast

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

 

int main ()

{

int izm;

char *p = "Це короткий рядок.";

 

izm = reinterpret_cast < int > (p); // Приводимо покажчик до типу int.

cout << izm;

 

getch (); return 0;

}

У цій програмі оператор reinterpret_cast перетворить покажчик р у цілочисельне значення. Внаслідок цього перетворення відбувається фундаментальна зміну типу.

20.2.5. Порівняння звичайної операції приведення типів з новими чотирма cast-операторами

Комусь з читачів могло б видатися, що описані вище чотири cast-оператори повністю замінюють традиційну операцію приведення типів. І тоді у них може виникнути таке запитання: "Чи варто завжди замість звичайної операції приведення типів використовувати новіші засоби?". Йдеться про те, що загального правила для всіх програмістів не існує. Оскільки нові оператори були створені для підвищення безпеки достатньо ризикованої операції приведення одного типу даних до іншого, багато С++-програмістів переконані у тому, що їх необхідно використовувати виключно з цією метою. І тут важко що-небудь заперечити. Інші ж програмісти вважають, що, оскільки традиційна операція приведення типів слугувала їм "вірою і правдою" протягом багатьох років, то від неї не варто так легко відмовлятися. Наприклад, для виконання простих і відносно безпечних операцій приведення типів (як ті, що потрібні під час виклику функцій введення-виведення read () і write (), описаних у попередньому розділі) "старий добрий" засіб цілком прийнятний.

Існує ще одна точка зору, з якою важко не погодитися: у процесі виконання операцій приведення поліморфних типів безумовно варто використовувати оператор dynamic_cast.


Розділ 21. Поняття про простори імен та інші ефективні програмні засоби

У цьому розділі буде описано основні поняття про простори імен і такі ефективні програмні засоби, як explicit -конструктори, покажчики на функції, static -члени, const -функції|-члени, альтернативний синтаксис ініціалізації членів-даних класу, оператори вказання на члени класу, ключове слово asm, специфікація компонування і функції перетворення.

21.1. Простори імен

Простір імен визначає деяку декларативну область.

Простори імен стисло розглянуто у розд. 2. Там було сказано, що вони дають змогу локалізувати імена ідентифікаторів, щоб уникнути конфліктних ситуацій з ними. У С++-середовищі програмування використовується величезна кількість імен змінних, функцій та імен класів. До введення поняття простору імен всі ці імена конкурували між собою за пам'ять в глобальному просторі імен, що і було причиною виникнення багатьох конфліктів. Наприклад, якби у Вашій програмі було визначено функцію toupper (), то вона могла б (залежно від переліку параметрів) перевизначити стандартну бібліотечну функцію toupper (), оскільки обоє імен мали б зберігатися в глобальному просторі імен. Конфлікти з іменами виникали раніше також під час використання однією програмою декількох бібліотек сторонніх виробників. У цьому випадку ім'я, що є визначеним у одній бібліотеці, конфліктувало з таким самим іменем з іншої бібліотеки. Така ситуація особливо неприйнятна під час використання однойменних класів. Наприклад, якщо у Вашій програмі визначено клас VideoMode, і в бібліотеці, що використовуються Вашою програмою, визначено клас з таким самим іменем, то конфлікту не уникнути.

Для вирішення описаної проблеми було створено ключове слово namespace. Оскільки воно локалізує видимість оголошених у ньому імен, то це означає, що простір імен дає змогу використовувати одне і те саме ім'я в різних контекстах, не викликаючи при цьому конфлікту імен. Можливо, найбільше від нововведення "поталанило" С++-бібліотеці стандартних функцій. До появи ключового слова namespace (яке було, звичайно ж, єдиним) всю С++-бібліотеку було визначено в глобальному просторі імен. З настанням namespace -''ери" С++-бібліотека визначається у власному просторі імен, що іменується std, який значно знизив ймовірність виникнення конфліктів імен. У своїй програмі програміст повинен створювати власні простори імен, щоб локалізувати видимість тих імен, які, на його думку, можуть стати причиною конфлікту. Це особливо важливо, якщо Ви займаєтеся створенням бібліотек класів або функцій.

21.1.1. Поняття про простори імен

Ключове слово namespace дає змогу розділити глобальний простір імен шляхом створення певної декларативної області. По суті, простір імен визначає область видимості. Загальний формат задання простору імен є таким:

namespace name {

// Оголошення

}

Все, що визначено у межах настанови namespace, знаходиться в області видимості цього простору імен.

У наведеному нижче коді програми показано приклад використання namespace -настанови. Вона локалізує імена, що використовуються для виконання розрахунку у зворотному порядку. У створеному тут просторі імен визначається клас counter, який реалізує лічильник, і змінні upperbound і lowerbound, що містять значення верхньої і нижньої меж, які використовуються для всіх лічильників.

//Приклад використання namespace -настанови

{

int upperbound;

int lowerbound;

 

class counter {

int count;

public:

counter(int n) {

if (n <= upperbound) count = n;

else count = upperbound;

}

 

void reset(int n) {

if (n <= upperbound) count = n;

}

 

int run() {

if (count > lowerbound) return count--;

else return lowerbound;

}

};

}

У цій програмі змінні upperbound і lowerbound, а також клас counter є частиною області видимості, визначеної простором імен CounterNameSpace.

У будь-якому просторі імен до ідентифікаторів, які у ньому оголошені, можна звертатися безпосередньо, тобто без вказання цього простору імен. Наприклад, у функції run(), яка знаходиться у просторі імен CounterNameSpace, можна безпосередньо звертатися до змінної lowerbound:

if (count > lowerbound) return count––;

Але, оскільки настанова namespace визначає область видимості, то під час звернення до об'єктів, оголошених у просторі імен, ззовні цього простору необхідно використовувати оператор дозволу області видимості. Наприклад, щоб присвоїти значення 10-ій змінній upperbound з коду програми, який є зовнішнім стосовно простору імен CounterNameSpace, потрібно використовувати таку настанову:

CounterNameSpace::upperbound = 10;

Щоб оголосити об'єкт типу counter поза простором імен CounterNameSpace, потрібно використати настанову, подібну до такої:

CounterNameSpace::counter ob;

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

Розглянемо невелику програму, у якій продемонстровано механізм використання простору імен CounterNameSpace.

Код програми 21.1. Демонстрація механізму використання простору імен CounterNameSpace для виконання розрахунку у зворотному порядку

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

 

// Приклад використання namespace -настанови




Поделиться с друзьями:


Дата добавления: 2014-11-29; Просмотров: 457; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.022 сек.