| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 540 人关注过本帖
标题:谁来帮我看看啊 急。。
只看楼主 加入收藏
a86819318
Rank: 2
等 级:论坛游民
帖 子:63
专家分:10
注 册:2009-10-8
结帖率:40%
收藏
 问题点数:0 回复次数:2 
谁来帮我看看啊 急。。
#include<iostream.h>
class point
{
private:
 int x,y;
public:
 point(int a=0,int b=0)
 {
 x=a;
 y=b;
 }
 point (point &p);
 int getx()
 {
 return x;
 }
 int gety()
 {
 return y;
 }
};
point ::point(point &p)

 {
 x=p.x+10;
 y=p.y+20;
 cout<<"调用拷贝构造函数"<<endl;
 }
void f(point p)
{
cout<<p.getx()<<"   "<<p.gety()<<endl;
}
point g()
{
point q(3,5);
return q;


}
void main()
{
point p1(2,4);
point p2(p1);
cout<<p2.getx()<<"  "<<p2.gety()<<endl;
f(p2);                                     //这里不太懂   
cout<<p2.getx()<<"  "<<p2.gety()<<endl;    //调用完之后X Y为何没变      参数为对象 自动调用拷贝构造函数的。。
p2=g();
cout<<p2.getx()<<"  "<<p2.gety()<<endl;


}
搜索更多相关主题的帖子: void private include public 
2010-03-06 21:16
shonjan
Rank: 1
等 级:新手上路
帖 子:12
专家分:7
注 册:2009-12-28
收藏
得分:0 
回复 楼主 a86819318
void main()
{
point p1(2,4);

point p2(p1);            //此处调用,出现"调用拷贝构造函数",应该可以看懂

cout<<p2.getx()<<"  "<<p2.gety()<<endl;

f(p2);        //此处只是你没有弄清楚函数的调用而已,这里p2是作为一个实参传递给f的形参,当然就又调用了拷贝构造函数,将实参的值传给形参

cout<<p2.getx()<<"  "<<p2.gety()<<endl;  //在实参向形参传递的时候,只是对象与对象之间的值传递,即相当于将p2对象复制给f函数,自己是不会变的

p2=g();       //此处是将g函数返回的对象赋值给p2对象,当然就又用到调用拷贝构造函数,g返回对象值的x和y进行相应的改变

cout<<p2.getx()<<"  "<<p2.gety()<<endl;

}
2010-03-08 23:51
quietstar
Rank: 2
来 自:虚无缥缈处
等 级:论坛游民
帖 子:28
专家分:98
注 册:2009-4-13
收藏
得分:0 
2楼正解!
当函数以传值方式调用的时候,系统会在内存中自动建立传入参数的拷贝,在函数内部对传入参数的修改操作,实际上对它的拷贝的操作,当然也就不影响传入参数的值。你的代码中,p2对象作为参数带入f函数,系统建立一个point类的临时对象作为p2的拷贝,假设是temp_p2,在这里就会调用拷贝构造函数,调用的结果就是temp_p2::x=22,temp_p2::y=44,拷贝构造函数里面有一个输出语句,因此我们可以看到这个结果。但是p2本身并没有被修改,因此cout<<p2.getx()<<"  "<<p2.gety()<<endl这条语句输出的就是12 24。
另外,拷贝构造函数的写法建议是这样的:point ::point(const point &p)。因为我们无法对传入对象做修改,所以定义为常量,提高性能。

流光穆然去,美梦随佳人。薄雾似成雨,芳樽清茶冷。郁郁清风外,悠然不复生。
2010-03-10 12:55
快速回复:谁来帮我看看啊 急。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024860 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved