免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1390 | 回复: 4
打印 上一主题 下一主题

[函数] 求教:关于对象作函数参数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-30 10:41 |只看该作者 |倒序浏览
以类对象作为变量传给函数,默认情况下按值传递。如类未自定义拷贝构造函数的情况下,就采用默认的按位复制),在调用函数结束释放对象备份时,调用了析构函数。小弟按书上的code测试了一下:
#include <iostream.h>
class point{
        int x,y;
public:
        point(int a,int b){
                x=a;y=b;
                cout<<"create point("<<x<<","<<y<<")"<<endl;
        }
        int rx(){return x;}
        int ry(){return y;}
        ~point(){
                cout<<"delete instance"<<endl;
        }
};

point add(point m){
        cout<<"use add"<<m.rx()<<","<<m.ry()<<endl;
        int x=m.rx()+20;
        int y=m.ry()+20;
        point r(x,y);
        return r;
}
void main(){
        point N(10,12),L(0,0);
        L=add(N);
        cout<<"L:"<<L.rx()<<","<<L.ry()<<endl;
        cout<<"N:"<<N.rx()<<","<<N.ry()<<endl;

}

运行结果,显示确实调用了析构函数,但为啥调用了三次,而不是一次(仅析构作为参数的那个对象)?当不重载析构函数的时候,也可以正确显示N的x,y值,那问大侠给解释一下。多谢。

论坛徽章:
0
2 [报告]
发表于 2006-05-30 10:43 |只看该作者
把结果粘上来给大家看一下,编译环境:vc++6.0

论坛徽章:
0
3 [报告]
发表于 2006-05-30 10:46 |只看该作者
刚才因图片较大,未成功,再贴一次

result.GIF (7.98 KB, 下载次数: 18)

结果

结果

论坛徽章:
0
4 [报告]
发表于 2006-05-30 10:56 |只看该作者
m一个,r一个,然后add返回赋值前生成一个临时对象(有的编译器可以作优化,而不会产生这个临时对象)

[ 本帖最后由 tyc611 于 2006-5-30 10:59 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2006-05-30 13:19 |只看该作者
多谢,明白了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP