引用与局部变量的返回问题

今天刚相对彻底的搞懂函数返回局部普通变量(不包括指针和引用)与局部指针、引用的返回区别,先看下面代码

#include <IOSTREAM>
#include <STRING>
using namespace std;

string version1(const string &s1,const string &s2);
const string & version2(string &s1,const string &s2);
const string &version3(string &s1,const string &s2);

int main()
{
    string input;
    string copy;
    string result;

    cout<<"Entry a string: ";
    getline(cin,input);
    copy = input;
    cout<<"Your string as entered: "<<input << endl;
    result = version1(input,"****");
    cout<<"your string enhanced: "<<result <<endl;
    cout<<"your original string: " <<input << endl;
    
    result = version2(input,"#####");
    cout<<"your string enhanced: "<<result <<endl;
    cout<<"your original string: " <<input << endl;

    cout << "Resetting original string \n";
    input = copy;
    result = version3(input,"@@@");
    cout<<"your string enhanced: "<<result <<endl;
    cout<<"your original string: " <<input << endl;
    

    return 0;
}

string version1(const string &s1,const string &s2)
{
    string temp;
    temp = s2+s1+s2;
    return temp;
}

const string & version2(string &s1,const string &s2)
{
    s1 = s2+s1+s2;
    return s1;
}

const string &version3(string &s1,const string &s2)
{
    string temp;
    temp = s2+s1+s2;
    return temp;    
}

当函数执行version1时能够很顺利的通过,当执行version3时会导致程序崩溃。
当函数的返回类型是普通变量时,return时会把值cp一个临时变量,就像函数按值传参,如果函数返回的是一个引用或指针类型时,它不会发生按值传递那样的cp,相反它会被函数释放掉,(这个过程可以联想到我们按地址传值和引用传参的过程,函数内部可以直接进行对原数据的更改)如果还使用它的返回值,会发生意想不到的结果。

原文地址:https://www.cnblogs.com/onlycxue/p/2800060.html