关于 return String(s1 + s2) 有点小疑惑,求指教

MeBoss 2010-11-30 10:06:14
如果函数返回值是一个对象,要考虑 return 语句的效率。例如
return String(s1 + s2);
这是临时对象的语法,表示“创建一个临时对象并返回它” 。不要以为它与“先创建
一个局部对象 temp 并返回它的结果”是等价的,如
String temp(s1 + s2);
return temp;
实质不然,上述代码将发生三件事。首先,temp 对象被创建,同时完成初始化;然
后拷贝构造函数把 temp 拷贝到保存返回值的外部存储单元中;最后,temp 在函数结束
时被销毁(调用析构函数) 。然而“创建一个临时对象并返回它”的过程是不同的,编译
器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的化费,提高了
效率。
类似地,我们不要将
return int(x + y); // 创建一个临时变量并返回它
写成
int temp = x + y;
return temp;
由于内部数据类型如 int,float,double 的变量不存在构造函数与析构函数, 虽然该 “临
时变量的语法”不会提高多少效率,但是程序更加简洁易读。


//return String(s1 + s2) (而“创建一个临时对象并返回它”的过程是不同的,编译
器直接把临时对象创建并初始化在外部存储单元中) 既然都存储到了外部空间去,那么该函数应该是被销毁的啊,销毁了为什么还能够取到s1,s2的值呢 (对于return String(s1 + s2)!=(int temp = x + y; return temp;)确实很疑惑)


...全文
564 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
we_sky2008 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 we_sky2008 的回复:]
“//return String(s1 + s2) (而“创建一个临时对象并返回它”的过程是不同的,编译
器直接把临时对象创建并初始化在外部存储单元中) 既然都存储到了外部空间去,那么该函数应该是被销毁的啊,销毁了为什么还能够取到s1,s2的值呢 ”


C/C++ code

//楼主需要知道的是返回值返回的过程,
//对于return String(s1 + s2);这句
//……
[/Quote]
result就是编译器存储返回值的地方
we_sky2008 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 we_sky2008 的回复:]
“//return String(s1 + s2) (而“创建一个临时对象并返回它”的过程是不同的,编译
器直接把临时对象创建并初始化在外部存储单元中) 既然都存储到了外部空间去,那么该函数应该是被销毁的啊,销毁了为什么还能够取到s1,s2的值呢 ”


C/C++ code

//楼主需要知道的是返回值返回的过程,
//对于return String(s1 + s2);这句
//……
[/Quote]
楼主可以看下<<Inside the C++ object model>>
里面有你想要知道的
we_sky2008 2010-11-30
  • 打赏
  • 举报
回复
“//return String(s1 + s2) (而“创建一个临时对象并返回它”的过程是不同的,编译
器直接把临时对象创建并初始化在外部存储单元中) 既然都存储到了外部空间去,那么该函数应该是被销毁的啊,销毁了为什么还能够取到s1,s2的值呢 ”


//楼主需要知道的是返回值返回的过程,
//对于return String(s1 + s2);这句
//首先s1 + s2被计算,然后用此结果为参数调用String的拷贝构造函数将返回值初始化,
//然后才从这个函数return;

//假设这个函数为:
String func( )
{
//假设s1,s1已经在某个地方被定义了
return String(s1 + s2);
}
//会被编译器修改为:
void func(String &result)//这里result是未被初始化的
{
result.String::String(s1 + s2);//这里就是将返回值初始化
return;
}

//同理,而对于这个函数,若具名返回值优化没有打开:
String func( )
{
String temp(s1 + s2);
return temp;
}
//会被编译器修改为:
void func(String &result)
{
String temp(s1 + s2);
result.String::String(tmp);
temp.String::~String();
return;
}

MeBoss 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icechenbing 的回复:]
帮顶!!!!!
[/Quote]

嘿嘿 谢谢了
MeBoss 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zm19870528 的回复:]
在成功返回内置类型对象之后才会释放函数的局部变量,string和int一样,是一种类型而已,有它的对象和值,所以上面return s1+s2是合法的!
楼主想知道的应该是指不能返回局部指针吧?如下面的函数就是非法的!

C/C++ code

char * test(char *des)
{
char *p;
p=des;
return p;//error,返回局部指针

……
[/Quote]

返回 局部的指针 那肯定是非法的 呵呵 谢谢大家了,早上有事,马上结贴
screwzm 2010-11-30
  • 打赏
  • 举报
回复
在成功返回内置类型对象之后才会释放函数的局部变量,string和int一样,是一种类型而已,有它的对象和值,所以上面return s1+s2是合法的!
楼主想知道的应该是指不能返回局部指针吧?如下面的函数就是非法的!

char * test(char *des)
{
char *p;
p=des;
return p;//error,返回局部指针

指针和其他类型的有差别的!

70,012

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧