引用与局部变量的返回问题
今天刚相对彻底的搞懂函数返回局部普通变量(不包括指针和引用)与局部指针、引用的返回区别,先看下面代码
#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,相反它会被函数释放掉,(这个过程可以联想到我们按地址传值和引用传参的过程,函数内部可以直接进行对原数据的更改)如果还使用它的返回值,会发生意想不到的结果。