|
Программирование >> Структурное программирование
Если для класса не определено никаких конструкторов, компилятор создает конструктор с умолчанием. Такой конструктор не выполняет присваивания никаких начальных значений, так что после создания объекта нет гарантий, что он находится в непротиворечивом состоянии. Деструктор автоматического объекта вызывается при выходе из области действия объекта. Сам по себе деструктор в действительности не уничтожает объект, но он выполняет подготовку его уничтожения перед тем, как система использует память объекта, которую ранее занимал объект. Деструкторы не получают параметров и не возвращают значений. Класс может иметь только один деструктор. Операция присваивания (=) используется для присваивания объекта другому объекту того же типа. Такое присваивание обычно выполняется с помощью побитового копирования по умолчанию. Побитовое копирование не является идеальным для всех классов. Терминология class private: protected: public: абстрактный тип данных атрибут бинарная операция разрешения области действия (::) встраиваемая inline функция-элемент вхождение в область действия выход из области действия глобальный объект данные-элементы деструктор заголовочный файл закрытые элементы инициализация объекта класса инкапсуляция интерфейс класса исходный файл класс клиент класса конструктор конструктор с умолчанием набор функций непротиворечивое состояние данных-элементов нестатический локальный объект область действия класс область действия файл объект объектно-ориентированное программирование (ООП) операция доступа к элементу класса (.) операция разрешения области действия (::) операция ссылки & определение класса открытые элементы открытый интерфейс класса побитовая копия поведение повторно используемый код повторное использование программного обеспечения предикатная функция принцип наименьших привилегий процедурное программирование расширяемость реализация класса скрытие информации сообщение спецификаторы доступа к элементам список инициализации элементов статический локальный объект тильда (-) в имени деструктора тип данных тип, определяемый пользователем управление доступом к элементам ускоренная разработка приложений (RAD) услуги класса функция доступа функция записи (set) функция запроса функция не элемент класса функция чтения (get) функция-утилита функция-элемент экземпляр объекта класса Типичные ошибки программирования 6.1. Забывается точка с запятой в конце определения класса (или структуры). 6.2. Попытка явно присвоить начальное значение данным-элементам в определении класса. 6.3. Попытка перегрузить функцию-элемент класса с помощью функции не из области действия этого класса. 6.4. Попытка с помощью функции, не являющейся элементом определенного класса (или другом этого класса) получить доступ к элементам этого класса. 6.5. Попытка объявить тип возвращаемого значения для конструктора или возвратить значение из конструктора. 6.6. Указание начальных значений по умолчанию для одной и той же функции-элемента как в заголовочном файле, так и в описании функции-элемента. 6.7. Попытки передать аргументы деструктору, вернуть значения из деструктора или перегрузить деструктор. 6.8. Конструктор может вызывать другие функции-элементы класса такие, как функции записи и чтения. Но поскольку конструктор инициализирует объект, данные-элементы могут в этот момент еще не быть в непротиворечивом состоянии. Использование данных-элементов до того, как они получили соответствующие начальные значения, может вызвать ошибки. Хороший стиль программирования 6.1. Используйте при определении класса каждый спецификатор доступа к элементам только один раз, что сделает программу более ясной и простотой для чтения. Размещайте первыми элементы public, являющиеся общедоступными. 6.2. Используйте директивы препроцессора #ifndef, #define и #endif для того, чтобы избежать включения в программу заголовочных файлов более одного раза. 6.3. Используйте имя заголовочного файла с символом подчеркивания вместо точки в директивах препроцессора #ifndef и #define заголовочного файла. 6.4. Если вы намереваетесь сначала перечислить в определении класса закрытые элементы, используйте явно метку private, несмотря на то, что private предполагается по умолчанию. Это облегчит чтение программы. Но мы предпочитаем первым в определении класса помещать список открытой части public. 6.5. Несмотря на то, что спецификаторы public и private могут повторяться и чередоваться, перечисляйте сначала все элементы класса открытой группы, а затем все элементы закрытой группы. Это кон- Советы по повышению эффективности 6.1. Обычно структуры передаются вызовом по значению. Чтобы избежать накладных расходов на копирование структуры, передавайте структуры вызовом по ссылке. 6.2. Чтобы избежать накладных расходов вызова по значению и вдобавок получить выгоды защиты исходных данных от изменения, передавайте аргументы большого размера как ссылки const. 6.3. Описание небольших функций-элементов внутри определения класса автоматически встраивает функцию-элемент inline (если компилятор решит делать это). Это может улучшить производительность, но не способствует улучшению качества проектирования программного обеспечения. 6.4. Передача объекта вызовом по значению хороша с точки зрения безопасности, поскольку вызываемая функция не имеет доступа к исходному объекту, но вызов по значению может ухудшить производительность в случае создания копии большого объекта. Объект может быть передан вызовом по ссылке путем передачи либо указателя, либо ссылки на объект. Вызов по ссылке способствует хорошей производительности, но с точки зрения безопасности хуже предыдущего, поскольку функции предоставлен доступ к исходному объекту. Безопасной альтернативой является вызов со ссылкой const. центрирует внимание клиентов класса в большей степени на его открытом интерфейсе, чем на реализации класса. 6.6. Использование спецификаторов доступа к элементам public, protected и private лишь по одному разу в любом определении класса позволяет избежать путаницы. 6.7. В соответствуюш;их случаях (почти всегда) предусматривайте конструктор для уверенности в том, что каждый объект получил соответствующие, имеющие смысл начальные значения. 6.8. Каждая функция-элемент (или дружественная функция), которая изменяет исходные данные-элементы, должна гарантировать, что данные остаются в не противоречащем друг другу согласованном состоянии. 6.9. Объявляйте аргументы функции по умолчанию только в прототипе функции внутри определения класса в заголовочном файле. 6.10. Функции-элементы, которые записывают значения закрытых данных, должны проверять правильность предполагаемых новых значений; если они неправильные то эти функции должны установить закрытые данные-элементы в соответствующее им непротиворечивое состояние. 6.11. Никогда не возвращайте из открытой функции-элемента неконстантную ссылку (или указатель) на закрытый элемент данных. Возвращение такой ссылки нарушает инкапсуляцию класса.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |