Según el estándar C++, es un comportamiento indefinido. Sin embargo, un C implementación típica ++ tratará a una función miembro no virtual
void A::func(int arg);
como la función de estilo C
void A_func(A* this, int arg);
Y al igual que cualquier argumento de un puntero, que está bien que "este" ser NULL siempre y cuando no desreferencia la memoria.Por lo tanto, si escribe:
#include <iostream>
class A
{
public:
void test();
};
void A::test()
{
std::cout << "This function could have been static." << std::endl;
}
int main()
{
((A*) NULL)->test();
return 0;
}
Correrá bien (al menos en MSVC y G ++).
Sin embargo, esto da un fallo de segmentación:
#include <iostream>
class A
{
public:
void test();
private:
int _n;
};
void A::test()
{
_n = 42;
}
int main()
{
((A*) NULL)->test();
return 0;
}
El caso (esto == NULL) cheque es un intento de evitar una referencia a un puntero nulo se estrelle el programa.
Pero para cumplir con la norma, es mejor hacer la prueba desde el exterior.
if (pList != NULL)
{
pList->Insert(value);
}
IT'S A TRAP !!!! – Ben