此方法是否评估空字符串?
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
(代码未显示,但它是从另一个函数修改的)。
这样写代码好像很难读。
您创建的不是指针,而是字符串类型的对象。它从未被分配,所以它应该只是一个空白字符串“”。获取它的地址将正常工作,因为它是一个有效的对象。
虽然我不确定该功能如何工作。
string& reversePhrase
没有声明 evalPalindrome
来获取字符串的地址。它声明了对字符串进行 reference 的函数。 (用 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;
}
请注意,只有一个字符被添加到其中,&
导致通过引用传递,即不是副本,而是内存地址。不需要我在这个 post 中打很多字,因为你可以阅读它 here
现在 string
s 不是非托管内存,所以如果你一开始不分配它,那么你会得到 "", "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 作为指针传入,但它始终被解除引用。这使得不取消引用指针的常见错误变得不可能。你是对的,它可以使代码混乱,因为传入的值可以被修改,类似于它作为指针传入,除了调用函数没有指示它作为指针传入除非您专门查看方法签名。
In java this would create a null pointer exception.
那是因为 Java 是一种具有不同对象创建语法的不同语言。
在 C++ 中,只要您编写 string reversePhrase
,该对象就已完全成型并准备就绪。
But I analyzed the method that is being called and it looks like it is accepts the address of a 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
(代码未显示,但它是从另一个函数修改的)。
这样写代码好像很难读。
您创建的不是指针,而是字符串类型的对象。它从未被分配,所以它应该只是一个空白字符串“”。获取它的地址将正常工作,因为它是一个有效的对象。
虽然我不确定该功能如何工作。
string& reversePhrase
没有声明 evalPalindrome
来获取字符串的地址。它声明了对字符串进行 reference 的函数。 (用 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;
}
请注意,只有一个字符被添加到其中,&
导致通过引用传递,即不是副本,而是内存地址。不需要我在这个 post 中打很多字,因为你可以阅读它 here
现在 string
s 不是非托管内存,所以如果你一开始不分配它,那么你会得到 "", "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 作为指针传入,但它始终被解除引用。这使得不取消引用指针的常见错误变得不可能。你是对的,它可以使代码混乱,因为传入的值可以被修改,类似于它作为指针传入,除了调用函数没有指示它作为指针传入除非您专门查看方法签名。
In java this would create a null pointer exception.
那是因为 Java 是一种具有不同对象创建语法的不同语言。
在 C++ 中,只要您编写 string reversePhrase
,该对象就已完全成型并准备就绪。
But I analyzed the method that is being called and it looks like it is accepts the address of a string.
不,它接受对字符串的引用!这就是 为什么 调用作用域稍后可以看到修改后的字符串!