【C++】引用变量--5.将引用用于类对象(核心+难点)

举报
王博Kings 发表于 2020/12/29 22:56:53 2020/12/29
【摘要】 目录 1. 基本概念 2.程序示例 2.1运行结果 3. 程序中3个函数的解读 3.1 string version1(const string & s1, const string & s2) 3.2 const string & version2(string & s1, const string & s2) 3.3 const string & versi...

目录

1. 基本概念

2.程序示例

2.1运行结果

3. 程序中3个函数的解读

3.1 string version1(const string & s1, const string & s2)

3.2 const string & version2(string & s1, const string & s2)

3.3 const string & version3(string & s1, const string & s2)

4. 警醒


 1. 基本概念

将类对象传递给函数时,C++通常的做法是使用引用。例如,使用引用,让函数将类string、ostring、istream、ofstream和ifstream等类的对象作为参数。

2.程序示例


  
  1. // 本程序用来对比不同引用设计效果,可能有部分函数无法编译
  2. #include<iostream>
  3. #include<string>
  4. using namespace std;
  5. string version1(const string & s1, const string & s2);
  6. const string & version2(string & s1, const string & s2);//有副作用
  7. const string & version3(string & s1, const string & s2);//bad
  8. int main()
  9. {
  10. string input;
  11. string copy;
  12. string result;
  13. cout << "输入一个string:";
  14. getline(cin, input);//输入存入到Input中;
  15. copy = input;
  16. cout << "你输入的string是: " << input << endl;
  17. result = version1(input, "***");
  18. cout << "version1升级后的string: " << result << endl;
  19. cout << "你一开始的input string 现在是: " << input << endl<<endl;
  20. cout << "你输入的string是: " << input << endl;
  21. result = version2(input, "###");
  22. cout << "version2升级后的string: " << result << endl;
  23. cout << "你一开始的input string 现在是: " << input << endl << endl;
  24. cout << "重新设定string.\n";
  25. input = copy;
  26. cout << "你输入的string是: " << input << endl;
  27. result = version3(input, "@@@");
  28. cout << "version3升级后的string: " << result << endl;
  29. cout << "你一开始的input string 现在是: " << input << endl << endl;
  30. return 0;
  31. }
  32. string version1(const string & s1, const string & s2)
  33. {
  34. string temp;
  35. temp = s2 + s1 + s2;
  36. return temp;
  37. }
  38. const string & version2(string & s1, const string & s2)
  39. {
  40. s1 = s2 + s1 + s2;
  41. return s1;
  42. }
  43. const string & version3(string & s1, const string & s2)
  44. {
  45. string temp;
  46. temp = s2 + s1 + s2;
  47. return temp;
  48. }

2.1运行结果

3. 程序中3个函数的解读

3.1 string version1(const string & s1, const string & s2)


  
  1. string version1(const string & s1, const string & s2)
  2. {
  3. string temp;
  4. temp = s2 + s1 + s2;
  5. return temp;
  6. }

这个引用效果和下面这个效果一样


  
  1. string version4(string s1, string s2)
  2. {
  3. string temp;
  4. temp = s2 + s1 + s2;
  5. return temp;
  6. }

但是,引用了效率更高

注意,函数返回类型是string 

3.2 const string & version2(string & s1, const string & s2)


  
  1. const string & version2(string & s1, const string & s2)
  2. {
  3. s1 = s2 + s1 + s2;
  4. return s1;
  5. }

这个会有副作用

3.3 const string & version3(string & s1, const string & s2)

注意,函数返回类型是string &  ,是引用 


  
  1. const string & version3(string & s1, const string & s2)
  2. {
  3. string temp;
  4. temp = s2 + s1 + s2;
  5. return temp;
  6. }

4. 警醒

3.1 和3.3 ,最大的区别在于返回的是引用还是普通的,普通的返回临时变量是存储在一个空间中,返回引用的,不能使用临时变量,因为程序已经释放内存了。

函数返回值有几种类型,这个返回的是string,虽然你看的是返回一个临时变量,其实返回的是这个临时变量的拷贝;如果返回值类型是string&,也就是string的引用,那么就不能返回临时变量了

本节内容总结于8.2.5节

文章来源: kings.blog.csdn.net,作者:人工智能博士,版权归原作者所有,如需转载,请联系作者。

原文链接:kings.blog.csdn.net/article/details/90743465

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。