在C++中与空指针比较

5

请仔细检查下面的代码,它只是一个函数的一部分

void RepeatWord(){
    system("cls");
    string word = NULL;
    string newword = NULL;
    int repeats = 0;
    while(true){
        if(word == NULL){
            cout<<"Currently no word is stored..";
            cout<<"\n\nPlease enter a word: ";
            cin>>word;
        }
....

我一直在用其他编程语言工作,经常与NULL值进行比较,但在C++中似乎情况不同。错误提示是:

错误:'word == 0' 中没有适配的 'operator=='。

我在想,我只是在将一个值与NULL进行比较,但我真的不知道为什么会出错。在C++中,将一个值与NULL进行比较是否与其他语言不同?请教一下,谢谢。

注:我了解Ruby比Java更多。


1
不要将 std::string 设置为 null(如果运行此操作,将抛出异常)。std::string word; 是一个空字符串。 - chris
3
哇哇......你不能这样空掉对象。这不是Java。 - Mysticial
@Mahan 你可以将指针设置为 NULL。但不能将对象设置为 NULL - Mysticial
3
@Mahan,是的,C和C++在这方面是不同的。我建议你先阅读有关C++对象的资料,指针可以稍后再学习。(在现代C++中,你可能很少需要它们) - Mysticial
4
可能对你有所帮助:在一些你熟悉的其他语言中,当你声明一个变量时,实际上是声明了一个引用,它可能引用一个有效的对象,也可能引用空值(null reference),并且可以从一个对象移动到另一个对象。但在 C++ 中,当你声明一个变量时,你正在创建一个对象。你使用的名称就是该对象的名称,因此它不能引用其他对象,也不能引用空值。这就是指针的作用,尽管指针本身也是对象,它们通过存储对象的地址来引用对象。 - Benjamin Lindley
显示剩余3条评论
2个回答

9
您正在尝试将对象与 NULL 进行比较,您不能将对象与 NULL 进行比较。您需要比较指针。这样做可以检查指针是否指向的是无效对象。
在您的情况下,您想要检查 std :: string 是否为空。您可以使用 std::string 提供的成员函数 std::string :: empty()
考虑到您的问题,我强调需要一本好的学习书: 《The Definitive C++ Book Guide and List》

一个指针?你能给我指一下一个教程,让我学习如何使用指针吗?这样我就可以设置NULL值了。 - Netorica
2
@Mahan,使用C++和STL的重点在于您不需要使用指针。 - Fantastic Mr Fox
1
@Mahan:请从标记为内联的链接中挑选一本好书来回答。 - Alok Save
哦,是的,现在这个可以用了。谢谢,空字符串不是 null 字符串。 - Netorica
1
@Mahan,这真是不可思议,初学者喜欢指针,但大多数错误都发生在指针上,所以初学者写出的代码往往不佳。Ben 的观点非常正确,大部分情况下你并不需要使用指针。而且,在没有垃圾回收机制的语言中,指针非常棘手,因此你应该尽量避免使用它们,至少等你有了更多的经验再考虑。 - john

3
如果你来自Java世界,你会发现C++中的对象处理方式不同。在C++中,除非显式声明,否则数据将直接操作。在Java中,对象完全由虚拟机管理,因此让程序仅通过引用访问它们是有意义的。因此,在编写Java程序时,必须使用new告诉虚拟机分配对象,并在此之前将null赋值给类实例的变量。遵循同样的原则,如果将一个对象变量分配给另一个对象变量,则两者都将“引用”同一个对象,并且调用任何一个对象的方法都将在相同的基础实例上调用该方法。
在C++中,有两种不同的机制可以实现相同的结果:
  • using pointers, whose syntax for the type T is

    T *t;
    

    so that std::string *word; will define a variable named word holding a pointer to std::string.

  • using a reference:

    T &t;
    
在 C++ 中,这两个其实是类型,即 std::stringstd::string *std::string & 是三种不同的类型。第一个实际上表示结构化值本身,而另外两个表示指向类型 std::string 的一个值的引用。
这些类型之间的区别由此 SO 条目 解释。
在您的代码中,您需要将所有 NULL 的出现替换为空字符串字面量 "",或者使用指针并在尝试使用对象之前使用 new 语句分配实例,例如 cin >> word; 行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接