2012-01-23 12 views
6

Duplicar posible:
What will happen when I call a member function on a NULL object pointer?¿Por qué es posible llamar a la función miembro no estática sin una instancia de objeto?

Bueno, creo que este código y el programa de salida explicarlo auto:

#include <iostream> 
#include <string> 
using namespace std; 

class Test 
{ 
public: 
    void Not_Static(string args) 
    { 
     cout << args << endl; 
    } 
}; 

int main() 
{ 
    Test* Not_An_instance = nullptr; 
    Not_An_instance->Not_Static("Non-static function called with no object?"); 
    cin.ignore(); 
    return 0; 
} 

salida del programa:

¿Se ha llamado a la función no estática sin ningún objeto?

¿por qué es esto posible?

+5

Porque es un comportamiento indefinido, por lo que cualquier cosa puede suceder. –

+0

@FredLarson, aunque es cierto, en realidad * no explica * por qué es posible. –

+0

Es posible porque no es tarea de C++ evitar que te pegues un tiro en la cara. –

Respuesta

9

Comportamiento indefinido. Su programa invoca un comportamiento indefinido al invocar un método en un puntero nulo, por lo que todo está permitido, incluida su salida.

Recuerde: la especificación del lenguaje C++ no especifica la salida de cada programa posible para dejar espacio para optimizaciones. Muchas cosas no se controlan explícitamente y pueden dar como resultado un comportamiento que parece incorrecto o ilógico, pero que simplemente no se especifica.

2

Porque no usa this y, por lo tanto, no desreferencia el puntero nulo. Hazlo virtual y probablemente falle.

5

Este comportamiento no está definido, por lo que es bastante posible que imprima esa salida. El problema es que el comportamiento indefinido puede morderte fácilmente, por lo que no debes hacer tal cosa.

Cuestiones relacionadas