引用(四)

///将引用用于类对象
/*将类对象传递给函数时,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.###

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值