Инициализация переменной в заголовке функции C ++ - PullRequest
4 голосов
/ 13 мая 2011

Я сталкивался с кодом C ++, который выглядит следующим образом (упрощенно для этого поста):

(Вот прототип функции, расположенный в someCode.hpp)

void someFunction(const double & a, double & b, const double c = 0, const double * d = 0);

(Вот первая строка тела функции, расположенная в someCode.cpp, что #include s someCode.hpp)

void someFunction(const double & a, double & b, const double c, const double * d);

Могу ли я законно позвонить someFunction, используя:

someFunction(*ptr1, *ptr2);

и / или

someFunction(*ptr1, *ptr2, val1, &val2);

где переменные ptr1, ptr2, val и val2 были определены соответствующим образом, а val1 и val2 не равны нулю? Почему или почему нет?

И если это допустимо, предпочтителен ли этот синтаксис по сравнению с перегрузкой функции для учета необязательных параметров?

Ответы [ 4 ]

5 голосов
/ 13 мая 2011

Да, это законно, это называется аргументы по умолчанию .Я бы сказал, что предпочтительнее перегрузки из-за меньшего количества кода, да.

Что касается вашего комментария о const, который не относится к самому значению по умолчанию, он относится к аргументу.Если у вас есть аргумент типа const char* fruit = "apple", это не значит, что его нужно вызывать с указателем символа, значение которого совпадает с адресом строкового литерала "apple" (что хорошо, так как это будет сложногарантировать).Это просто означает, что он должен вызываться с указателем на постоянные символы, и говорит о том, что вызываемой функции не нужно записывать в эту память, она только читается из.

1 голос
/ 13 мая 2011

Я бы хотел немного подробнее остановиться на том, что параметры по умолчанию предпочтительнее перегрузки.

Обычно они приводятся по всем причинам, указанным в других ответах, в частности, с меньшим количеством стандартного кода.

Существуют также веские причины, которые делают перегрузку лучшей альтернативой в некоторых ситуациях:

Значения по умолчанию являются частью интерфейса, изменения могут нарушить работу клиентов (как уже заметил @Juraj) Кроме того, перегрузки упрощают добавление дополнительных (комбинаций) параметров, не нарушая (двоичный) интерфейс.

Перегрузки разрешаются во время компиляции, что может дать компилятору лучшие возможности оптимизации (особенно встраивание). например если у вас есть что-то вроде этого:

void foo(Something* param = 0) {
   if (param == 0) {
      simpleAlgorithm();
   } else {
      complexAlgorithm(param);
   }
}

Возможно, лучше использовать перегрузки.

1 голос
/ 13 мая 2011

Да, параметры являются необязательными, и если вы не передадите их, будут использованы данные значения по умолчанию.

Имеет некоторые преимущества и недостатки использование значений параметров по умолчанию вместо перегрузки. Преимущество заключается в меньшем наборе текста как в интерфейсе, так и в части реализации. Но недостатком является то, что значение по умолчанию является частью интерфейса со всеми вытекающими последствиями. Затем, когда вы изменяете значение по умолчанию, вам, например, нужно перекомпилировать много кода вместо одного файла при использовании перегрузки.

Я лично предпочитаю параметры по умолчанию.

0 голосов
/ 13 мая 2011

Можно ли по закону вызвать someFunction с помощью:

someFunction (* ptr1, * ptr2);

Абсолютно!Да, две другие переменные, которые принимает функция, будут иметь значения по умолчанию, которые вы установили в заголовочном файле и которые равны нулю для обоих аргументов.

Но если вы предоставите 3-й и 4-й аргументы функции,тогда эти значения рассматриваются вместо значений по умолчанию.

...