JS技术

实战c++中的string系列--函数返回局部变量string(引用局部string,局部string的.c_str()

字号+ 作者:H5之家 来源:H5之家 2015-12-14 17:03 我要评论( )

转载自:http://www.ti6.net/wangzhanjishu/2406.html在使用vim编辑器的时候,有时候编辑一个文件,而文件内容比较多,如果需要快速清空整个文件,可以使用一下

当函数返回字符串的时候,我们可以定义返回string和string&。

1写一个返回string引用的函数

std::string & TestStringReference() { std::string loal_str = "holy shit"; return loal_str; }

这个函数当然是错误的,编译器会提示我们:
返回局部变量或临时变量的地址: loal_str
即不能返回局部变量的引用。

2写一个返回string的函数(函数返回局部变量string的时候能不能被引用?)

std::string TestStringReference() { std::string strTest = "This is a test."; return strTest; }

那么对于上述函数的返回值可以被引用吗?
代码说话:

::string TestStringReference() { std::string strTest = "This is a test."; return strTest; } int main() { std::string& strRefer = TestStringReference(); std::cout << "strRefer:" << strRefer << std::endl; return 0; }

代码 完美运行。
实际上返回的不是局部变量,而是编译器新构造的临时对象。

3返回string的函数直接调用.c_str()
上面说了,返回的“局部”string可以被引用的,那么返回的“局部”string直接调用.c_str()会有什么效果恩?

::string TestStringC_STR() { std::string strTest = "This is a test."; return strTest; } int main() { const char *pc = TestStringC_STR().c_str(); std::cout << pc << std::endl; return 0; }

上面代码编译器不会报错!
但是等等,别高兴太早,看看输出结果,为空,不是我们期望的。

关键是,我们没有将TestStringC_STR()的结果赋给一个string对象就直接获取其指针了,这时,系统并不会为string调用拷贝构造函数或是赋值函数,返回的string仍然只是一个临时对象的状态,它会在完成对pc的赋值后被销毁,这时其内部的数据也不会存在了。

解决方法:先用一个string接收函数的返回值,然后再调用c_str()方法:

::string TestStringC_STR() { std::string strTest = "This is a test."; return strTest; } int main() { std::string str1 = TestStringC_STR(); const char *pc = str1.c_str(); std::cout << pc << std::endl; return 0; }

  • 上一篇实战c++中的string系列--string的连接(+= or append or push_back)
  • 顶 2 踩 0

    我的同类文章

    猜你在找

    查看评论

    * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

    个人资料


    wangshubo1989

  • 访问:94587次
  • 积分:3088
  • 等级:

    积分:3088

  • 排名:第6434名
  • 文章搜索

    博客专栏

    一起学libcef

    文章:5篇

    阅读:3840

    那些年躲过的坑儿

    文章:33篇

    阅读:31585

    浅析C++11新特性

    文章:19篇

    阅读:10806

    C++你所不知道的事儿

    文章:4篇

    阅读:3574

    文章分类

  • WPF(20)
  • MFC(17)
  • C++(122)
  • C#(36)
  • DuiLib(4)
  • windows编程(11)
  • 非技术(8)
  • libcef(5)
  • 文章存档

    阅读排行

  • 没有躲过的坑--正则表达式截取字符串(10890)
  • 为何我工作十年,内心仍无比恐慌(腾讯产品总监曹菲)(2177)
  • 浅析C++中的初始化列表(区别赋值和初始化)(1500)
  • 你所不知道的事儿--C++中delete指针后最好赋值为NULL(1328)
  • C++11新特性之 std::array container(1321)
  • 没有躲过的坑--指针(内存泄露)(1228)
  • 没有躲过的坑--std::string初始化、最快速判断字符串为空(1225)
  • C\C++编译器的未来.我们还需要C++么?(1146)
  • MVVM设计模式基础知识--NotificationObject类(Prism框架)(1110)
  • 没有躲过的坑--头文件相互包含(Compiler error C2653: not a class or namespace name)(1109)
  •  

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 老生常谈,JavaScript闭包中的this对象

      老生常谈,JavaScript闭包中的this对象

      2016-02-26 10:21

    • JS框架中的变动和变动检测

      JS框架中的变动和变动检测

      2016-01-26 19:24

    • 图像处理中的数学原理详解19——函数的极限 - 白马负金羁的专栏 - 博客频道 - CSDN.NET 白马负金羁的专栏

      图像处理中的数学原理详解19——函数的极限 - 白马负金羁的专栏 - 博

      2015-12-14 19:00

    • 【UWP通用应用开发】编辑文本、绘制图形、3D透视效果及绘制时钟实战 - nomasp - 博客频道 - CSDN.NE

      【UWP通用应用开发】编辑文本、绘制图形、3D透视效果及绘制时钟实战

      2015-12-14 18:20

    网友点评
    t