Вопрос 1: почему нет ключевого слова?
Никто, кроме Страуструпа или членов комитета, не может по-настоящему ответить, почему C ++ такой, какой он есть, но мы можем предположить, что, возможно, он не считался достаточно важным для ключевого слова. Стандарт C ++ говорит о порядке инициализации, например, для объектов, но порядок не является строго определенным и оставлен для реализации. Вот одна цитата (3.6.2 / 3):
Это определяется реализацией
или нет динамическая инициализация
(8.5, 9.4, 12.1, 12.6.1) объекта
области имен пространства делается до
первое изложение основного. Если
инициализация откладывается до некоторых
момент времени после первого
изложение основного, должно произойти
перед первым использованием любой функции
или объект, определенный в том же
Единица перевода как объект, который будет
инициализирована
Вопрос 2: как получить эквивалент ключевых слов Delphi initialization
и finalization
?
Есть два варианта. Первое упомянуто другими авторами, и я не хочу копировать их ответы: объявите объект в определенной области ( единица перевода или пространство имен), и его конструктор и деструктор будут называться 'sometime'; там работаю.
Обратите внимание, что этот порядок определяется реализацией , поэтому вы уже находитесь на неопределенной территории.
Второй вариант также зависит от компилятора. Вы используете Delphi, так что я правильно понимаю, что вы используете C ++ Builder для компиляции своего кода C ++? Если это так, C ++ Builder и некоторые другие компиляторы поддерживают #pragma startup
и #pragma exit
pragmas . Эти прагмы вызывают метод в определенное время, когда ваша программа запускается или закрывается.
Лично я считаю это более подходящим решением по двум причинам:
Он точно указывает, когда что-то
произойдет, и я вижу это написано
вниз в коде
Позволяет позвонить
функция вместо использования
конструктор или деструктор. Это
эстетически чище и позволяет писать, скажем,
initialization()
и finalization()
методы, которые
выполнять свою работу. Это, вероятно, приближает вас к синтаксису Delphi настолько, насколько это возможно.
Вы можете использовать эти прагмы для вызова процедуры (которая не принимает параметров и возвращает void), а также при необходимости указать, когда это должно произойти, используя число от 64 до 255. Это нужно делать только в том случае, если порядок инициализации или финализация имеет значение. Первый номер называется первым, а приоритеты от 0 до 63 зарезервированы. Например:
void initialization(void) { foo = 3; bar = 5; /* Do useful work here */ }
#pragma startup initialization 200
void finalization(void) { foo = 0; bar = 0; /* Do useful work here */ }
#pragma exit finalization 200
Цепочка вызовов управляется компоновщиком, и вы можете столкнуться с проблемами, если используете более специфичные для компилятора конструкции, такие как слабая упаковка , но в целом этот метод я бы порекомендовал.