在C++的早期,当它被用螺栓固定在C之上时,你不能使用NULL,因为它被定义为(void*)0.你不能将NULL分配给除了之外的任何指针void*,这使得它变得毫无用处.在那些日子里,人们接受了你使用0(零)空指针.
直到今天,我继续使用零作为空指针,但我周围的人坚持使用NULL.我个人认为给NULL现有值一个name()没有任何好处- 因为我也喜欢将指针测试为真值:
if (p && !q)
do_something();
Run Code Online (Sandbox Code Playgroud)
然后使用零更有意义(如果你使用NULL,你不能逻辑使用p && !q- 你需要明确比较NULL,除非你假设NULL是零,在这种情况下为什么使用NULL).
有没有客观的理由偏好零而不是NULL(反之亦然),或者只是个人偏好?
编辑:我应该添加(并且最初要说)使用RAII和异常,我很少使用零/ NULL指针,但有时你确实需要它们.
std::string my_string = "";
char test = my_string[0];
Run Code Online (Sandbox Code Playgroud)
我注意到这不会崩溃,每次我测试它,测试都是0.
我可以依赖它总是0吗?还是随意的?
这是不好的编程吗?
编辑:从一些评论中,我认为对此的有用性存在一些误解.
这样做的目的不是检查字符串是否为空.不需要检查字符串是否为空.
情况是有一个字符串可能是空的也可能不是.我只关心这个字符串的第一个字符(如果它不是空的).
在我看来,检查字符串是否为空是不太有效,然后,如果它不是空的,请查看第一个字符.
if (! my_string.empty())
test = my_string[0];
else
test = 0;
Run Code Online (Sandbox Code Playgroud)
相反,我只需查看第一个字符,无需检查字符串是否为空.
test = my_string[0];
Run Code Online (Sandbox Code Playgroud) 在我从未听说过智能指针的几个旧代码项目中,每当我需要检查指针是否仍指向有效对象时,我总会做这样的事情......
object * meh = new object;
if(meh)
meh->member;
Run Code Online (Sandbox Code Playgroud)
或者当我需要安全地删除对象时,就像这样
if(meh)
{
delete meh;
meh = 0;
}
Run Code Online (Sandbox Code Playgroud)
那么,现在我已经了解了使用文字数字在布尔表达式中使用对象和指针可能产生的问题,困难的方法:.现在我还了解到C++这个nullptr关键字的新功能还不是很酷的功能.但现在我很好奇.
我已经完成并修改了我的大部分代码,例如,在删除我现在编写的对象时
if(meh)
{
delete meh;
meh = nullptr;
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道布尔值.当你将一个int传递给if语句时,
int meh;
if(meh)
Run Code Online (Sandbox Code Playgroud)
然后它隐式检查零,而不需要你编写它.
if(meh == 0) // does the exact same check
Run Code Online (Sandbox Code Playgroud)
现在,C++会为指针做同样的事情吗?如果将这样的char*传递给if语句?
char * meh;
if(meh)
Run Code Online (Sandbox Code Playgroud)
然后它会隐式地将它与nullptr进行比较吗?由于我已经写了这样多长时间这样,所以在这一点上通过输入if(object*)然后调用其成员来检查指针在使用之前是否有效是第二天性.如果这不是功能,为什么不呢?实施起来太难了?通过删除另一个可能搞乱代码的微小方法来解决一些问题.