2016-11-08 1 views
4

Aus dem folgenden Code-Snippet bekomme ich die Adresse der Funktion ist 1. Warum?Warum Funktion Pointer-Adresse in bool Typ in C++ druckt?

#include<iostream> 
using namespace std; 
int add(int x, int y) 
{ 
    int z; 
    z = x+y; 
    cout<<"Ans:"<<z<<endl; 
} 

int main() 
{ 
    int a=10, b= 10; 
    int (*func_ptr) (int,int); 
    func_ptr = &add; 
    cout<<"The address of function add()is :"<<func_ptr<<endl; 
    (*func_ptr) (a,b); 
} 
+0

Der Funktionszeiger wird implizit in Boolean umgewandelt. Es gab vor kurzem eine ähnliche Frage, – stefaanv

+1

Mögliches Duplikat von [So drucken Sie Funktionszeiger mit cout?] (Http://stackoverflow.com/questions/2064692/how-to-print-function-pointers-with-cout) – stefaanv

Antwort

8

Funktionszeiger sind nicht in Datenzeiger umwandelbar. Sie würden einen Compilerfehler erhalten, wenn Sie versuchen würden, einen zu einer void* Variable zuzuweisen. Aber sie sind implizit in bool umwandelbar!

Deshalb wird die bool Überlast für operator<< über die const void* gewählt.

Um die gewünschte Überladung zu erzwingen, müssten Sie eine sehr starke C++ - Umwandlung verwenden, die fast vollständig ignoriert die statischen Informationen.

#include<iostream> 
using namespace std; 
int add(int x, int y) 
{ 
    int z; 
    z = x+y; 
    cout<<"Ans:"<<z<<endl; 
} 

int main() 
{ 
    int a=10, b= 10; 
    int (*func_ptr) (int,int); 
    func_ptr = &add; 
    cout<<"The address of function add()is :"<< reinterpret_cast<void*>(func_ptr) <<endl; 
    (*func_ptr) (a,b); 
} 

anzumerken, dass Gieß- und Behandlungsfunktionszeiger als Datenzeiger ist nur bedingt unterstützt (aus dem C++ Standard-Standpunkt aus). Wenn Sie es für etwas anderes als das Zurücksetzen auf denselben Funktionszeiger verwenden, wird dies ein implementierungsspezifisches Ergebnis haben, das unter Compilern sehr groß sein kann.

3

Die Überlast ist

ostream& ostream::operator<< (bool val); 

Welche 1 druckt als Funktionszeiger nicht Null ist.

Verwandte Themen