Giriş
nullptr bir anahtar kelime ancak aslında bir literal yani sabit gibi düşünülebilir. Açıklaması şöyle. Tip ile ilgili olarak std::nullptr_t yazısına bakabilirsiniz.
Açıklaması şöyle.
1. NULL
2. 0
3. '\0'
Yeni kodlarda ise bu seçenekleri bırakıp nullptr kullanmak daha iyi. Açıklaması şöyle.
Örnek
Şöyle yaparız. nullptr std isim alanı altında değildir!
Şu kod derlenmez.
Şu kod yanlıştır.
nullptr bir anahtar kelime ancak aslında bir literal yani sabit gibi düşünülebilir. Açıklaması şöyle. Tip ile ilgili olarak std::nullptr_t yazısına bakabilirsiniz.
1. Eski Kodlarda NULLA null pointer constant is an integer literal (5.13.2) with value zero or a prvalue of type std::nullptr_t.
Açıklaması şöyle.
Eski kodlarda NULL için şu seçenekler vardı.The macro NULL is an implementation-defined null pointer constant.
1. NULL
2. 0
3. '\0'
Yeni kodlarda ise bu seçenekleri bırakıp nullptr kullanmak daha iyi. Açıklaması şöyle.
Hatta yeni kodlarda NULL kullanılsa bilr artık arkada nullptr'ye çevrilebilir.In older code, 0 or NULL is typically used instead of nullptr (§7.2.2). However, using nullptr eliminates potential confusion between integers (such as 0 or NULL) and pointers (such as nullptr).
#define NULL 0
//since C++11
#define NULL nullptr
Bazı gcc derleyicileri NULL yerine __null kullanılmasını önerebilir.MyType x = __null;
2. nullptr ile İlklendirmeÖrnek
Şöyle yaparız. nullptr std isim alanı altında değildir!
int *ptr = nullptr; // initialize to be the null pointer of type int*
ÖrnekŞu kod derlenmez.
auto *b{nullptr};
3. boolean' Çevirme
nullptr her zaman false olarak çevrilir.
Örnek
Şöylee yaparız
5. pointer arithmetic
Örnek
Şöylee yaparız
if (nullptr) {
;
} else {
std::cout << "Evaluates to false implicitly\n";
}
if (!nullptr) {
std::cout << "Evaluates to false if operated on\n";
}
if (!(bool)(nullptr)) {
std::cout << "Evaluates to false if explicitly cast to bool\n";
}
Çıktı olarak şunu alırızEvaluates to false implicitly
Evaluates to false if operated on
Evaluates to false if explicitly cast to bool
4. Compare nullptr to other pointers for order
nullptr ile diğer pointer'ların karşılaştırması tanımlı değil. Açıklaması şöyle
... comparing a nullptr with a pointer by a relational operator is not supported by the standard.
std::less kullanılsa bile her zaman tutarlı bir sonuç alırız ancak yine de ne çıkacağı tanımlı değil
nullptr ile pointer arithmetic yapılamaz.
ÖrnekŞu kod yanlıştır.
float * x = nullptr;
float * y = x + 31;
if (y != nullptr)
{
...
}
Örnek
Şu kod yanlıştır.
NULL genellikle 0 olarak tanımlansa bile ne olması gerektiği standartta belirtilmemiş. C++ için açıklaması şöyle.Şu kod yanlıştır.
0 + nullptr;
nullptr - nullptr;
nullptr sabitini pointer'a çevirirsek kod derlenir.0 + (int*)nullptr;
(int*)nullptr - (int*)nullptr;
6. Eski Kodlarda NULL İçin Overload SeçimiOverload seçiminde int parametresi alan bir metoda gidebilir. Ancak void* metoduna gitmez. Şöyle yaparız.Possible definitions [of macro NULL] include 0 and 0L, but not (void*)0.
#include <iostream>
// The overloaded function under question can be a constructor or
// an overloaded operator, which would make this example less silly
void foo(char) { std::cout << "foo(char)" << std::endl; }
void foo(int) { std::cout << "foo(int)" << std::endl; }
void foo(long) { std::cout << "foo(long)" << std::endl; }
void foo(void*) { std::cout << "foo(void*)" << std::endl; }
int main()
{
foo('\0'); // this will definitely call foo(char)
foo(NULL); // this, most probably, will not call foo(char)
}
nullptr ise void* alan metoda gider. Şöyle yaparız.#include <iostream>
void f(int) {
std::cout << "int" << std::endl;
}
void f(long) {
std::cout << "long" << std::endl;
}
void f(char) {
std::cout << "char" << std::endl;
}
void f(void*) {
std::cout << "void*" << std::endl;
}
int main() {
f(0);
f(NULL);
f('\0');
f(nullptr);
}
Çıktı olarak şunu alırız.int
int
char
void*
Hiç yorum yok:
Yorum Gönder