11 Eylül 2017 Pazartesi

nullptr Anahtar Kelimesi- std::nullptr_t Tipinden Farklıdır

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 null pointer constant is an integer literal (5.13.2) with value zero or a prvalue of type std::nullptr_t.
1. Eski Kodlarda NULL
Açıklaması şöyle.
The macro NULL is an implementation-defined null pointer constant.
Eski kodlarda NULL için şu seçenekler vardı.
1. NULL
2. 0
3. '\0'

Yeni kodlarda ise bu seçenekleri bırakıp nullptr kullanmak daha iyi. Açıklaması şöyle.
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).
Hatta yeni kodlarda NULL kullanılsa bilr artık arkada nullptr'ye çevrilebilir.
#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
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ız
Evaluates 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

5. pointer arithmetic
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.
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çimi
NULL genellikle 0 olarak tanımlansa bile ne olması gerektiği standartta belirtilmemiş.  C++ için açıklaması şöyle.
Possible definitions [of macro NULL] include 0 and 0L, but not (void*)0.
Overload seçiminde int parametresi alan bir metoda gidebilir. Ancak void* metoduna gitmez. Şöyle yaparız.
#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