c++将引用用于类对象

将类对象传递给函数时,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中的临时变量的值,显然不可实现 

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

forget hurt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值