| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 975 人关注过本帖
标题:一个传递对象的疑惑
只看楼主 加入收藏
yanglinayp
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-21
收藏
 问题点数:0 回复次数:11 
一个传递对象的疑惑
下面这个程序是对象传递,它存在着潜在的问题应该在参数里使用引用,我不太清楚ob被销毁时,调用析构函数清除它所指向的内存,那它怎么还会被对象a使用???使用引用的话,就不必清除ob了吗??
#include<iostream>
#include<cstdlib>
using namespace std;
class myclass{
int *p;
public:
myclass(int i);
~myclass();
int getval(){
return *p;};
myclass::myclass(int i){
cout<<"allocating";
p=new int;
*p=i;}
myclass::~myclass(){
cout<<"freeing";
delete p;
}
void display(myclass ob)
{cout<<ob.getval()<<'\n';
}
int main(){
myclass a(10);
display(a);
return 0;
}
搜索更多相关主题的帖子: myclass int 内存 对象 cout 
2006-05-20 22:54
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
你应该知道,当自定义的类型做为参数按值传递给函数时,就一定会调用拷贝构造函数这件事情吧?
如果你已经知道了,那好:
拷贝构造函数的效果我举个例子:
class A{int x;char *p;} class B{int y;char *fp;}
这里A就相当于是实参,B就相当于是形参;
那么系统默认拷贝函数(因为你没有自己显示的定义一个拷贝构造函数)开始执行;
B.y=A.x; B.fp=A.p;
注意第2个语句;2个指针指向一个地址!
所以当形参(局部变量)结束生命周期时,会释放内存.那作为实际参数的A的对象指针将迷路(迷途指针,随意指向一个内存);
当A的对象结束生命周期,这个对象的析构函数被调用,释放那个指针指向的未知的地方(非常危险).
引用传递:
相当于直接把A作为形式参数;这样就不用调用拷贝构造函数了.

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-20 23:12
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 

如果不用引用
ob只是一个临时的对象
它与a没有任何关系
只是他们的值相等
display(a);
这里只用到它的值
如果用引用
那么ob与 a 直接相关(是一个东西)
delete其中一个的话,就是全部


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-05-20 23:14
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 

对不起
楼主
没看见你的new
这样的话,和wfpb一样
做一个拷贝吧,你用new了

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-05-20 23:18
yanglinayp
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-21
收藏
得分:0 

那是不是对象作为参数在不使用动态存储时最好是使用引用呢?对象作为参数传递的时候只能调用复制构造函数吗?
如果局部对象使用动态内存的话在对象,可不可以这样理解:
(1)如果对象传递对象的话会存在潜在问题
(2)如果引用传递的话局部对象,撤销时会造成实参内存丢失
(3)复制构造函数使局部变量和 实参不使用一个内存,失去局部变量也不会影响实参。

[此贴子已经被作者于2006-5-21 21:23:06编辑过]


我是小小登山者!
2006-05-21 21:13
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
[CODE]#include<iostream>
#include<cstdlib>
using namespace std;

class myclass
{
int * p; //由于需要动态开辟空间,一定要小心,
// 你为此需要 copy constructor 和 assignment operator
public:
myclass(int i);
myclass(const myclass & object);
myclass & operator=(const myclass & object);
~myclass();
int getval()
{
return *p;
}
};

myclass::myclass(int i)
{
cout<<"allocating";
p=new int;
*p=i;
}

myclass::myclass(const myclass & object)
{
p = new int;
*p = *(object.p);
}

myclass & myclass::operator =(const myclass & object)
{
if(this == &object)
return *this;
delete p;
p = new int;
*p = *(object.p);
return *this;
}
myclass::~myclass()
{
cout<<"freeing";
if(p)
delete p;
}

void display(myclass ob) // 如果你会单步调试的话,你再试试 (myclass & ob)
{
cout<<ob.getval()<<'\n';
}

int main()
{
myclass a(10);
display(a);

system("pause");
return 0;
}

[/CODE]

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-05-21 22:43
yanglinayp
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-21
收藏
得分:0 
myclass & myclass::operator =(const myclass & object)
{
if(this == &object)
return *this;
delete p;
p = new int;
*p = *(object.p);
return *this;
}
请问一下,为什么要重新给p分配空间?为什么要调用运算符的重载呢?我现在有些搞不清楚在程序里什么时候应该有运算符的重载出现??辛苦了!!谢谢

[此贴子已经被作者于2006-5-21 23:27:32编辑过]


我是小小登山者!
2006-05-21 23:27
chenchao
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2006-5-20
收藏
得分:0 
kai:
在你的version中,是不是用引用传递效率更高一些,这样就无需作出实参的一个副本了。
2006-05-22 21:09
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
chenchao,
是的。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-05-23 01:28
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
以下是引用chenchao在2006-5-22 21:09:00的发言:
kai:
在你的version中,是不是用引用传递效率更高一些,这样就无需作出实参的一个副本了。

但别滥用,有修改原数据的危险,有时局部变量也很好


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-05-23 21:08
快速回复:一个传递对象的疑惑
数据加载中...
 
   



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

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