Имеет ли значение порядок объявления перегруженных функций в c ++?
Краткий ответ: Да. Порядок имеет значение в C ++. Возьмите следующий пример:
i = 45;
int i;
Это может привести к ошибке (при условии, что, конечно, нет другого i
в более высоком объеме). Неважно, если это переменная, функция, класс или что-то еще; в C ++ символ должен быть объявлен перед использованием. Даже если это перегруженная функция, любая перегрузка, которую вы используете в определении, должна идти первой.
Аккуратный трюк
Несмотря на то, что вы должны объявить функцию перед ее использованием, вам не нужно определять функцию перед ее использованием. Я уверен, что пример поможет:
void Foo (A input);
void Foo (B input);
Это объявления функций. Обратите внимание, что отсутствует определение - то есть реализация. Это просто говорит компилятору, что такая функция есть. Ему еще не нужно знать, что он делает, только то, что он там есть.
Как это помогает нам? Хорошо, рассмотрим следующую программу (которая работает, кстати):
void Foo (A input);
void Foo (B input);
int main() {
A a = A();
Foo(a);
return 0;
}
void Foo (A input) {
B b = B();
Foo(b);
}
void Foo (B input) {
printf("%s", input.toString());
}
Заметили что-нибудь интересное об этой программе? Мы можем вызвать Foo(A)
in main()
до того, как оно будет определено. Это хорошо, если поместить объявление Foo(A)
выше определения main()
. Компилятор знает, что Foo(A)
существует, поэтому мы можем вызвать его с main()
, даже если у нас пока нет его определения.
Самое интересное в использовании таких объявлений, как это, заключается в том, что как только у нас есть объявления , , мы можем поместить определения в любом порядке . Таким образом, мы можем сделать, например, это:
void Foo (A input);
void Foo (B input);
int main() {
A a = A();
Foo(a);
return 0;
}
void Foo (B input) {
printf("%s", input.toString());
}
void Foo (A input) {
B b = B();
Foo(b);
}
или это:
void Foo (A input);
void Foo (B input);
void Foo (A input) {
B b = B();
Foo(b);
}
int main() {
A a = A();
Foo(a);
return 0;
}
void Foo (B input) {
printf("%s", input.toString());
}
Или даже это:
void Foo (B input) {
printf("%s", input.toString());
}
int main() {
A a = A();
Foo(a);
return 0;
}
void Foo (A input) {
B b = B();
Foo(b);
}
Поскольку все это приходит после деклараций , , порядок определения в данном случае не имеет значения .
Стоит упомянуть, прежде чем я уйду: если у нас есть блок объявлений вроде этого:
void Foo (A input);
void Foo (B input);
Изменение порядка в этом блоке не имеет значения. Итак, мы могли бы сделать это также:
void Foo (B input);
void Foo (A input);
Пока эти заявления предшествуют всем определениям, мы все еще хороши.