将类对象传递给函数时,c++通常用的是引用,可以通过引用让函数string,ostream,istream,ofstream和ifstream等类的对象作为参数.
下面我们看一个例子,基本思想是创建一个函数,将指定的字符串加入到另一个字符串的前面和后面,但是有一个缺陷,我们先来看代码.
#include<iostream>
#include<string>
using namespace std;
string version1(const string &s1,const string &s2);//从定义的形参上会发现,引用和const,这就说明是不可修改的值
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);//因为cin不能读取空格,所以用getline
copy = input;//进行赋值
cout<<"your string as entered: "<<input<<endl;//预计输出的就是我们输入的
result = version1(input,"***");//调用第一个函数,作用就是通过一个中间字符串进行两者的拼接但是又不改变原来的字符串这就是const作用
cout<<"your string enhanced: "<<result<<endl;//这就是已经拼接完成后的字符串
cout<<"yout orginal string: "<<input<<endl;//验证一下最初的字符串有没有改变
result = version2(input,"###");//调用函数2,作用是将传参的第一个字符串改变
cout<<"your string enhanced: "<<result<<endl;//输出已经改变的字符串
cout<<"your orginal string: "<<input<<endl;//input也改变了
cout<<"resetting orginal string.\n";//第14行起到了作用,将input变成我们最开始输入的那个字符串,但是程序到这就崩溃了
input=copy;
result = version3(input,"@@@");//函数三
cout<<"your string enhanced :"<<result<<endl;//作用是通过中间字符串进行拼接
cout<<"your orginal 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=s1+s1+s2;
return s1;
}
const string &version3(string &s1,const string &s2)
{
string temp;
temp=s2+s1+s2;
return temp;
}
我们输入就以bing ge is a handsome boy为例子
看一下输出:
对于函数1,可能会有个疑惑那就是,这个函数的两个形参都是const string &而***是char *类型 的,
在这里进行解释,首先,string类定义了一种char *类到string的转换功能.
现在我们开始分析为什么到了第三个函数程序会崩溃
相信第一个程序是很容易看懂的,代码注释也给了解释.
我们现在看函数2,函数2不能创建临时string对象而是直接修改原来的string对象,这个函数可以修改s1,但是不能修改s2,因为s2用了const修饰.
由于s1是一个指向main()中的一个对象input的引用,因此将s1作为引用返回是安全的.但是由于s1是指向input的引用,函数唯一的副作用就是会修改input的值.
现在可以看函数三的错误了,它竟然妄图返回一个已经删除内存的函数3中的临时变量的值,显然不可实现