正确的空指针检查和声明

12 浏览
0 Comments

正确的空指针检查和声明

我们现在有了许多新功能的C++11。一个有趣且令人困惑的功能(至少对我来说)是新的nullptr。\n不再需要糟糕的宏NULL了。\n

int* x = nullptr;
myclass* obj = nullptr;

\n但是,我还是不明白nullptr的工作原理。例如,维基百科文章说:\n

\nC++11通过引入一个新的关键字来纠正这个问题,作为一个特殊的空指针常量:nullptr。它的类型是nullptr_t,可以隐式转换和比较任何指针类型或成员指针类型。除了bool之外,它不能隐式转换或比较整数类型。\n

\n它如何既是关键字又是某种类型的实例?\n此外,除了维基百科的例子,你有没有其他例子可以说明nullptr优于旧的0

0
0 Comments

C++09?难道不是在2011年8月之前被称为C++0x吗?

嗯,这就是它的目的。C++0x在它仍然在进行中的时候使用,因为不知道它会在2008年还是2009年完成。请注意,它实际上变成了C++0B,即C++11。参见stroustrup.com/C++11FAQ.html。

从nullptr: A Type-safe and Clear-Cut Null Pointer这篇文章中:

C++09中引入了一个新的关键字nullptr,它是一个右值常量,用作一个通用的空指针字面量,取代了错误和弱类型的字面量0和臭名昭著的NULL宏。nullptr因此结束了30多年的尴尬、模糊和错误。下面的部分介绍了nullptr的功能,并展示了它如何修复NULL和0的问题。

其他参考资料:

- WikiBooks,其中包含示例代码。

- Stack Overflow上的一个问题:在C++中,你使用NULL还是0(零)来表示指针?

- template

- Google group: comp.lang.c++.moderated - 编译器讨论

nullptr是一个新的关键字,在C++09中引入,用于表示空指针。它解决了使用0和NULL作为空指针字面量的问题。之前的0和NULL在类型上不安全且容易引发bug。nullptr是一个右值常量,可以用于初始化指针,也可以与指针进行比较。它的引入消除了30多年来的混淆和错误。

nullptr的引入为C++带来了更安全和清晰的空指针处理方式。在使用指针时,正确的空指针检查和声明是非常重要的。通过使用nullptr关键字,可以避免使用0和NULL导致的类型不安全和意义不明确的问题。

使用nullptr进行空指针检查时,可以使用以下语法:

if (ptr == nullptr) {
    // 指针为空
} else {
    // 指针不为空
}

在声明指针时,也可以使用nullptr进行初始化:

int* ptr = nullptr;

通过使用nullptr关键字,可以明确指示一个指针是空指针,避免了使用0或NULL来表示空指针时的模糊性和错误。

总之,nullptr是C++09引入的一个新关键字,用于表示空指针。它解决了使用0和NULL作为空指针字面量时的类型不安全和错误问题。使用nullptr可以进行正确的空指针检查和声明,提高代码的可读性和可靠性。

0
0 Comments

C++11中为什么引入了nullptr?它是什么?为什么NULL不够用?C++专家Alex Allain在他的文章中解释得非常好:

想象一下你有以下两个函数声明:

void func(int n);

void func(char *s);

func(NULL); // 猜猜哪个函数会被调用?

虽然看起来第二个函数会被调用--毕竟你传递的是一个指针--但实际上会调用第一个函数!问题在于,因为NULL等于0,而0是一个整数,所以会调用第一个版本的func。这种情况并不经常发生,但当发生时非常令人沮丧和困惑。如果你不知道具体发生了什么,它很可能看起来像是一个编译器bug。一个看起来像编译器bug的语言特性,显然不是你想要的。

于是引入了nullptr。在C++11中,nullptr是一个新的关键字,用于表示空指针;换句话说,你以前使用NULL的地方,现在应该使用nullptr。对于程序员来说,这并没有增加更多的清晰度(每个人都知道NULL的含义),但对于编译器来说更加明确。编译器将不再看到0被用作指针时具有特殊含义的情况。

最后,不要忘记nullptr是一个对象--一个类。它可以在以前使用NULL的任何地方使用,但如果由于某种原因需要其类型,可以使用decltype(nullptr)提取其类型,或者直接使用std::nullptr_t进行描述,它只是decltype(nullptr)的typedef,如下所示:

在头文件中定义:

namespace std

{

typedef decltype(nullptr) nullptr_t; // (since C++11)

// OR (same thing, but using the C++ keyword `using` instead of the C and C++

// keyword `typedef`):

using nullptr_t = decltype(nullptr); // (since C++11)

} // namespace std

参考文献:

1. Cprogramming.com: Better types in C++11 - nullptr, enum classes (strongly typed enumerations) and cstdint

2. https://en.cppreference.com/w/cpp/language/decltype

3. https://en.cppreference.com/w/cpp/types/nullptr_t

4. https://en.cppreference.com/w/cpp/header/cstddef

5. https://en.cppreference.com/w/cpp/keyword/using

6. https://en.cppreference.com/w/cpp/keyword/typedef

0
0 Comments

NULL指针检查和声明错误的出现原因是因为在代码中使用了不正确的空指针常量,如0或NULL,而不是使用正确的空指针常量nullptr。这样会导致代码中出现歧义,无法正确选择指针版本的函数。

要解决这个问题,可以采取以下方法:

- 在代码中使用正确的空指针常量nullptr,而不是0或NULL。

- 确保代码中的空指针检查和声明使用正确的语法和类型。

- 对于将nullptr转换为整数类型的情况,可以使用reinterpret_cast进行转换,或者使用static_cast。

- 使用sizeof(nullptr_t)来获取空指针常量nullptr的大小,该大小应该与指针类型的大小相同。

需要注意的是,NULL并不保证等于0。它可以是0L,这样会导致对于void f(int); void f(char *);的调用出现歧义。而nullptr将始终选择指针版本,并且不会调用int版本。

另外,nullptr是可以转换为bool类型的,但只适用于直接初始化的情况。在其他情况下,如if(nullptr),该转换不适用。

总结起来,为了正确检查和声明空指针,应该使用nullptr作为空指针常量,避免使用0或NULL,同时注意使用正确的语法和类型进行空指针转换和操作。

0