перегрузка функции против аргумента по умолчанию в С++

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

    string conct (string a, string b) {
      string str = conct(a, b, "string");
      return str;
    }

    string conct (string a, string b, const char* c) {
      // do the processing;
      return concatenated_string;
    }

Возможно ли, что вместо двух перегруженных функций я сделаю c в перегруженной функции аргументом по умолчанию. Так что даже если кто-то передаст только два аргумента, у меня будет только одна функция для обработки этого случая.

Но больше всего меня беспокоит третий аргумент, который в настоящее время равен const char* c. Итак, если я доберусь до чего-то вроде const char* c = "string", будет ли это правильным способом справиться со случаем устранения перегрузки одной функцией с аргументом по умолчанию.

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


person Puneet Mittal    schedule 11.01.2013    source источник
comment
Да. Можно использовать аргумент по умолчанию   -  person hmatar    schedule 11.01.2013
comment
У меня также есть небольшой вопрос, перегрузка функций помогает улучшить ремонтопригодность. Но влияет ли это на общую производительность при очень частом вызове перегруженных процедур?   -  person Puneet Mittal    schedule 11.01.2013
comment
Что касается вашего комментария: перегрузка функций разрешается во время компиляции, поэтому она абсолютно не влияет на производительность во время выполнения.   -  person Angew is no longer proud of SO    schedule 11.01.2013


Ответы (2)


Да, вы можете заменить свои перегруженные функции одной функцией и аргументом по умолчанию:

string conct (string a, string b, const char* c = "string") {
  // do the processing;
  return concatenated_string;
}
  • Когда вы перегружаете функции, компилятор генерирует код для каждой функции, что, вероятно, приводит к увеличению размера кода.
  • Если перегрузка действует как тонкая оболочка, как в вашем случае, оптимизатор может устранить дополнительную работу.
  • Аргументы по умолчанию устанавливаются в местоположении вызывающего объекта, а не внутри функции, поэтому аргументы по умолчанию должны быть общедоступными, а их изменение требует перекомпиляции всех вызывающих объектов. С такой перегрузкой, как у вас, аргумент псевдо-умолчания становится скрытой деталью.
person bames53    schedule 11.01.2013
comment
Вообще говоря, удаляю ли я первую функцию и добавляю третий аргумент по умолчанию во вторую или нет, в моем случае это не помогает ни в какой производительности. - person Puneet Mittal; 12.01.2013
comment
голосование за добавление аргументов по умолчанию устанавливается в местоположении вызывающей стороны, а не внутри функции. Это объясняет, почему нам не нужно указывать значение по умолчанию в определении метода. - person theAlias; 17.10.2013

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

person Arunima Saxena    schedule 05.06.2015