免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: pcwkt
打印 上一主题 下一主题

c++的string可以return? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-01-02 15:20 |只看该作者
原帖由 pcwkt 于 2009-1-2 15:12 发表


第三个,我还以为是局部变量存贮常量指针,返回了变量的内容,即常量指针.所以才没有事呢?


String constants 在进程里都可以用,跟局部变量没关系。编译器早就为它们分配了地址。

论坛徽章:
0
12 [报告]
发表于 2009-01-02 15:34 |只看该作者
多谢各位指导?
以后偶尔g++的话,
可以放心return string类型了!

论坛徽章:
0
13 [报告]
发表于 2009-01-02 15:49 |只看该作者
原帖由 pcwkt 于 2009-1-2 14:51 发表
1 那个string不是局部变量吗?


返回的时候会进行拷贝构造

局部的char *不能直接返回,不然函数退出时局部变量已经不存在

不过由于char * = "Hello",中的"Hello"存储在text段中,是全局且只读的,所以函数退出时仍然可用,不过不推荐这样使用

论坛徽章:
0
14 [报告]
发表于 2009-01-02 18:33 |只看该作者
是的,可以返回string 。

可以说 , 确定了大小(size)的变量就可以返回;(应该说可以传递 , 传递值!)

所谓的变量除了C/C++基本的变量类型,如 1,2,3,int , char ...等等之外 , 还有指针变量,结构变量 , 自然也包括“特殊的结构的”类的变量 (类对象)。这些都是变量 , 只不过“头衔”不同罢了。他们的一个共同特点就是大小是确定 , 这一点和数组变量不一样 , 所以后者大小不定,也就没法传递。

所以:
--------------------------------------------------------------------
             int   i= 5 ; 可以将常数变量 5 传递给变量 i;
              return i  ;   传递i的值 ,不管 i 是局部变量与否 , 因为传递的是它的值。
----------------------------------------------------------------------------
              char *p = "abcd" ;  将字符常量“abcd"  这个“值”传给指针变量p , p 和 上面的i 同样都是变量。
              return p ;    没问题 , 同样不管p 是不是局部变量 , 因为 传递的也是变量的值。
-------------------------------------------------------------------------------
             struct MY_POINT {
                      int x ;
                       int y ;
            }  a , b ;

            a.x = 0x55 ;  a.y = 0xAA ;

            b = a ;         没问题 ,
            return   b ; 也没问题 , 同样不管b和 a是不是局部变量 , 因为 传递的也是变量的值 ,
-------------------------------------------------------------------------------
楼主说的 string 变量 , 也是变量 ,自然也可以返回。


认为1 和3有问题的 , 仅仅看看到一个表明现象 :他们是局部变量 。从抽象层次来讲 ,他们和 int i; return i;没有任何差别。
从汇编层次来看,你可以看到事情的真相:
                      struct MY_POINT  dot()
                      {
                            struct MY_POINT  a ;
                            a.x = 1 ;
                           a.y = 2 ;
                           return a ;
                     }

                     main() {
                           struct MY_POINT  b;
                           b = dot() ;
                     }

等同于:
                      void dot(struct MY_POINT   *a)
                      {
                            a->x = 1 ;
                           a->y = 2 ;
                          
                     }

                     main() {
                           struct MY_POINT  b;
                           dot(&b) ;
                     }


ps:   字符串常量和其他类型的常量,通常存在.rodata 段 , 不是.text 段。

[ 本帖最后由 老手 于 2009-1-2 18:35 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2009-01-02 18:50 |只看该作者
原帖由 老手 于 2009-1-2 18:33 发表

ps:   字符串常量和其他类型的常量,通常存在.rodata 段 , 不是.text 段。


这是编译器相关的。我记得有些编译器把 string constants 放在代码段,有些是数据段。

论坛徽章:
0
16 [报告]
发表于 2009-01-02 18:55 |只看该作者
原帖由 langue 于 2009-1-2 18:50 发表


这是编译器相关的。我记得有些编译器把 string constants 放在代码段,有些是数据段。


可以指定放到哪里。

论坛徽章:
0
17 [报告]
发表于 2009-01-03 09:58 |只看该作者
可以返回
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP