Есть ли проблемы с инициализацией переменной-члена const с помощью статической функции (в примере выше)?
Нет.Можно утверждать, что такая локальная вспомогательная функция, которая имеет мало общего с вашим реальным классом, могла бы вместо этого быть передана на аутсорсинг в вспомогательную / служебную сущность, возможно, свободную функцию (шаблон) в анонимном пространстве имен или где-то еще (чтобы сделать ее тестируемой).
Что-нибудь изменится / есть ли еще проблемы, если функция, используемая для инициализации переменной const, нестатична?
Делая ее static
, гарантирует, что членФункция не имеет ничего общего с состоянием экземпляров (очевидно, то же самое для свободных функций).Я бы определенно сохранил это для функций, которые используются для инициализации состояния.
Есть ли разница между определением функции в заголовочном файле вместе с ее объявлением и тем, как оно было объявлено в заголовочном файле?определен в исходном файле?
Нет.Однако если вы сделаете эту функцию бесплатной, вам нужно позаботиться о возможных нарушениях ODR и, по крайней мере, пометить ее как inline
.
Есть ли простой способ передать символ * [] переменная по ссылке или, возможно, более эффективный способ?
Существует более эффективный способ, т. е. вообще не использовать функцию и полагаться на конструктор std::vector
(перегрузка # 4), которая принимает два итератора в качестве аргумента.Указатели на один и тот же необработанный массив здесь хороши, так что вы можете просто сделать:
Launcher::Launcher(int inputCount, char *inputArguments[]) :
argumentCount(inputCount),
arguments(inputArguments, inputArguments + inputCount) {}
Обратите внимание, что Launcher
, похоже, не предназначен для изменения аргументов командной строки.В этом случае вам не нужно копировать строки вообще.Вместо этого используйте std::string_view
(если доступен C ++ 17) или просто оставьте его как const char*
(одна приятная вещь в аргументах командной строки - вам не нужно думать об их времени жизни).