除非通过引用传递,否则字符串类型无法正常工作
string type doesn't work properly unless passed by reference
我在一个更大的项目中遇到了这个问题,所以我做了一个测试class希望我能找出并解决它:
class test_class{
public:
int length;
const char* cstr;
test_class(){cstr = nullptr; length = 0;}
void SetStr(string str){cstr = str.c_str(); length = str.length();}
};
所以当我使用 SetStr
成员函数时,cstr
中的第一个字符表现得像空终止符。下面的代码是一个例子:
string str5="abcdefg";
test_class test;
test.SetStr(str5);
cout<<test.cstr<<endl;
cout
不输出任何内容,但第一个字符之后的字符有效。因此,如果我用循环打印它们,我会得到除第一个字符之外的整个字符串。
但是如果我重写 SetStr
函数如下(添加 &
):
void SetStr(string& str){cstr = str.c_str(); length = str.length();}
它工作正常。
问题:
我不明白没有 &
的函数有什么问题,它是如何解决这个问题的?
区别在于哪个对象拥有cstr
指向的数据。
string str5="abcdefg";
test_class test;
test.SetStr(str5);
cout<<test.cstr<<endl;
当您通过引用传递时,SetStr
直接从 str5
检索指针 - str5
拥有数据,只要 str5
存在,指针就一直有效.
因为当你打印 test.cstr
时 str5
仍然存在,所以一切都很好。
按值传递时,数据归参数所有,是str5
的副本。
由于参数对象在函数returns时被销毁,之后指向其数据的指针无效,解引用它是未定义的。
我在一个更大的项目中遇到了这个问题,所以我做了一个测试class希望我能找出并解决它:
class test_class{
public:
int length;
const char* cstr;
test_class(){cstr = nullptr; length = 0;}
void SetStr(string str){cstr = str.c_str(); length = str.length();}
};
所以当我使用 SetStr
成员函数时,cstr
中的第一个字符表现得像空终止符。下面的代码是一个例子:
string str5="abcdefg";
test_class test;
test.SetStr(str5);
cout<<test.cstr<<endl;
cout
不输出任何内容,但第一个字符之后的字符有效。因此,如果我用循环打印它们,我会得到除第一个字符之外的整个字符串。
但是如果我重写 SetStr
函数如下(添加 &
):
void SetStr(string& str){cstr = str.c_str(); length = str.length();}
它工作正常。
问题:
我不明白没有 &
的函数有什么问题,它是如何解决这个问题的?
区别在于哪个对象拥有cstr
指向的数据。
string str5="abcdefg";
test_class test;
test.SetStr(str5);
cout<<test.cstr<<endl;
当您通过引用传递时,SetStr
直接从 str5
检索指针 - str5
拥有数据,只要 str5
存在,指针就一直有效.
因为当你打印 test.cstr
时 str5
仍然存在,所以一切都很好。
按值传递时,数据归参数所有,是str5
的副本。
由于参数对象在函数returns时被销毁,之后指向其数据的指针无效,解引用它是未定义的。