除非通过引用传递,否则字符串类型无法正常工作

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.cstrstr5 仍然存在,所以一切都很好。

按值传递时,数据归参数所有,是str5的副本。
由于参数对象在函数returns时被销毁,之后指向其数据的指针无效,解引用它是未定义的。