///将引用用于类对象
/*将类对象传递给函数时,C++通常的做法是使用引用。
下面的例子使用了string类。它创建一个函数,将指定的字符串加入到另一个字符串的前面和后面。*/
#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 << "Enter 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)///has side effect
{
s1 = s2 + s1 + s2;
///safe to return reference passed to function
return s1;
}
const string & version3(string & s1,const string & s2)///bad design
{
string temp;
temp = s2 + s1 + s2;
///unsafe to return reference to local variable
return temp;
}
/*
Enter a string: It's not my fault.
Your string as entered: It's not my fault.
Your string enhanced: ***It's not my fault.***
Your original string: It's not my fault.
Your string enhanced: ###It's not my fault.###
Your original string: ###It's not my fault.###
Resetting original string.
然后程序就崩了
*/
temp是一个新的string对象,只在函数version1()中有效,该函数执行完毕后,它将不再存在。
因此,将返回指向temp的引用不可行,因此该函数返回类型为string.这意味着temp的内容将被复制到一
个临时返回存储单元中,然后在main()中,该返回存储单元的内容被复制到一个名为result的string中。
result = version1(input,"***");
*string类定义了一种char*到string的自动转换功能。
可以将实参char * 或 const char* 传递给形参const string &.
如果形参类型为const string &,在调用函数时,使用的实参可以是string对象或C风格字符串,如用引号
括起的字符串字面量,以空字符结尾的char数组或指向char的指针变量。
version2()中由于s1是指向main()中一个对象input的引用,因此将s1作为引用返回是安全的。
由于s1是指向input的引用,因此
result = version2(input,"###");
与
version2(input,"###");
result = input;
等价。
由于s1是指向input的引用,因此
调用该函数将带来修改input的副作用
Your original string: It's not my fault.
Your string enhanced: ###It's not my fault.###
Your original string: ###It's not my fault.###