Przeciążenie funkcji - ktora zostanie wybrana?

0

Witam,

mam problem, bo program wyrzuca mi błąd, chodzi mi o wywołanie funkcji fun(). Wiem, że jest przeciązona, ale pytanie moje, to które z tych wywołan bea prawoidłowe:

a) fun(a);
b) fun(b,a)
c) fun(static_cast<float>(c));

Wydaje mi się, ze pierwsze i trzecie, ale nie mogę tego sprawdzić, bo program nie chce mi sie skompilowac ;./

#include <iostream>

using namespace std;

int main(int argc,char **argv)
{
    int a;
    float b;
    char c;

    int fun (float x);
    void fun (int x, float y);

    fun(static_cast<float>(a));

    return 0;
}
0

a gdzie definicja fun?

0

Żadna, bo nie definiuje/deklaruje sie funkcji wewnątrz innej funkcji więc zapis

int main(int argc,char **argv)
{
//.....
    int fun (float x);
    void fun (int x, float y);
//....    
}

jest absolutnie nie do przyjęcia.

Poza tym jak nie pokazesz nam jak wygląda ta twoja funkcja (przeładowana zresztą, a nie przeciążona chyba ;) ) to ciężko będzie stwierdzić która wersja się wykona.

0

o czlowieku... nawet jak masz gdzies funkcje fun to ci sie nie skompiluje bo ze wywolujesz fun().

int fun (float x);
void fun (int x, float y);

co to ma byc?
nie masz tez x,a ni y.

kod:

int i;
float f;
char c;

fun(i);
fun(i,f);
0

Dlaczego uważasz, że nie do przyjęcia. Można deklarować funkcję wewnątrz ciała innej.

Przeładowanie = przeciążanie ;-P

dwie pierwsze to zamierzone deklaracje, a kolejna (ta ze static_cast) to zamierzone wywołanie to oczywiście wywoła się funkcja int foo(float x), gdyż tylko ona pasuje do wywołania (liczba argumentów).

Nawet zrozumiałem już pytanie :-D Dzięki.
Wszystkie wywołania są ok (a,b,c).

fun(a), gdyż a, które jest typu int zostanie niejawnie rzutowane do float i zostanie wywołana funkcja int foo(float x).

fun(b,a), gdyż b i a, zostaną rzutowane niejawnie odpowiednio na int i float. Wiem, że trochę dziwna może się wydawać promocja (tylko w drugą stronę) float -> int w przypadku b, ale w C++ tak właśnie będzie.

Trzecie wywołanie jest oczywiste, bo jawnie jest rzutowanie i wywołanie działa po prostu (idealne dopasowanie). Sorry, za pierwszego, trochę mylącego posta.

o czlowieku... nawet jak masz gdzies funkcje fun to ci sie nie skompiluje bo ze wywolujesz fun().

int fun (float x);
void fun (int x, float y);

To nie jest wywołanie. To jest deklaracja. Nie kompiluje się bo właśnie nie ma funkcji int fun(float x) i void fun(int x, float y); nigdzie.

Wystarczy dodać taki kod:

int fun (float) {
return 1;
}

void fun(int,float) {
}

i będzie się już kompilowało. Oczywiście te definicje w zasięgu globalnym

0
Shalom napisał(a)

Żadna, bo nie definiuje/deklaruje sie funkcji wewnątrz innej funkcji więc zapis

int main(int argc,char **argv)
{
//.....
    int fun (float x);
    void fun (int x, float y);
//....    
}

jest absolutnie nie do przyjęcia.

To akurat moze byc poprawne - tzw. nadpisanie deklaracji funkcji; moze posluzyc do zmiany argumentow domyslnych. Inna sprawa, ze takowe tutaj nie istnieja.

1 użytkowników online, w tym zalogowanych: 0, gości: 1