此方法是否评估空字符串?

时间:2015-02-22 02:38:37

标签: c++ pointers syntax

我是c ++的新手,所以如果这是一个愚蠢的问题,请耐心等待。

下面的方法似乎创建了一个名为reversePhrase但没有初始值的字符串,然后使用它phrase.evalPalindrome(reversePhrase)

void testForPalindrome(string origPhrase)
{
   string reversePhrase;
   bool isPalindrome;
   Palindrome phrase(origPhrase);


   if (phrase.evalPalindrome(reversePhrase))
   {
      cout << "This phrase IS a palindrome!" << endl; 
   }
   else
   {
      cout << "This phrase is NOT a palindrome." << endl; 
   }
   cout << "Original phrase: " << origPhrase << endl;
   cout << "Reverse phrase: " << reversePhrase << endl << endl;
}

在java中,这将创建一个空指针异常。但我分析了被调用的方法,看起来它接受了字符串的地址。

bool Palindrome::evalPalindrome (string& reversePhrase)
{
   // code
}

但我不明白这是如何运作的。初始string reversePhrase;是否只是将内存分配给reversePhrase?如果是,那么调用函数如何能够打印出从另一个函数修改的reversePhrase(代码未显示,但是从另一个函数修改)。

似乎用这种方式编写代码很难阅读。

5 个答案:

答案 0 :(得分:3)

  

在java中,这将创建一个空指针异常。

这是因为Java是一种具有不同对象创建语法的不同语言。

在C ++中,只要您编写string reversePhrase,该对象就已完全成型并准备就绪。


  

但我分析了被调用的方法,看起来它接受字符串的地址。

不,它接受对字符串的引用!这就是为什么调用范围以后可以看到修改后的字符串!

答案 1 :(得分:2)

string& reversePhrase未声明evalPalindrome获取字符串的地址。它声明了对字符串采用引用的功能。 (用string*声明它意味着字符串的地址,也就是指向字符串的指针。)

在C ++中,初始化不带参数的字符串时:

string reversePhrase;

它会创建一个空字符串,因此reversePhrase等于""。因此它不是空字符串,只是一个空字符串,您可以通过引用evalPalindrome函数安全地传递它,然后它将能够修改传递给它的原始字符串对象。

答案 2 :(得分:1)

您不是在创建指针,而是创建string类型的对象。它从未被分配,因此它应该只是一个空白字符串&#34;&#34;。获取地址可以正常工作,因为它是一个有效的对象。

我不确定这个功能是如何工作的。

答案 3 :(得分:1)

这里发生的是所谓的传递参考。通常,当您在C ++中传递变量时,会生成一个变量。这就是为什么当你运行以下内容时,你会得到&#34; A&#34;,&#34; B&#34;,&#34; A&#34;。

int main(){
    string s = "A";
    cout << s << endl;
    cngLetter(s);
    cout << s << endl;
}

void cngLetter(string s){
    s = "B";
    cout << s << endl;
}

如果您通过引用传递,那么它将在主线程上更新它。以下将打印&#34; A&#34;,&#34; B&#34;,&#34; B&#34;

int main(){
    string s = "A";
    cout << s << endl;
    cngLetter(s);
    cout << s << endl;
}

void cngLetter(string& s){
    s = "B";
    cout << s << endl;
}

请注意,只添加了一个字符,&导致按引用传递,即不是副本,而是内存地址。我不需要在这篇文章中输入很多内容,因为你可以阅读here

现在string不是非托管内存,所以如果你一开始没有分配它,那么你将获得&#34;&#34;,&#34; B& #34;,&#34; B&#34;

int main(){
    string s;
    cout << s << endl;
    cngLetter(s);
    cout << s << endl;
}

void cngLetter(string s){
    s = "B";
    cout << s << endl;
}

基本上,没有给出初始值的字符串只是一个空字符串。

答案 4 :(得分:-2)

&#39;&amp;&#39;在这种情况下,运算符是&#39; *&#39;的语法糖果。在evalPalindrome方法中,当reversePhrase作为指针传入时,它总是被解除引用。这使得不能解除引用指针的常见错误。你是对的,它可以使代码混淆,因为传入的值可以被修改,类似于它作为指针传入,除了调用函数没有指示它被传入作为除非你专门查看方法签名,否则指针。