NULL vs nullptr (为什么被替换了?)
在C++中,NULL的定义是0,所以只有一种美感上的区别。我更喜欢避免使用宏,所以我使用0。另一个关于NULL的问题是,有时人们错误地认为它与0不同,或者不是一个整数。在早期的标准之前,NULL有时被定义为不合适的值,因此必须避免使用。但这种情况如今已经不太常见了。
如果你必须给空指针命名,那就称之为nullptr,这是C++11中的叫法。然后,"nullptr"将成为一个关键字。
这并没有真正回答问题,只是提供了一个关于名称来源的来源。我认为这就是C++11中引入新关键字nullptr的原因。这在某种程度上是一个答案,因为它解释了NULL的一个问题,但它并没有解释nullptr是如何避免这个问题的,以及为什么实际上引入了nullptr(这才是提问者实际上想要知道的问题)。
好的,谢谢。但很抱歉,因为我很久之前回答过这个问题,现在我记不清具体情况了!
在C++中,原先使用NULL表示空指针。然而,NULL存在一些问题,因此被nullptr替代。下面是问题出现的原因和解决方法:
问题的原因:
1. 改进库构建的支持:提供一种方式让用户编写更少歧义的代码,使得库编写者随着时间的推移不需要担心整数和指针类型的重载问题。
2. 改进泛型编程的支持:更容易明确地表达整数0和nullptr。
3. 使C++更易于教授和学习。
问题的解决方法:
C++引入了nullptr来替代NULL。nullptr是一个关键字,表示空指针。它解决了以下问题:
1. nullptr可以明确地表示空指针,而不会与整数0产生歧义。
2. nullptr可以被重载,因此在使用泛型编程时更加灵活。
3. nullptr的使用更加直观和易于理解,使得C++更易于教授和学习。
通过引入nullptr来替代NULL,C++解决了表示空指针的一些问题,包括歧义、泛型编程支持和教学。nullptr可以明确地表示空指针,避免与整数0产生歧义,并且可以被重载,提供更大的灵活性。这样,C++变得更加易于教授和学习,同时也提高了库构建和泛型编程的支持。
在C++11之前,程序中常用的表示空指针的方式是使用0或者NULL。然而,这种表示空指针的方式存在一些问题。首先,0可以被隐式地转换为整型,这可能会导致在函数重载的过程中出现歧义。其次,NULL在C++中被定义为0,但实际上它是一个整型,而不是指针类型。这可能会导致在一些情况下无法使用。
为了解决这些问题,C++11引入了新的关键字nullptr。nullptr的类型是std::nullptr_t,它可以被隐式地转换为任何指针类型,但不能转换为其他类型,如整型。通过使用nullptr,可以避免在函数重载中出现歧义,并且可以更明确地表示空指针。
下面是一个示例,展示了使用0和nullptr表示空指针的区别:
void f(int); void f(foo *); int main() { f(0); // 歧义,无法确定调用哪个函数 f(nullptr); // 明确指定调用第二个函数,表示空指针 }
在上面的示例中,使用0表示空指针会导致函数f的调用出现歧义,因为0可以被隐式地转换为整型。而使用nullptr则可以明确地表示空指针,并且不会引起歧义。
总结起来,nullptr的引入是为了解决使用0或者NULL表示空指针时可能出现的歧义和类型不明确的问题。通过使用nullptr,可以更安全、清晰地表示空指针,并且避免在函数重载中出现歧义。
代码示例来源:https://stackoverflow.com/questions/9586103