Для чего служит режим конструктора

Обновлено: 07.05.2024

В новой версии Microsoft Access существуют четыре режима работы с таблицами: режим Таблицы (Datasheet View), режим Конструктора (Design View), режим Сводной таблицы (PivotTable View) и режим Сводной диаграммы (PivotChart View).

В режиме Таблицы осуществляется работа с данными, находящимися в таблице: просмотр, редактирование, добавление, сортировка и т. п. В режиме Конструктора создается или модифицируется структура таблицы, т. е. задаются имена полей таблицы и их типы, поля описываются, задаются их свойства. В режимах Сводной таблицы и Сводной диаграммы удобно выполнять анализ данных, динамически изменяя способы их представления. Существует также дополнительный режим — режим Предварительного просмотра, который позволяет увидеть расположение данных на листе перед осуществлением печати таблицы.

Для быстрого перехода из одного режима в другой служит кнопка Вид (View) на панелях инструментов Таблица в режиме таблицы (Table Datasheet), Конструктор таблиц (Table Design), Сводная таблица (PivotTable) и Сводная диаграмма (PivotChart). Чтобы перейти из режима в режим, достаточно нажать эту кнопку.

Открыть таблицу в режиме Таблицы можно несколькими способами:

  • дважды щелкнуть мышью на имени таблицы в списке таблиц в окне базы данных;
  • выделить таблицу в списке таблиц в окне базы данных и нажать кнопку Открыть (Open) в верхней части окна базы данных;
  • щелкнуть правой кнопкой мыши на имени таблицы и из контекстного меню выбрать команду Открыть (Open).

В любом случае на экране появится окно с содержимым таблицы (рис. 2.1).

Рис. 2.1. Таблица "Клиенты", открытая в режиме Таблицы

В верхней части таблицы располагаются имена полей (ячеек, находящихся в одном столбце таблицы), ниже следуют записи (строки таблицы), в которые вносятся данные. Одна запись всегда является текущей, и рядом с ней расположен указатель текущей записи (стрелка в поле выделения в левой части окна). В нижней части окна расположены кнопки навигации, позволяющие перемещать указатель текущей записи по таблице (на первую запись, на предыдущую запись, на следующую запись, на последнюю запись). Там же находятся поле номера текущей записи, кнопка создания новой записи и указатель общего количества записей в таблице. Для создания новой записи также служит последняя строка таблицы, отмеченная в поле выделения звездочкой (на рис. 2.1 она не видна).

Горизонтальная полоса прокрутки полей таблицы позволяет увидеть те поля таблицы, которые не поместились в окно таблицы. Аналогично вертикальная полоса прокрутки записей таблицы позволяет увидеть записи, находящиеся за пределами окна.

В верхней части окна приложения появляется стандартная панель инструментов Таблица в режиме Таблицы (Table Datasheet). Назначение кнопок этой панели и соответствующие им команды меню описаны в табл. 2.1.

КнопкаКоманда менюОписание
Вид (View)Вид, Режим таблицы
(View, Datasheet View)
Отображение таблицы в различных режимах. Чтобы изменить режим отобра жения таблицы, нажмите стрелку справа от кнопки и в появившемся списке выделите нужный элемент. Если просто нажать эту кнопку, таблица будет отображена в режиме Таблицы.
Сохранить (Save)Файл, Сохранить
(File, Save)
Сохранение активной таблицы
Найти (Search)Файл, Найти (File, Search)Поиск документов по содержанию
Печать (Print) Печать таблицы без открытия диалогового окна Печать
Предварительный просмотр (Print Preview)Файл, Предварительный просмотр (File, Print Preview)Предварительный просмотр размещения таблицы на листе перед печатью
Орфография (Spelling)Сервис, Орфография (Tools, Spelling)Проверка орфографии в текстовых полях таблицы
Вырезать (Cut)Правка, Вырезать (Edit, Cut)Удаление выделенных объектов из таблицы в буфер обмена Windows
Копировать (Сору)Правка, Копировать (Edit, Copy)Копирование выделенных объектов в буфер обмена
Вставить (Paste)Правка, Вставить (Edit, Paste)Вставка содержимого из буфера обмена
Формат по образцу (Format Painter) Копирование параметров форматирования из одного выделенного объекта в другой такого же типа
Отменить (Undo)Правка, Отменить (Edit, Undo)Отмена последних действий
Добавить гиперссылку (Insert Hyperlink)Вставка, Гиперссылка (Insert, Hyperlink Column)Вставка поля типа "гиперссылка"
Сортировка по возрастанию (Sort Ascending)Записи, Сортировка, Сортировка по возрастанию (Records, Sort, Sort AscendingСортировка записей по возрастанию значений в активном поле
Сортировка по убыванию (Sort Descending)Записи, Сортировка, Сортировка по убыванию (Records, Sort, Sort Descending)Сортировка записей по убыванию значений в активном поле
Фильтр по выделенному (Filter by selection)Записи, Фильтр, Фильтр по выделенному (Records, Filter, Filter by selection)Отбор записей, соответствующих выделенному фрагменту
Изменить фильтр (Filter by form)Записи, Фильтр, Изменить фильтр (Records, Filter, Filter by form)Отображение диалогового окна для ввода критериев отбора записей
Применение фильтра (Apply filter)Записи, Применить фильтр (Records, Apply filter)Отображение отфильтрованных записей
Найти (Find)Правка, Найти (Edit, Find)Поиск записи по заданным критериям поиска
Новая запись (New Record)Вставка, Новая запись (Insert, New Record)Добавление новой записи в таблицу
Удалить запись (Delete Record)Правка, Удалить запись (Edit, Delete Record)Удаление текущей записи из таблицы
Окно базы данных (Database Window)Окно, 1 (Window, 1)Отображение окна базы данных
Новый объект (New Object) Создание нового объекта базы данных. Чтобы выбрать тип создаваемого объекта, нажмите стрелку справа от кнопки
Справка по Microsoft Access (Microsoft Access Help)Справка, Справка по Microsoft Access (Help, Microsoft Access Help)Вызов помощника и получение справки по Access 2002

Таблица 2.1. Панель инструментов Таблица в режиме Таблицы

Открыть таблицу в режиме Конструктора можно одним из двух следующих способов:

  • выделить таблицу в списке таблиц в окне базы данных и нажать кнопку Конструктор (Design) в верхней части окна базы данных;
  • щелкнуть правой кнопкой мыши на имени таблицы и из контекстного меню выбрать команду Конструктор (Design).

После выполнения указанных действий на экране появится окно таблицы в режиме Конструктора, а также панель инструментов Конструктор таблиц (Table Design) (рис. 2.2).

Окно таблицы в режиме Конструктора состоит из двух панелей.

  • Верхняя панель содержит таблицу из трех столбцов: Имя поля (Field Name), Тип данных (Data Type) и Описание (Description). В столбце Имя поля (Field Name) содержатся имена полей таблицы, в столбце Тип данных (Data Type) указывается тип данных для каждого поля. Заполнение двух первых столбцов является обязательным.
  • На нижней панели располагаются две вкладки свойств полей: Общие (General) и Подстановка (Lookup), а также область контекстной справки.

Ключевое поле таблицы помечается специальным значком — ключик в поле выделения в левой части окна. Чтобы выделить поле, достаточно просто щелкнуть мышью по строке, в которой описывается данное поле. При этом в нижней части окна будут показаны параметры именно для этого поля. Перемещаться между столбцами в верхней панели окна можно с помощью клавиши , а для перемещения по списку полей вверх и вниз пользуйтесь клавишами со стрелками. С помощью клавиши можно перемещаться между панелями.

В верхней части окна приложения появляется стандартная панель инструментов Конструктор таблиц. Рассмотрим основные кнопки этой панели инструментов (описываются только кнопки, уникальные для данного режима).

  • Ключевое поле (Primary Key) — добавляет в таблицу ключевое поле или удаляет его.
  • Индексы (Indexes) — открывает окно редактирования индексов.
  • Вставить строки (Insert Rows) — позволяет добавлять поля в таблицу.
  • Удалить строки (Delete Rows) — позволяет удалять поля из таблицы.
  • Свойства (Properties) — открывает окно свойств таблицы.
  • Построить (Build) — открывает окно Построителя полей.

Остальные кнопки на этой панели те же самые, что и на описанной ранее панели Таблица в режиме таблицы (Table Datasheet).

Новый режим — Сводной таблицы — позволяет представлять табличные данные в более удобном и обозримом виде. Сводная таблица позволяет группировать, суммировать или каким-то другим образом обрабатывать данные из обычной таблицы Access. Этот режим является с одной стороны аналогом сводных таблиц в Excel, а с другой стороны — развитием уже давно используемых в Access перекрестных запросов.

Режим Сводной диаграммы тесно связан со сводной таблицей. Это просто графическое представление сводной таблицы. В предыдущих версиях Access диаграммы могли использоваться только в отчетах. Теперь они стали динамическими, и есть возможность создавать эти диаграммы и управлять ими в интерактивном режиме прямо на экране монитора.

Однако хотя можно создать сводную таблицу для обычной таблицы Access, на наш взгляд, наиболее эффективен этот режим для запросов и форм. Таблицы Access, если они правильно спроектированы, как правило, не бывают сложными. А вот запросы и формы обычно собирают информацию из разных таблиц. И поэтому именно для анализа этих данных удобно создавать сводные таблицы и диаграммы. По этой причине мы пока отложим рассмотрение настоящих режимов и вернемся к ним во второй части книги, когда будем говорить о построении сложных запросов и форм. А в данной главе мы подробно остановимся на первых двух режимах.

При создании экземпляра класса или структуры вызывается его конструктор. Конструкторы имеют имя, совпадающее с именем класса или структуры, и обычно инициализируют члены данных нового объекта.

В следующем примере класс с именем Taxi определяется с помощью простого конструктора. Затем оператор new создает экземпляр этого класса. Конструктор Taxi вызывается оператором new сразу после того, как новому объекту будет выделена память.

Конструктор, который не принимает никаких параметров, называется конструктором без параметров. Конструкторы без параметров вызываются всякий раз, когда создается экземпляр объекта с помощью оператора new , а аргументы в new не передаются. Дополнительные сведения см. в разделе Конструкторы экземпляров.

Создание экземпляров класса можно запретить, сделав конструктор закрытым, следующим образом:

Дополнительные сведения см. в разделе Закрытые конструкторы.

Конструкторы для типов структур похожи на конструкторы классов, но structs не могут содержать явный конструктор без параметров, так как он предоставляется компилятором автоматически. Этот конструктор инициализирует каждое поле в struct со значением по умолчанию. При этом конструктор без параметров вызывается только в том случае, если экземпляр struct создается с помощью переменной new . Например, этот код использует конструктор без параметров, Int32чтобы гарантировать, что целое число инициализируется:

Однако следующий код вызывает ошибку компилятора, так как он не используется new , и потому что он пытается использовать объект, который не был инициализирован:

Кроме того, объекты на основе structs (включая все встроенные числовые типы) можно инициализировать или назначить, а затем использовать, как в следующем примере:

Поэтому вызов конструктора без параметров для типа значения не требуется.

Оба класса и structs могут определять конструкторы, принимающие параметры. Конструкторы, принимающие параметры, необходимо вызывать с помощью оператора new или base. Классы и structs могут определять также несколько конструкторов; для определения конструктора без параметров ни один их них не требуется. Пример:

Этот класс можно создать, воспользовавшись одним из следующих операторов:

Конструктор может использовать ключевое слово base для вызова конструктора базового класса. Пример:

В этом примере конструктор базового класса вызывается перед выполнением соответствующего ему блока. Ключевое слово base можно использовать как с параметрами, так и без них. Любые параметры для конструктора можно использовать как параметры для base или как часть выражения. Дополнительные сведения см. в разделе base.

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

Если базовый класс не предлагает конструктор без параметров, производный класс должен выполнить явный вызов базового конструктора с помощью base .

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

Применение ключевого слова this в приведенном выше примере привело к вызову конструктора:

Конструкторы могут иметь пометку public, private, protected, internal, protected internal или private protected. Эти модификаторы доступа определяют, каким образом пользователи класса смогут создавать класс. Дополнительные сведения см. в статье Модификаторы доступа.

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

Вносить изменения в формы можно в двух режимах — макета и конструктора. В любом из режимов можно выполнять одни и те же задачи конструирования и разметки, но есть задачи, которые проще выполнять в каждом из них. В этой статье описано сходство и различие режимов макета и конструктора, а также показано, как выполнять распространенные задачи конструирования форм в каждом из режимов.

Примечание: Эта статья написана для форм, но многие описанные здесь подходы применимы и к изменению отчетов.

В этой статье

Общие сведения о режимах макета и конструктора

Режим макета. Режим макета в большей степени ориентирован на визуальное восприятие, чем режим конструктора. При просмотре формы в режиме макета в каждом элементе управления отображаются реальные данные. Этот режим очень удобен для настройки размера элементов управления и выполнения многих других задач, которые влияют на визуальное представление и удобство использования формы.

Режим конструктора. В режиме конструктора более детально представлена структура формы. Здесь вы видите заголовок, подробности и нижний колонтитул формы. При внесении изменений в структуру вы не можете просматривать базовые данные, тем не менее определенные задачи проще выполнять в режиме конструктора. Вы можете:

добавлять в форму больше разнообразных элементов управления, таких как надписи, изображения, линии и прямоугольники;

изменять источники для текстовых полей в самих полях, не открывая их страницу свойств;

изменять размер разделов формы, например ее заголовка или раздела подробностей;

изменять некоторые свойства формы, которые невозможно изменить в режиме макета (такие как Режим по умолчанию или Режим формы).

Изменение формы в режиме макета

После создания формы вы можете легко настроить ее структуру, используя режим макета. Вы можете перемещать элементы управления и изменять их размеры, ориентируясь на сами данные. Можно добавить в форму новые элементы управления, а также задать свойства для формы и ее элементов управления.

Чтобы перейти в режим макета, щелкните правой кнопкой мыши имя формы в области навигации и выберите команду Режим макета .

Access выведет форму в режиме макета.

Для изменения свойств формы, элементов управления и разделов можно использовать страницу свойств. Чтобы открыть страницу свойств, нажмите клавишу F4.

С помощью области Список полей можно добавлять поля из базовой таблицы или запроса в структуру формы. Отобразить область Список полей можно одним из следующих способов:

На вкладке Формат в группе Элементы управления нажмите кнопку Добавить поля .

Нажмите клавиши ALT+F8.

Затем можно перетащить поля прямо из области Список полей в форму.

Чтобы добавить одно поле, дважды щелкните его и перетащите из области Список полей в нужный раздел формы.

Чтобы добавить сразу несколько полей, щелкните их, удерживая нажатой клавишу CTRL. Затем перетащите выбранные поля в форму.

Изменение формы в режиме конструктора

Настроить структуру формы можно и в режиме конструктора. Вы можете добавить в форму новые элементы управления и поля, поместив их на бланк. На странице свойств можно задать множество свойств для настройки формы.

Чтобы переключиться на конструктор, щелкните правой кнопкой мыши имя формы в области навигации и выберите команду Конструктор .

Access выведет форму в конструкторе.

Для изменения свойств формы, элементов управления и разделов можно использовать страницу свойств. Чтобы открыть страницу свойств, нажмите клавишу F4.

С помощью области Список полей можно добавлять поля из базовой таблицы или запроса в структуру формы. Отобразить область Список полей можно одним из следующих способов:

На вкладке Конструктор в группе Сервис нажмите кнопку Добавить существующее поле.

Нажмите клавиши ALT+F8.

Затем можно перетащить поля прямо из области Список полей в форму.

Чтобы добавить одно поле, дважды щелкните его и перетащите из области Список полей в нужный раздел формы.

Чтобы добавить сразу несколько полей, щелкните их, удерживая нажатой клавишу CTRL. Затем перетащите выбранные поля в форму.

Чтобы настроить, как класс инициализирует его члены или вызывать функции при создании объекта класса, определите конструктор. Конструкторы имеют имена, совпадающие с именами классов, и не имеют возвращаемых значений. Вы можете определить столько перегруженных конструкторов, сколько необходимо для настройки инициализации различными способами. Как правило, конструкторы имеют открытые специальные возможности, чтобы код за пределами определения класса или иерархии наследования может создавать объекты класса. Но вы также можете объявить конструктор как protected или private .

Конструкторы могут при необходимости принимать список инициализаторов элементов. Это более эффективный способ инициализации членов класса, чем назначение значений в тексте конструктора. В следующем примере показан класс Box с тремя перегруженными конструкторами. Последние два используют списки инициализации элементов:

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

  • Конструкторы могут быть объявлены как inline , , explicitfriend или constexpr .
  • Конструктор может инициализировать объект, объявленный как const , volatile или const volatile . Объект становится const после завершения конструктора.
  • Чтобы определить конструктор в файле реализации, присвойте ему полное имя, как и любая другая функция-член: Box::Box() .

Списки инициализаторов элементов

При необходимости конструктор может иметь список инициализаторов элементов, который инициализирует члены класса перед запуском тела конструктора. (Список инициализаторов элементов не совпадает со списком инициализаторов типа std::initializer_list .)

Предпочитать инициализаторы элементов перечисляют значения вместо назначения значений в тексте конструктора. Список инициализаторов элементов напрямую инициализирует элементы. В следующем примере показан список инициализаторов элементов, состоящий из всех identifier(argument) выражений после двоеточия:

Идентификатор должен ссылаться на член класса; он инициализирован со значением аргумента. Аргумент может быть одним из параметров конструктора, вызова функции или . std::initializer_list

const члены и члены ссылочного типа должны быть инициализированы в списке инициализаторов элементов.

Чтобы обеспечить полную инициализацию базовых классов перед запуском производного конструктора, вызовите все параметризованные конструкторы базового класса в списке инициализаторов.

Конструкторы по умолчанию

Конструкторы по умолчанию обычно не имеют параметров, но они могут иметь параметры со значениями по умолчанию.

Конструкторы по умолчанию являются одной из специальных функций-членов. Если конструкторы в классе не объявляются, компилятор предоставляет неявный inline конструктор по умолчанию.

Если используется неявный конструктор по умолчанию, обязательно инициализировать элементы в определении класса, как показано в предыдущем примере. Без этих инициализаторов члены будут неинициализированы, а вызов Volume() создаст значение мусора. Как правило, рекомендуется инициализировать элементы таким образом, даже если не используется неявный конструктор по умолчанию.

Вы можете запретить компилятору создавать неявный конструктор по умолчанию, определив его как удаленный:

Конструктор по умолчанию, созданный компилятором, будет определен как удаленный, если какие-либо члены класса не являются конструктором по умолчанию. Например, все члены типа класса и их члены класса должны иметь конструктор по умолчанию и деструкторы, которые доступны. Все члены данных ссылочного типа и все const члены должны иметь инициализатор элементов по умолчанию.

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

Это утверждение является примером проблемы "Большинство vexing Parse". Можно интерпретировать myclass md(); как объявление функции или как вызов конструктора по умолчанию. Поскольку средства синтаксического анализа C++ предпочитают объявления по сравнению с другими вещами, выражение рассматривается как объявление функции. Дополнительные сведения см. в разделе "Большинство синтаксического анализа".

Если объявлены какие-либо конструкторы, отличные от по умолчанию, компилятор не предоставляет конструктор по умолчанию:

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

Однако для инициализации массива объектов Box можно использовать набор списков инициализаторов:

Дополнительные сведения см. в разделе "Инициализаторы".

Конструкторы копии

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

Конструктор копирования может иметь одну из следующих сигнатур:

При определении конструктора копирования необходимо также определить оператор присваивания копирования (=). Дополнительные сведения см. в разделе "Назначение " и " Копирование конструкторов" и операторов присваивания копирования.

Вы можете запретить копирование объекта, определив конструктор копирования как удаленный:

При попытке копирования объекта возникает ошибка C2280: попытка ссылаться на удаленную функцию.

Конструкторы перемещения

Конструктор перемещения — это специальная функция-член, которая перемещает владение данными существующего объекта в новую переменную без копирования исходных данных. Он принимает ссылку rvalue в качестве первого параметра, а все последующие параметры должны иметь значения по умолчанию. Конструкторы перемещения могут значительно повысить эффективность программы при передаче больших объектов.

Компилятор выбирает конструктор перемещения, когда объект инициализируется другим объектом того же типа, если другой объект будет уничтожен и больше не нуждается в его ресурсах. В следующем примере показано одно дело, когда конструктор перемещения выбирается с помощью разрешения перегрузки. В конструкторе, который вызывает get_Box() , возвращаемое значение является xvalue (значение eXpiring). Поэтому он не назначается какой-либо переменной и поэтому выходит за пределы области действия. Чтобы обеспечить мотивацию для этого примера, давайте предоставим Box большой вектор строк, представляющих его содержимое. Вместо копирования вектора и его строк конструктор перемещения "крадет" его из значения "box", чтобы вектор теперь принадлежит новому объекту. Вызов std::move необходим, так как оба vector класса string реализуют собственные конструкторы перемещения.

Если класс не определяет конструктор перемещения, компилятор создает неявный конструктор, если конструктор копирования не объявлен пользователем, оператор назначения копирования, оператор перемещения или деструктор. Если не определен явный или неявный конструктор перемещения, операции, в противном случае использующие конструктор перемещения, используют конструктор копирования. Если класс объявляет конструктор перемещения или оператор присваивания перемещения, неявно объявленный конструктор копирования определяется как удаленный.

Неявно объявленный конструктор перемещения определяется как удаленный, если какие-либо элементы, являющиеся типами классов, не имеют деструктора или если компилятор не может определить, какой конструктор следует использовать для операции перемещения.

Дополнительные сведения о написании конструктора нетривиального перемещения см. в разделе "Конструкторы перемещения" и "Операторы присваивания перемещения" (C++).

Явно заданные по умолчанию и удаленные конструкторы

Конструкторы копирования по умолчанию , конструкторы по умолчанию, конструкторы перемещения, операторы присваивания копирования, операторы присваивания перемещения и деструкторы. Вы можете явно удалить все специальные функции-члены.

Конструкторы constexpr

Конструктор может быть объявлен как constexpr , если

  • он либо объявлен как стандартный, либо удовлетворяет всем условиям для функций constexpr в целом;
  • класс не имеет виртуальных базовых классов;
  • каждый из параметров является литеральным типом;
  • тело не является блоком try-block функции;
  • инициализированы все нестатические члены данных и подобъекты базового класса;
  • Значение , если класс является (a) объединением, имеющим члены варианта, или (б) имеет анонимные объединения, инициализируется только один из членов профсоюза;
  • каждый нестатический член данных типа класса, а все подобъекты базового класса имеют конструктор constexpr.

Конструкторы списков инициализаторов

Затем создайте объекты Box следующим образом:

Явные конструкторы

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

Можно инициализировать Box следующим образом:

Или передать целое значение функции, принимающей объект Box:

В некоторых случаях подобные преобразования могут быть полезны, однако чаще всего они могут привести к незаметным, но серьезным ошибкам в вашем коде. Как правило, необходимо использовать ключевое explicit слово в конструкторе (и определяемых пользователем операторах), чтобы предотвратить такое неявное преобразование типов:

Когда конструктор является явным, эта строка вызывает ошибку компилятора: ShippingOrder so(42, 10.8); . Дополнительные сведения см. в разделе о преобразованиях определяемых пользователем типов.

Порядок строительства

Конструктор выполняет свою работу в следующем порядке.

Вызывает конструкторы базовых классов и членов в порядке объявления.

Если класс является производным от виртуальных базовых классов, конструктор инициализирует указатели виртуальных базовых классов объекта.

Если класс имеет или наследует виртуальные функции, конструктор инициализирует указатели виртуальных функций объекта. Указатели виртуальных функций указывают на таблицу виртуальных функций класса, чтобы обеспечить правильную привязку вызовов виртуальных функций к коду.

Выполняет весь код в теле функции.

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

Выходные данные будут выглядеть следующим образом.

Конструктор производного класса всегда вызывает конструктор базового класса, чтобы перед выполнением любых дополнительных операций иметь в своем распоряжении полностью созданные базовые классы. Конструкторы базового класса вызываются в порядке наследования, например, если ClassA является производным от , производным от ClassC ClassB которого является конструктор, ClassC сначала вызывается конструктор, а затем ClassB конструктор, а затем ClassA конструктор.

Если базовый класс не имеет конструктора по умолчанию, необходимо указать параметры конструктора базового класса в конструкторе производного класса:

Если конструктор создает исключение, то удаление выполняется в порядке, обратном созданию.

Отменяется код в теле функции конструктора.

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

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

Производные конструкторы и расширенная инициализация агрегатов

Если конструктор базового класса не является открытым, но доступен для производного класса, нельзя использовать пустые фигурные скобки для инициализации объекта производного типа в /std:c++17 режиме, а затем в Visual Studio 2017 и более поздних версий.

В следующем примере показана соответствующая реакция на событие в C++14:

В C++17 Derived теперь считается агрегатным типом. Это означает, что инициализация Base через закрытый конструктор по умолчанию происходит непосредственно как часть расширенного правила агрегатной инициализации. Ранее частный Base конструктор был вызван через Derived конструктор, и он был успешно выполнен из-за friend объявления.

В следующем примере показано поведение C++17 в Visual Studio 2017 и более поздних версий в /std:c++17 режиме:

Конструкторы для классов с множественным наследованием

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

Должны выводиться следующие выходные данные:

Делегирующие конструкторы

Делегирующий конструктор вызывает другой конструктор в том же классе для выполнения некоторых действий по инициализации. Эта функция полезна, если у вас есть несколько конструкторов, которые все должны выполнять аналогичную работу. Основную логику можно написать в одном конструкторе и вызвать из других. В следующем тривиальном примере Box(int) делегирует свою работу Box(int,int,int):

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

Наследование конструкторов (C++11)

Производный класс может наследовать конструкторы от прямого базового класса с помощью using объявления, как показано в следующем примере:

Visual Studio 2017 и более поздних версий: оператор using в /std:c++17 режиме и более поздних версиях преобразует все конструкторы из базового класса, за исключением тех, которые имеют идентичную сигнатуру конструкторам в производном классе. Как правило, рекомендуется использовать наследуемые конструкторы, когда производный класс не объявляет новые члены данных или конструкторы.

Шаблон класса может наследовать все конструкторы от аргумента типа, если этот тип определяет базовый класс:

Производный класс не может наследоваться от нескольких базовых классов, если эти базовые классы имеют конструкторы с одинаковой сигнатурой.

Конструкторы и составные классы

Классы, содержащие члены типа класса, называются составными классами. При создании члена типа класса составного класса конструктор вызывается перед собственным конструктором класса. Если у содержащегося класса нет конструктора по умолчанию, необходимо использовать список инициализации в конструкторе составного класса. В предыдущем примере StorageBox при присвоении типу переменной-члена m_label нового класса Label необходимо вызвать конструктор базового класса и инициализировать переменную m_label в конструкторе StorageBox :

Режим конструктора применяется для создания и изменения структуры таблицы. Для выбора этого режима нужно нажать кнопку Вид на панели Представление вкладки Режим таблицы и выбрать пункт Конструктор (рис. 10).


Рис. 10.Выбор режима работы с таблицей

В режиме конструктора вкладка Режим таблицы заменяется вкладкой Конструктор, панели которой показаны на рис. 11.

Сама таблица теперь отображается не как набор записей с данными, а как список полей (рис. 11). Здесь следует определить структуру таблицы, т.е. набор полей и их формат.


Рис. 11.Панели вкладки Конструктор для работы с таблицей


Рис. 12.Режим конструктора таблицы

Чтобы описать очередное поле в структуре таблицы, необходимо вначале указать название поля (Имя поля) и после этого определить в раскрывающемся списке тип данных, которые будут в нем храниться (Тип данных). Кроме того, можно также описать назначение информации, которая будет вводиться в поле Описание.

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

Чтобы создать в таблице первичный ключ, вначале необходимо в режиме конструктора выделить поле таблицы, которое требуется назначить ключевым (щелкнув левой кнопкой мыши на области выделения соответствующей строки).


После этого следует нажать кнопку Ключевое поле на панели Сервис вкладки Конструктор, что приведет к появлению соответствующего изображения в области выделения строки (поле Код на рис. 12). Чтобы отменить назначение первичного ключа для поля, необходимо еще раз выполнить эти действия.


Для сохранения изменений, внесенных в структуру таблицы, нужно нажать кнопку Office и выбрать кнопку Сохранить (или нажать сочетание клавиш Ctrl+S).


Работа с полями. Типы данных

При создании структуры таблицы необходимо определить тип полей, которые будут в ней использоваться. Чтобы задать тип данных, которые будут храниться в определенном поле, следует щелкнуть в режиме конструктора таблиц левой кнопкой мыши в столбце Тип данных соответствующей строки, после чего в списке выбрать требуемый тип. Например, чтобы определить тип данных для поля Код таблицы, нужно выполнить щелчок в столбце Тип данных (рис. 13), после чего воспользоваться кнопкой со стрелкой, появившейся в данной строке. Затем следует выбрать в списке требуемый тип данных и в разделе Свойства поля окна конструктора задать параметры выбранного типа. В табл. 2

Таблица 2

Типы данных СУБД ACCESS

Тип Объем памяти Описание
Текстовый До 255 байт Текстовая строка
Поле МЕМО До 65 535 байт Многострочный текст
Числовой 1, 2, 4 или 8 байт Число
Дата/время 8 байт Дата и/или время
Денежный 8 байт Денежные суммы
Счетчик 4 байта Уникальное целое число, обозначающее порядковый номер записи в таблице
Логический 1 бит Логическое значение
Поле объекта OLE До 1 Гбайта Объекты других приложений Windows
Гиперссылка До 2048 символов Ссылка на файл (в данном компьютере, в сети, в Интернете)

Рассмотрим основные типы данных, используемые в таблицах СУБД Access.

Текстовый. Используется для хранения строковых данных длиной до 255 символов. Свойство Размер позволяет задать максимальное количество символов (до 255), которые будут содержаться в строке (по умолчанию устанавливается Размер = 50).

Поле MEMO. Применяется для хранения текста, состоящего из нескольких строк (т.е. текста, в котором встречается символ возврат каретки).

Для этих типов данных основными свойствами, которые уста­навливаются в нижней части окна конструктора (рис. 12), являются:

Формат поля - задается специальный формат, в котором данные выводятся на экран, например: синий цвет шрифта и выравнивание по левому краю;

Пустые строки -устанавливается режим, при котором можно вводить в поле пустую строку (т.е. значение "").

Числовой. Используется для обработки чисел различного размера и формата. Размер определяется с помощью свойства Размер поля (табл. 3), а формат числа задается свойством Формат поля (табл. 4), используемого также для типов данных Денежный и Счетчик.

Примечание.Для форматов Числовой и Денежный по умолчанию устанавливается значение 0.

Таблица 3

Основные значения свойств Размер поля типа данных Числовой

Значение Содержимое Диапазон Объем
Байт Целые числа [0; 2 8 -1] 1 байт
Целое Целые числа [-2 15 ;2 15 -1] 2 байта
Длинное целое Целые числа [-2 3l ;2 3l -l] 4 байта
Одинарное с плавающей точкой Вещественные числа с точностью до 7 знаков после запятой [-2 128 ; -2 - 149 ] и [2 -149 ; 2 128 -1] 4 байта
Двойное с плавающей точкой Вещественные числа с точностью до 15 знаков после запятой [-2 1024 ; -2 1074 ] и [2 1074 ; 2 1024 -1] 8 байт
Действительное Вещественные числа с заданной точностью (по умолчанию точность = 18 знаков) [-10 2 8 ; 10 28 ] 12 байт

Таблица 4

Значения свойства Формат поля типов данных Числовой, и Денежный

Формат Пример
Основной 123,456
Денежный 123,45р.
Евро 1234,5б€
Фиксированный 1234,56
С разделителями разрядов 1234,56
Процентный 12,34%
Экспоненциальный 12,ЗЕ+02

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

Денежный. Используется для хранения денежных значений. Формат представления задается свойством Формат поля, аналогично числовому формату (табл. 2).

Счетчик. Применяется для описания поля, используемого в качестве первичного ключа, и генерирует для каждой новой записи в таблице уникальное значение формата Длинное целое.

Дата/время. Применяется при обработке значений календарных дат и времени. Этот тип данных позволяет хранить значения в нескольких форматах (табл. 5). По умолчанию устанавливается Полный формат даты.

Таблица 5

Значения свойства Формат поля типа данных Дата/время

Логический. Предназначен для хранения и обработки логических значений, т.е. Ложь или Истина. Этот тип данных предусматривает использование одного из следующих форматов в качестве свойства Формат поля: Истина/Ложь, Да/Нет, Вкл/Выкл (по умолчанию устанавливается формат Да/Нет).

Для логического поля можно выбрать элемент управления, который будет отображаться в режиме таблицы, а также при создании формы на основании этой таблицы. Для этого нужно в режиме конструктора выделить логическое поле, раскрыть вкладку Подстановка и выбрать в раскрывающемся списке Тип элемента управления один из вариантов: Флажок, Поле или Поле со списком.

Связи между таблицами

Для созданных таблиц нужно установить связи, которые впоследствии будут использоваться при формировании запросов, создании отчетов или разработке форм. Как было отмечено выше, в БД Аттестация следует создать такие связи:


Рис. 14.Диалоговое окно Добавление таблицы


Для установки связей необходимо воспользоваться режимом Схема данных, который активируется кнопкой Схема данных на панели Связи вкладки Режим таблицы. При этом появится пустое окно Схема данных. Если ни одной связи еще не определено, автоматически откроется диалоговое окно Добавление таблицы (рис. 14), в котором на вкладке Таблицы нужно добавить поочередно все имеющиеся таблицы в схему данных (кнопкой Добавить). Затем следует закрыть окно Добавление таблицы.

Если это окно автоматические не было открыто, следует активизировать вкладку Структура, после чего на панели Связи нажать кнопку Отобразить таблицу (рис. 15) и добавить в схему требуемые таблицы описанным выше способом.


Рис. 15.Панель инструментов Связи

После выполнения указанных действий на схеме данных будут расположены все таблицы БД Аттестация, расстановку которых можно изменить по своему усмотрению (рис. 16).


Рис. 16.Таблицы БД Аттестация

Следующий этап в разработке схемы данных - установка связей между таблицами. В частности, необходимо связать таблицы TECHER и LECTURE по полю ID таким образом, чтобы каждой записи из таблицы TECHER соответствовало несколько записей таблицы LECTURE (т.к. у каждого преподавателя будет несколько дисциплин). Аналогичным образом нужно установить следующие связи:

■ «один ко многим» по полю ID между таблицами KAFEDRA и TECHER (т.к. на одной кафедре работает много преподавателей):

■ «один ко многим» по полю ID между таблицами PREDMET и LECTURE;

■ «один ко многим» по полю ID между таблицами MARK и ATTEST;

■ «один ко многим» по полю ID между таблицами PREDMET и ATTEST;

■ «один ко многим» по полю ID между таблицами ATTEST и VID_ATT.

Чтобы установить связь между таблицами TECHER и LECTURE необходимо выделить в окне Схема данных поле ID в таблице TECHER и с помощью мыши, нажав ее левую кнопку, перетащить захваченное изображение на поле T_ID таблицы LECTURE, после чего кнопку отпустить. В результате появится диалоговое окно Изменение связей (рис. 17).


Рис. 17.Диалоговое окно Изменение связей

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

Если установлен флажок Обеспечение целостности данных, то в окне Изменение связей автоматически становятся доступны еще два флажка:

Каскадное обновление связанных полей - при изменении значения ключевого поля в «главной» таблице (TECHER) будут автоматически изменяться значения связанного поля для соответствующих записей в «подчиненной» таблице (LECTURE). В рассматриваемом случае ключевое поле ID является счетчиком, следовательно, значения этого поля не могут быть изменены пользователем, а значит устанавливать данный флажок не нужно;

Каскадное удаление связанных записей - при удалении записи из «главной» таблицы (TECHER) будут автоматически удалены те записи из «подчиненной» таблицы (LECTURE), для которых значение поля ID совпадает со значением в удаленной записи из таблицы TECHER. Эта возможность будет полезна в тех случаях, когда сведения о преподавателе удаляются из базы.

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

Примечание.Тип отношений между связываемыми таблицами Access распознает автоматически. В данном случае после установки флажка Обеспечение целостности данных (рис. 17) в окне схемы данных рядом с полем ID таблицы TECHER над линией связи отобразится символ «1», а рядом с таблицей LECTURE - символ бесконечности «¥» (т.е. установлена связь «один ко многим»).

Чтобы изменить установленную связь, необходимо выделить соответствующую линию, щелкнув по ней мышью. После этого связь можно удалить командой Правка \ Удалить или с помощью клавиши Delete, а также изменить, вызвав окно Изменение связи командой Связи \ Изменить связь или двойным щелчком мыши по линии связи.

Если требуется скрыть какую-либо таблицу на схеме данных, нужно щелкнуть по таблице и нажать на панели Связи кнопку Скрыть таблицу.

После того как все связи между таблицами установлены, схема данных для БД Аттестация примет вид, показанный на рис. 18.

Читайте также: