我们现在拥有许多新功能的C++ 11.一个有趣且令人困惑的(至少对我来说)是新的nullptr.
嗯,不再需要令人讨厌的宏了NULL.
int* x = nullptr;
myclass* obj = nullptr;
尽管如此,我还没有得到如何nullptr运作.例如,维基百科的文章说:
C++ 11通过引入一个new 关键字作为一个区分空指针常量来解决这个问题:nullptr.它的类型为nullptr_t,它是可隐式转换的,可与任何指针类型或指向成员类型的类型相媲美.除了bool之外,它不可隐式转换或与整数类型相比.
它是一个关键字和一个类型的实例?
另外,你有另一个例子(在维基百科旁边)哪里nullptr优于好老0?
在C中,似乎有零各个值之间的差- NULL,NUL和0.
我知道ASCII字符的'0'计算结果为48或0x30.
该NULL指针通常定义为:
#define NULL 0
要么
#define NULL (void *)0
另外,也有似乎评价的NUL人物.'\0'0
是否有时候这三个值不相等?
这在64位系统上也是如此吗?
以下代码(取自此处):
int* ptr = int();
在Visual C++中编译并对指针进行值初始化.
怎么可能?我的意思是int()产生一个类型的对象,int我不能指定int一个指针.
上面的代码如何不违法?
对于32位系统(无论是Linux,Mac OS或Windows,PowerPC还是x86)的C++开发,我已经初始化了指针,否则这些指针将被定义(例如,它们无法立即获得正确的值),如下所示:
int *pInt = reinterpret_cast<int *>(0xDEADBEEF);
(为了节省打字和DRY,右侧通常是常数,例如BAD_PTR.)
如果在获得正确值之前取消引用pInt,那么它将在大多数系统上立即崩溃(而不是在某些内存被覆盖或进入非常长的循环时崩溃).
当然,行为取决于底层硬件(从用户进程获取奇数地址0xDEADBEEF的4字节整数可能完全有效),但崩溃对于我迄今为止开发的所有系统都是100%可靠的( Mac OS 68xxx,Mac OS PowerPC,Linux Redhat Pentium,Windows GUI Pentium,Windows控制台Pentium).例如,在PowerPC上,从奇数地址获取4字节整数是非法的(总线故障).
在64位系统上,这有什么好处呢?