|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Понятие пространства имен
В больших проектах наблюдается серьезная проблема – конфликт идентификаторов. Она решается с помощью пространства имен. namespace Sys { int var; void Proc(); }
Внутри пространства имен обращение к определенным внутри переменным и подпрограммам можно осуществлять, используя неполную форму записи:
var = 10; Proc(); за пределами надо использовать полную форму записи:
Sys::var = 10; Sys::Proc();
Для того чтобы избежать возможного конфликта идентификаторов, все определения внутри модуля следует помещать в пространство имен. Следует давать небольшой буквенный идентификатор, который будет соответствовать префиксу файла.
Существует возможность открыть пространство имен таким образом, чтобы можно было использовать неполную форму записи. Для этого надо написать строку: using namespace Sys; (директива)
Но следует отметить, что данная конструкция является причиной многих ошибок, поэтому так писать не стоит.
Существует второй способ открыть пространство имен – это открыть его для конкретного определения: using Sys::Proc(); (определение) Но рекомендуется использовать Sys::Proc();
Идентификаторы, объявленные вне пространства имен, относятся к так называемому глобальному пространству имен, доступ к которым осуществляется с помощью оператора::
::Funk();
Для того чтобы была возможность закрыть доступ к данным и подпрограммам внутри данного пространства существует пространство имен без имени:
namespace { ... }
Пространства имен могут быть вложенными:
namespace Sys { namespace Local { int var; ... } ... } Sys::Local::var = 10;
Замечание! Когда возникает желание объявить переменный тип данных или подпрограмму внутри пространства имен, а реализовать за пределами (или наоборот), следует поступать так:
Классы, функции и переменные, которые являются стандартными компонентами компиляторов С++, находятся в пространстве имен std. Это относится к заголовочным файлам без.h.
Сделать доступным пространство имен std для программы можно несколькими способами.
• Можно поместить using namespace std; перед определением функции в файле, в результате чего все содержимое пространства имен std будет доступно для каждой функции в файле. • Можно поместить using namespace std; в определении функции • using std::cout; • std::cout.
Пространства имен могут находиться на глобальном уровне или внутри других пространств имен, однако они не могут быть помещены в блок. Следовательно, имя, объявленное в пространстве имен, по умолчанию обладает внешним связыванием (если оно не ссылается на константу).
Пространства имен открыты. Это означает, что можно включать новые имена в существующие пространства имен.
Предположим, что одно и то же имя определено как в пространстве имен, так и области объявлений. При попытке применить объявление using, чтобы поместить имя из пространства имен в область объявлений, оба имени вступят в конфликт, и отобразится сообщение об ошибке. Если с помощью директивы using перенести имя из пространства имен в область объявлений, локальная версия этого имени перекроет версию из простраства имен.
Недопустимо использование имен из неименованного пространства в любом файле, кроме того, что содержит объявление пространства имен. Это может служить альтернативой применению статических переменных с внутренним связыванием. 14. Классы в языке C++. Наследование. Конструкторы и деструкторы. Стандартные конструкторы. Создание объектов по значению (на стеке) и по ссылке (в динамической памяти). Операторы new и delete. Размещающий оператор new. Порядок конструирования и разрушения объектов. Вложенные определения классов. «Друзья» класса. Статические члены класса.
Спецификация базового типа выполняет три вещи: • Определяет, сколько памяти нужно объекту. • Определяет, как интерпретируются биты памяти. • Определяет, какие операции, или методы, могут быть применены с использованием этого объекта данных.
Классы в С++ Классы в С++ определяются с помощью одного из ключевых слов: class или struct.
Атрибуты доступа в классах: public, protected, private. Их можно чередовать.
В работе секций protected и private в Delphi и C++ есть различия: В Delphi классы внутри одного модуля могут обращаться к данным и подпрограммам друг друга без ограничений. А действие секций protected и private распространяется только за пределами данного модуля. В С++ действие этих секций распространяется на любые два класса. Но установленные ограничения можно обойти с помощью специального оператора friend: Class TTextReader { friend class TList; };
После этого объект класса TList может обращаться к полям из секций private и protected класса TTextReader. Метод класса может быть реализован по месту или отдельно от класса:
class TTextReader { public: TTextReader(); ~TTextReader() {... } // по месту }; TTextReader::TTextReader() // отдельно от класса – квалифицированное имя { ... }
Если класс описан в интерфейсной части модуля, его методы рекомендуется реализовывать отдельно от класса в cpp-файле, иначе при компиляции получаются огромные объектные модули. В том случае, когда некоторый класс надо сделать inline -методом, следует писать так:
class TTextReader { public: TTextReader(); ~TTextReader(); int ItemCount(); }; inline int TTextReader::ItemCount() { ... } Любая функция внутри определения класса автоматически становится встроенной. При обращении к inline-методу идет обращение к полю. Метод д.б. перенесен в h-файл. Иначе компилятор будет делать вызов метода. На этапе компоновки получим ошибку линкера «нет метода».
В С++ объекты могут агрегироваться по ссылке и по значению (агрегирование по ссылке похоже на агрегирование в Delphi).
Агрегирование по значению:
class TDelimitedReader { public: ... private: std::string m_FileName; };
Агрегированные по значению объекты конструируются автоматически в порядке объявления после вызова конструктора базового класса (если не указан другой способ инициализации). Стандартный способ инициализации можно переопределить до открывающей фигурной скобки конструктора: TTextReader::TDelimitedReader(): TTextReader(), m_FileName("c:/myfile.txt") { ... } Следует отметить, что данная запись отличается от следующей записи:
TDelimitedReader::TDelimitedReader(): TTextReader() { m_FileName = "c:/myfile.txt"; } Во втором случае строка вначале создается пустой, а в теле конструктора переприсваивается.
Объекты, агрегированные по ссылке, нужно создавать вручную с помощью оператора new, а удалять – с помощью оператора delete:
class TDelimitedReader: publicTTextReader { ... private: std::string m_FileName; TItems *m_Items; }; TDelimitedReader::TDelimitedReader(): TTextReader(), m_FileName("c:/myfile.txt") { m_Items = new TItems; } TDelimitedReader::~TDelimitedReader() { delete m_Items; }
Правило конструирования агрегированных объектов: объекты, агрегированные по значению и константные ссылки инициализируются до тела конструктора. объекты, агрегированные по ссылке, инициализируются в теле конструктора.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.01 сек.) |