Would you like to react to this message? Create an account in a few clicks or log in to continue.

You are not connected. Please login or register

View previous topic View next topic Go down  Message [Page 1 of 1]

des

des
Achiever
Loading
The literal 0 has a unique position in C++ programming -- it automatically converts to almost every fundamental type, depending on the context:
Code:
 int x=0;
  double d=0;
  char * pstr=0; //null pointer
  int (A::*pmf)(int) =0; //null pointer to member
  bool flag=0; //Boolean false
Using 0 as a null pointer might lead to overload resolution bugs such as this:
Code:

void f(int); //#1
  void f(char *);//#2
 
  f(0); //which f is called?
The C++ programmer believes that #2 is called. However, the compiler interprets 0 in this context as an integer, never as a pointer, and selects #1 instead. Things get worse when the macro NULL is used. Recall that NULL in C++ programming is merely a synonym for 0:
Code:

 f(NULL); //calls f(int)!
C usually defines NULL as (void*)(0). Many compilers don't even issue a warning in this case. The bug is detected (if ever) only at crash-time.

In contemporary C++ programming, the only workaround is an explicit typecast expression that forces the compiler to select the desired function:
Code:

f((char *)0); //unambiguous but still a kludge
This workaround isn't ideal though. Often, programmers don't use an explicit cast expression because they're not aware of the problem. Additionally, the cast expression obfuscates the code and makes it less readable.


[size=150]Using nullptr[/size]
The C++ standards committee has been aware of this problem for many years. However, a consensus about the right solution was reached only recently in the form of a new keyword that designated a null pointer value. nullptr is a C++0x reserved keyword designating an rvalue constant of type
std::nullptr_t.

nullptr is implicitly converted to pointers and pointers to members. However, it's not convertible to bool or any of the numeric types of C++.

You can use nullptr as an initializer for all pointer types and in comparison expressions:
Code:
const char *pc=str.c_str();
  if (pc!=nullptr)
    cout<<pc<<endl;
  int (A::*pmf)()=nullptr; //pointer to member function
  int A::*pmi=nullptr; //pointer to data member
Any attempt to use nullptr as a non-pointer type will cause a compilation error:
Code:
 char* ps=nullptr; //OK
  char c=nullptr; //error, type mismatch
  int n=nullptr; //error, type mismatch

[size=150]A Solution to a Thorny Problem[/size]

The use of nullptr eliminates the overload resolution problem:
Code:
func(nullptr); //calls func (char*)
  func(0); //calls func(int)
You may explicitly instantiate objects of type std::nullptr_t, and use nullptr in sizeof expressions:
Code:

cout<< typeid(nullptr).name();
  size_t sz= sizeof(nullptr);
Throwing nullptr_t objects from a try block is also allowed:
Code:

try
  {
  if(failure)
    throw nullptr; //OK
  }
  catch(std::nullptr_t)
  {
  cerr<<"terminating!";
  }
Many programming languages have used a reserved keyword to designate a null pointer or a null reference for ages. The lack of a similar keyword in C++ programming has been a fertile source of bugs for many years. The addition of nullptr finally fixes a this longstanding loophole in the type system of C++. +rep if this actually helped you.

DJ Fresh

DJ Fresh
Master
Loading
Thanks bro <3

OwenWilson

OwenWilson
Master
Loading
that meakes sense
tongue
thank u desu its very helfupl

Sponsored content


Loading

View previous topic View next topic Back to top  Message [Page 1 of 1]

Related topics

Permissions in this forum:
You cannot reply to topics in this forum