函数返回值类

qscool1987 2014-05-06 11:23:23
class A{};
1: A fun()
{
A ma;
//对ma做处理...
return ma;
}
2: A& fun()
{
A ma;
//对ma做处理...
return ma;
}

对于第一种情况,返回类型为值类型,语言是如何做到将一个局部对象的值返回给外部的对象?
实际上是函数1是这么实现的:
void fun(A &__result )
{
A ma;
ma.A::A();
//对ma做处理...
__result.A::A(ma);

return;
}
编译之后函数会转化为带一个参数的形式
如果这样调用函数:fun();
执行过程中会调用A::A()和A::A(const A&)
如果这样调用函数:A a = fun();
实际转化为fun(a);同样会调用A::A()和A::A(const A&)
如果涉及编译器层面的优化,会转为这样的形式
void fun(A &__result )
{
__result.A::A();
return;
}
直接用__result取代 ma,减少拷贝构造和析构的次数

对于返回值为引用类型的,该如何解释??
如下是我的推断,但是只限于 这样调用
fun();
函数2 返回值类型为引用,那么会转化为如下形式
void fun(A &__result )
{
__result.A::A();
//对__result做处理
return;
}
直接用__result取代 ma,不会调用拷贝构造函数A::A(const A&);
如果是这样调用:
A a = fun(); //调用2
上面的解释就行不通了,它可能转化为这样的形式:
void fun(A &__result )
{
A ma;
ma.A::A();
//对ma做处理...
__result.A::A(ma);

return;
}
对于调用2就可能转化为 fun(a);
对于返回为引用类型,可否有一种肯定的解释?
...全文
76 点赞 收藏 5
写回复
5 条回复
ri_aje 2014年05月07日
返回局部对象的引用是未定义行为。 第一种经内连展开可能 fun 和 ma 就都不存在了。
回复 点赞
qscool1987 2014年05月07日
引用 4 楼 unituniverse2 的回复:
[quote=引用 3 楼 qscool1987 的回复:] 这里不是讨论返回局部变量的引用,是讨论函数返回值类型和引用类型在语言层面的实现问题
你举的第二个例子是错误的,没有实际意义。。光说句“这里不是讨论返回局部变量的引用”不合适,因为如果代码本身因为有问题而导致结果跟着一起变化,这样就说不过去了。我知道你接着要说“这只是个例子,要只关注重点”之类的,但是用错误的例子容易引起误导不是吗?就像最近一段时间很多HR自已为是的拿类似“(i++)+(i++)的结果是多少”这样的问题当作面试题(你要是说结果未定义这题他们就算你错了) 回到你的问题上来,我觉得到不如把这个问题弄得更简单,“该怎样不该怎样”这种事可以扔到一边去:

class A
{
} test1;

A fun1() // 1.
{ 
   return test1;
}

A & fun2() // 2.
{ 
   return test1;
}

// 附加了另一些例子:
class B
{
    B(void) {};
    B(int) {};
    //B(const B &); //这函数默认就有了的
};

B fun3() // 3.
{ 
   return B(1);
}

B fun4() // 4.
{ 
   return 2;
}

B fun5() // 5.
{ 
   return {3};
}

其中3、4、5的,印象中看到过论坛里已经有讨论多次了。。。[/quote] 行,我换个例子从新开贴,以免误导别人
回复 点赞
unituniverse2 2014年05月07日
引用 3 楼 qscool1987 的回复:
这里不是讨论返回局部变量的引用,是讨论函数返回值类型和引用类型在语言层面的实现问题
你举的第二个例子是错误的,没有实际意义。。光说句“这里不是讨论返回局部变量的引用”不合适,因为如果代码本身因为有问题而导致结果跟着一起变化,这样就说不过去了。我知道你接着要说“这只是个例子,要只关注重点”之类的,但是用错误的例子容易引起误导不是吗?就像最近一段时间很多HR自已为是的拿类似“(i++)+(i++)的结果是多少”这样的问题当作面试题(你要是说结果未定义这题他们就算你错了) 回到你的问题上来,我觉得到不如把这个问题弄得更简单,“该怎样不该怎样”这种事可以扔到一边去:

class A
{
} test1;

A fun1() // 1.
{ 
   return test1;
}

A & fun2() // 2.
{ 
   return test1;
}

// 附加了另一些例子:
class B
{
    B(void) {};
    B(int) {};
    //B(const B &); //这函数默认就有了的
};

B fun3() // 3.
{ 
   return B(1);
}

B fun4() // 4.
{ 
   return 2;
}

B fun5() // 5.
{ 
   return {3};
}

其中3、4、5的,印象中看到过论坛里已经有讨论多次了。。。
回复 点赞
qscool1987 2014年05月07日
这里不是讨论返回局部变量的引用,是讨论函数返回值类型和引用类型在语言层面的实现问题
回复 点赞
kivien 2014年05月06日
我只知道返回值不能为引用
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告