47. Определяйте и инициализируйте переменные-члены в одном порядке
47. Определяйте и инициализируйте переменные-члены в одном порядке
Резюме
Переменные-члены всегда инициализируются в том порядке, в котором они объявлены при определении класса; порядок их упоминания в списке инициализации конструктора игнорируется. Убедитесь, что в коде конструктора указан тот же порядок, что и в определении класса.
Обсуждение
Рассмотрим следующий код:
class Employee {
string email_, firstName_, lastName_;
public:
Employee( const char* firstName, const char* lastName ) :
firstName_(firstName), lastName_(lastName),
email_(firstName_+"."+lastName_+"@acme.com") {}
};
Этот код содержит ошибку, столь же неприятную, сколь и трудно обнаруживаемую. Поскольку член email_ объявлен в определении класса до first_ и last_, он будет инициализирован первым и будет пытаться использовать еще не инициализированные поля. Более того, если определение конструктора находится в отдельном файле, то выявить такое удаленное влияние порядка объявления переменных-членов класса на корректность конструктора окажется еще труднее.
Эта особенность языка обусловлена необходимостью гарантировать единый порядок уничтожения членов; в противном случае деструктор был бы должен уничтожать объекты в разном порядке, в зависимости от того, в каком именно порядке конструктор создавал их. Накладные расходы, необходимые для решения этой проблемы, признаны неприемлемыми.
Решение заключается в том, чтобы всегда писать инициализаторы членов в том же порядке, в котором эти члены объявлены в классе. В этом случае сразу становятся очевидными все некорректные зависимости между членами. Еще лучше полностью избегать зависимости инициализации одного члена от других.
Многие компиляторы (но не все) выдают предупреждение при нарушении этого правила.
Ссылки
[Cline99] §22.03-1] • [Dewhurst03] §52-53 • [Koenig97] §4 • [Lakos96] §10.3.5 • [Meyers97] §13 • [Murray93] §2.1.3 • [Sutter00] §47
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Функции и переменные. Локальные переменные
Функции и переменные. Локальные переменные Объявленные ранее функции создают внутри своего тела собственные переменные. Это так называемые локальные переменные. Такие переменные доступны только внутри тела функции, в котором они объявлены. При завершении выполнения
(3.32) Как заставить службы (service) запускаться в определённом порядке?
(3.32) Как заставить службы (service) запускаться в определённом порядке? Для этого служит ключ в реестре под названием DependOnService. Найти его можно в ветке относящейся к службе HKLMSystemCurrentControlSetServisesИмя службы Присвойте этому ключу имя службы которая должна стартовать раньше. Если
Функции и переменные. Локальные переменные
Функции и переменные. Локальные переменные Объявленные ранее функции создают внутри своего тела собственные переменные. Это так называемые локальные переменные. Такие переменные доступны только внутри тела функции, в котором они объявлены. При завершении выполнения
R.14.8 Статические члены и переменные
R.14.8 Статические члены и переменные Для каждого шаблонного класса или функции, создаваемых по шаблону типа, образуется своя копия статических переменных или членов. Рассмотрим пример:template‹class T› class X { static T s; //…};X‹int› aa;X‹char*› bb;Здесь в классе X‹int› есть статический член
61. Не определяйте в заголовочном файле объекты со связыванием
61. Не определяйте в заголовочном файле объекты со связыванием РезюмеОбъекты со связыванием, включая переменные или функции уровня пространства имен, обладают выделенной для них памятью. Определение таких объектов в заголовочных файлах приводит либо к ошибкам времени
Правило 46: Определяйте внутри шаблонов функции, не являющиеся членами, когда желательны преобразования типа
Правило 46: Определяйте внутри шаблонов функции, не являющиеся членами, когда желательны преобразования типа В правиле 24 объясняется, почему только к свободным функциям применяются неявные преобразования типов всех аргументов. В качестве примера была приведена функция
Расположить в обратном порядке (Reverse)
Расположить в обратном порядке (Reverse) template ‹class BidirectionalIterator›void reverse(BidirectionalIterator first, BidirectionalIterator last);Для каждого неотрицательного целого числа i‹=(last-first)/2 функция reverse применяет перестановку ко всем парам итераторов first+i, (last-i)-1. Выполняется точно (last-first)/2 перестановок.template
15.1.1. Члены и не члены класса
15.1.1. Члены и не члены класса Рассмотрим операторы равенства в нашем классе String более внимательно. Первый оператор позволяет устанавливать равенство двух объектов, а второй – объекта и C-строки:#include "String.h"int main() {String flower;// что-нибудь записать в переменную flowerif ( flower == "lily" ) //
21. Обобщенные алгоритмы в алфавитном порядке
21. Обобщенные алгоритмы в алфавитном порядке В этом приложении мы рассмотрим все алгоритмы. Мы решили расположить их в алфавитном порядке (за небольшими исключениями), чтобы проще было найти нужный. Каждый алгоритм представлен в следующем виде: сначала описывается
Пример 9-14. Подстановка параметров и сообщение о "порядке использования"
Пример 9-14. Подстановка параметров и сообщение о "порядке использования" #!/bin/bash# usage-message.sh: ${1?"Порядок использования: $0 ARGUMENT"}# Сценарий завершит свою работу здесь, если входные аргументы отсутствуют,#+ со следующим сообщением.# usage-message.sh: 1: Порядок использования: usage-message.sh
11.1.7. Сортировка а обратном порядке
11.1.7. Сортировка а обратном порядке Если необходимо отсортировать строки не по возрастанию, а по убыванию, задайте опцию -r:$ sort -r video.txtToy Story:HK:239:3972The H111:KL:63:2972Star Wars:HK:301:4102Boys in Company С:HK:192:2192Aliens:HK:532:4892Alien:HK:119:1982A Few Good
Фотографии в порядке
Фотографии в порядке Автор: Юрий МеркуловКоличество изображений на жестком диске у владельцев цифровых камер растет если не в геометрической, то уж в арифметической прогрессии — точно. И если несколько лет тому назад стоял вопрос о софте для просмотра снимков, то сейчас
Глава 5 У АРТИСТОВ ВСЁ В ПОРЯДКЕ
Глава 5 У АРТИСТОВ ВСЁ В ПОРЯДКЕ Как будут зарабатывать артисты? "Но как же будут зарабатывать артисты?" — вопрос, который нам, Пиратам, чаще всего задают в спорах о реформе копирайта и легализации файлообмена.10 лет назад на этот вопрос трудно было ответить, и лишь немногие
Ошибка 0x000000E3: а с винчестером все в порядке?
Ошибка 0x000000E3: а с винчестером все в порядке? Сбой файловой системы NTFS. Жесткий диск «посыпался»? Нужно сделать диагностику жесткого диска. Возможно, придется переформатировать жесткий