返回对象

关于返回对象

Posted on 2009-05-16 01:31 无意乂 阅读(162) 评论(0) 编辑 收藏

函数返回对象有两种常见的方式

1.重载拷贝构造函数和赋值函数
  见下面的fun1
2.重载赋值函数,然后用"return <构造函数>"的格式
  见下面的fun2

测试代码.对类C重载了赋值运算,构造,析构,拷贝构造.然后写了两个函数来测试返回值

class  C
{
public :
    
int  i;
    C 
& operator   =  (C  & o)     // 赋值
    {
        i 
=  o.i;
        cout
<< " C &operator = (C &o)  " << i << endl;
        
return   * this ;
    };
    C(
int  p)         // 构造
    {
        i 
=  p;
        cout
<< " C()  " << i << endl;
    };
    
~ C()             // 析构
    {
        cout
<< " ~C()  " << i << endl;
    };
    C(C 
& o)         // 拷贝构造
    {
        i 
=  o.i * 10 ;
        cout
<< " C(C &o)  " << i << endl;
    };
};

C fun1()
{
    
return  C( 1 );
}

C fun2()
{
    C o(
2 );
    
return  o;
}

void  main()
{
    C o(
3 );
    cout
<< " ---fun1--- " << endl;
    o 
=  fun1();
    cout
<< " ---fun2--- " << endl;
    o 
=  fun2();
    cout
<< " ---main---/no.i =  " << o.i << endl;
    system(
" PAUSE " );
}


运行结果

C()  3
---fun1---
C() 
1
C &operator 
=  (C &o)  1
~C() 
1
---fun2---
C() 
2
C(C &o) 
20
~C() 
2
C &operator 
=  (C &o)  20
~C() 
20
---main---
o.i 
=   20
请按任意键继续. . .

 可见.fun1内共生成了一个临时对象.函数调用顺序是

return用的临时对象的构造->赋值运算传值->临时对象的析构

fun2内共生成了两个临时对象.效率较低,但便于修改.函数调用顺序是

fun2内局部对象的构造->return用的临时变量的拷贝构造->局部对象的析构->赋值运算传值->临时对象的析构

 

fun2的效率较低,但便于修改;fun1又要有构造函数的支持才行

 

如果返回引用的话,就没有这么多临时变量了.但是返回值为某一类型的引用一般是为了实现链式表达.而且有下面几点要注意:
1.不能返回局部变量的引用.因为在外面的对象接到这个引用之前就已经被析构掉了.它只能接到一个空对象
2.不要返回函数内部new分配的内存的引用.因为delete的安排会变得麻烦,而且很容易造成内存泄漏或访问到已经delete的对象
3.可以返回类成员的引用,但最好是const
4.不要返回静态变量的引用.比如,operator+返回了静态变量的引用.((a+b) == (c+d))会永远为true而导致错误
详细的可以参考这里.好像是Effective C++里面的内容吧

 

其实我就经常不返回对象而是返回new得到的对象的指针.管理起来相当麻烦...也许这是一种坏习惯吧,改改好了
又被蚊子咬了..郁闷.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值