Правила программирования на С и С++. Главы 7-8 - Не возвращайте ссылки (или указатели) на локальные переменные
Written on .
ОГЛАВЛЕНИЕ
- Правила программирования на С и С++. Главы 7-8
- Глава 7. Правила, относящиеся к языку С
- Подавляйте демонов запутанности (Часть 2)
- Избегайте битовых масок; используйте битовые поля
- Для битового поля размером 1 бит должен быть определен тип unsigned
- Указатели должны указывать на адрес, больший, чем базовый для массива
- Используйте указатели вместо индексов массива
- Избегайте goto, за исключением...
- Глава 8. Правила программирования на С++
- Глава 8.А. Вопросы проектирования и реализации
- Рассчитывайте потратить больше времени на проектирование и меньше на разработку
- Библиотеки классов С++ обычно не могут быть использованы неискушенными пользователями
- Пользуйтесь контрольными таблицами
- Сообщения должны выражать возможности, а не запрашивать (предлагать ?) информацию
- Вам обычно не удастся переделать имеющуюся структурную программу в объектно-ориентированную
- Наследование - это процесс добавления полей данных и методов-членов
- 98. Сначала проектируйте объекты
- Затем проектируйте иерархию снизу вверх
- Возможности, определенные в базовом классе, должны использоваться всеми производными классами
- Инициализируйте виртуальные базовые классы при помощи конструктора, используемого по умолчанию
- Используйте закрытые базовые классы лишь когда вы должны обеспечить виртуальные замещения
- Проектируйте структуры данных в последнюю очередь
- Никогда не допускайте открытого доступа к закрытым данным
- Не пользуйтесь функциями типа get/set (чтения и присваивания значений)
- Откажитесь от выражений языка С, когда программируете на С++
- Проектируйте с учетом наследования
- Функция-член должна обычно использовать закрытые поля данных класса
- Используйте константы
- Используйте структуры только тогда, когда все данные открытые и нет функций-членов
- Не размещайте тела функций в определениях классов
- Избегайте перегрузки функций и аргументов, используемых по умолчанию
- Глава 8.Б. Проблемы сцепления
- Избегайте дружественных классов
- Наследование - это форма сцепления
- Не портьте область глобальных имен: проблемы С++
- Глава 8.В. Ссылки
- Не возвращайте ссылки (или указатели) на локальные переменные
- Не возвращайте ссылки на память, выделенную оператором new
- Глава 8.Г. Конструкторы, деструкторы и operator=( )
- Присваивание самому себе должно работать
- Классы, имеющие члены-указатели, должны всегда определять конструктор копии и функцию operator=()
- Исходите из того, что члены и базовые классы инициализируются в случайном порядке
- Конструкторы копий должны использовать списки инициализации членов
- Производные классы должны обычно определять конструктор копии и функцию operator=( )
- Конструкторы, не предназначенные для преобразования типов, должны иметь два или более аргумента
- Используйте счетчики экземпляров объектов для инициализации на уровне класса
- Избегайте инициализации в два приема
- Глава 8.Д. Виртуальные функции
- Виртуальные функции - это те функции, которые вы не можете написать на уровне базового класса
- Виртуальная функция не является виртуальной, если вызывается из конструктора или деструктора
- Не вызывайте чисто виртуальные функции из конструкторов
- Деструкторы всегда должны быть виртуальными
- Функции базового класса, имеющие то же имя, что и функции производного класса, обычно должны быть виртуальными
- Не делайте функцию виртуальной, если вы не желаете, чтобы производный класс получил контроль над ней
- Защищенные функции обычно должны быть виртуальными
- Опасайтесь приведения типов (спорные вопросы С++)
- Не вызывайте конструкторов из операции operator=( )
- Глава 8.Е. Перегрузка операций
- Используйте перегрузку операций только для определения операций, имеющих аналог в С (без сюрпризов)
- Перегрузив одну операцию, вы должны перегрузить все сходные с ней операции
- Перегруженные операции должны работать точно так же, как они работают в С
- Перегруженной бинарной операции лучше всего быть встроенным (inline) псевдонимом операции приведения типа
- Не сходите с ума с операторами преобразования типов
- Глава 8.Ж. Управление памятью
- Вся память, выделенная в конструкторе, должна быть освобождена в деструкторе
- Локальные перегрузки операторов new и delete опасны
- Глава 8.З. Шаблоны
- Используйте встроенные шаблоны функций вместо параметризированных макросов
- Всегда знайте размер шаблона после его расширения
- Шаблоны не заменяют наследование; они его автоматизируют
- Глава 8.И. Исключения
- По возможности возбуждайте объекты типа error
- Возбуждение исключений из конструктора ненадежно
- Заключение
- Все страницы
Страница 37 из 74
122. Не возвращайте ссылки (или указатели) на локальные переменные.
Эта проблема проявляется и в С, где вы не можете вернуть указатель на локальную переменную. Не возвращайте ссылку на объект, который не существует после этого возврата. Следующий код не работает:
some_class ?f(){
some_class x;// ...
return x;
}Действительной проблемой здесь является синтаксис С++. Оператор return может располагаться на отдалении от определения возвращаемой величины. Единственный способ узнать, что на самом деле делает return x, - это взглянуть на заголовок функции и посмотреть, возвращает она ссылку,или нет.