nullptr
Megjelenés
Főnév
nullptr (tsz. nullptrs)
- (informatika) A
nullptra C++ nyelvben egy null mutatót jelölő kulcsszó, amelyet a C++11 szabvány vezetett be, és a régiNULLmakrót váltotta fel. Anullptregy típusbiztos megoldás a null mutató kezelésére, amely segít elkerülni aNULL-lal kapcsolatos hibákat, különösen az értelmezési (overload resolution) problémákat.
Miért jobb a nullptr, mint a NULL?
Típusbiztonság
- A
NULLmakró általában0-ként van definiálva (#define NULL 0), amiinttípusú, és problémákat okozhat túlterhelt (overloaded) függvények esetén. - A
nullptrsaját típussal rendelkezik:std::nullptr_t, így egyértelműen mutatóként kezelhető.
- A
Overload resolution problémák elkerülése
void foo(int); void foo(char*); int main() { foo(NULL); // HIBA: Az int típusú NULL az int változatot hívja meg, nem a mutatósat. foo(nullptr); // HELYES: Egyértelműen a char* változat hívódik meg. }
Jobb kompatibilitás modern C++ kóddal
- A
nullptr-t az új C++ szabványokkal tervezték, és támogatja az újabb nyelvi funkciókat.
- A
Használata
Egyszerű használat
int* p = nullptr; // p egy null mutató
Függvényhívások
void fun(int* p) { if (p == nullptr) { std::cout << "Null pointer passed\n"; } } int main() { fun(nullptr); // Biztonságosabb, mint NULL }
Típusvizsgálat (
std::nullptr_t)std::nullptr_t nptr; // nptr egy nullptr típusú változó int* ptr = nullptr; if (ptr == nptr) { std::cout << "ptr is nullptr" << std::endl; }
Osztályokban és smart pointerekkel
class MyClass { public: void show() { std::cout << "Hello, World!\n"; } }; int main() { std::unique_ptr<MyClass> obj = nullptr; // Biztonságos inicializálás if (!obj) { std::cout << "Object is null\n"; } }
Gyakori kérdések és hibák
- Mi történik, ha egy mutatóval dolgozunk, és az
nullptrértéket kap?- Ha egy mutató
nullptrértékkel rendelkezik, az azt jelenti, hogy nem mutat érvényes memóriaterületre. Bármilyen dereferálási (*ptr) próbálkozás “undefined behavior”-hez vezet.
- Ha egy mutató
- Hogyan használható a
nullptrC++98-ban?Mivel a
nullptrC++11 újdonság, régebbi verziókban ezt makróval vagy inline függvénnyel lehet szimulálni:#define nullptr 0
- Használhatom a
nullptr-t más típusokkal is?A
nullptralapvetően csak mutatókhoz való, nem lehet példáulinttípusú változóba tenni:int x = nullptr; // HIBA: `nullptr` nem konvertálható `int` típusra
Összegzés
A nullptr egy erőteljes és biztonságosabb alternatíva a NULL helyett C++-ban. A nullptr típusbiztos, segít az overload resolution problémák elkerülésében, és természetesebb módon illeszkedik a modern C++ nyelvi elemekhez. Ha C++11 vagy újabb verziót használsz, mindig érdemes nullptr-t használni NULL helyett.