此方法是否计算空字符串
Is this method evaluating a null string?
我是 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
(未显示代码,但从另一个函数修改(。
似乎以这种方式编写代码很难阅读。
在 java 中,这将创建一个空指针异常。
这是因为Java是一种不同的语言,具有不同的对象创建语法。
在C++中,一旦你写了string reversePhrase
,那个对象就完全成型并准备好了。
但是我分析了正在调用的方法,看起来它接受字符串的地址。
不,它接受对字符串的引用!这就是为什么调用范围稍后可以看到修改后的字符串!
string& reversePhrase
不会声明evalPalindrome
获取字符串的地址。它声明函数以引用字符串。(用 string*
声明它意味着字符串的地址,也就是指向字符串的指针。
在C++中,当您初始化没有参数的字符串时:
string reversePhrase;
它创建一个空字符串,因此reversePhrase
等于 ""
。因此,它不是一个空字符串,只是一个空字符串,您可以通过引用 evalPalindrome
函数安全地传递它,然后该函数将能够修改传递给它的原始字符串对象。
您创建的不是指针,而是字符串类型的对象。它永远不会被分配,所以它应该只是一个空字符串 "。获取它的地址将正常工作,因为它是一个有效的对象。
不过,我不确定该功能将如何工作。
这里发生的事情就是所谓的通过引用传递。通常,当您在 C++ 中传递变量时,会创建它的副本。这就是为什么当您运行以下内容时,您将获得"A","B","A"。
int main(){
string s = "A";
cout << s << endl;
cngLetter(s);
cout << s << endl;
}
void cngLetter(string s){
s = "B";
cout << s << endl;
}
如果通过引用传递,则它将在主线程上更新它。以下将打印"A"、"B"、"B">
int main(){
string s = "A";
cout << s << endl;
cngLetter(s);
cout << s << endl;
}
void cngLetter(string& s){
s = "B";
cout << s << endl;
}
请注意,只添加了一个字符,即导致通过引用传递的&
,即不是副本,而是内存地址。我没有必要在这篇文章中输入很多内容,因为你可以在这里阅读它
现在string
不是非托管内存,所以如果你一开始不分配它,那么你将得到"、"B"、"B">
int main(){
string s;
cout << s << endl;
cngLetter(s);
cout << s << endl;
}
void cngLetter(string s){
s = "B";
cout << s << endl;
}
基本上,没有给定初始值的字符串只是一个空字符串。
在此上下文中,"&"运算符是"*"的语法糖果。在 evalPalindrome 方法中,当 reversePhrase 作为指针传入时,它总是被取消引用。这使得不取消引用指针的常见错误变得不可能。你是对的,它可能会使代码变得混乱,因为传入的值可以像作为指针传入时一样进行修改,除了调用函数没有指示它作为指针传入,除非您专门查看方法签名。
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 通过字符串来计算长度需要更长的时间,而不是移动字符串几次?
- 如何计算特定字母在字符串中出现的次数?(C++)
- 计算在同一位置至少包含一个常用字符的不同字符串对
- 给定一个单词数组和一个字符串,如何计算给定字符串中的所有单词
- 使用标准库计算字符串中的十进制数
- 如何计算字符串中用户输入元素的出现次数?
- 如何在 C++ 中计算字符串的算术运算
- 计算字符串中子字符串的出现次数
- 用于计算字符串中元音的函数
- 当 NUL 字符被定义为字符串的一部分时,为什么 strlen() 不计算终止 NUL 字符的字节?
- 计算表达式字符串由 std::map 中的键组成
- 如何计算字符串 c++ 中的"xxx"数?
- 通过将文本文件读取为字符串/向量来计算加权/未加权 GPA
- 如何更有效地计算n个字符串之间的不匹配分数?
- 将字符串计算为 C++ 中的表达式
- 在C++中从字符串计算算术表达式
- 在字符串计算后添加空字符
- C++使用C字符串计算文件中的字符、单词、句子
- 不使用字符串计算数字中的数字