C++ 将对象传递给函数和函数返回对象时潜在的问题

尽管将对象作为参数传递给函数时使用了值调用的参数传递机制,在理论上,这样可以保护并隔离调用函数的实际参数,但是仍然会存在严重的问题,甚至会破坏实际参数。如果在实际对象中分配了动态内存,并且在销毁该对象时释放内存。那么函数中这个实际对象的副本调用析购函数时,也将释放同样的内存。应这就是一个严重的问题。

当函数返回对象时,函数中创建了一个临时对象来保存要返回的值,而函数所返回的对象实际就是这个临时对象。在对象的值被返回后,临时对象将被销毁。在某些情况下这将带来不可预料的后果。如果,函数返回的临时对象中的动态分配内存被释放。那么即使接收返回对象依然要使用这块内存,内存仍然被释放。

解决这两个问题的办法就是使用 “复制构造函数”

 

Class myclass {
int*p;
public:
myclass(
int i); //普通构造函数
myclass(const myclass &ob);
~myclass ();
int getval() {return *p}
}
;

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


void display(myclass obj)
{
cout
<<obj.getval()<<' ';
}

main()
{
myclass a(
10);
display(a);
return 0;
}


 

java 和c#这样的语言没有复制构造函数,应为这些语言使用的是按位复制的方法,这是因为java和c#的对象都是动态分配的,而你只能通过引用操作这些对象。因此作为参数传递给函数或者从函数中返回对象时就不会创建对象副本。

由于只能通过引用,所以java 和c#中就不能够确定一个对象何时被销毁,而在c++中对象总是在超出作用域后就销毁。


 

 

posted on 2004-09-02 22:34  chobits  阅读(1349)  评论(0编辑  收藏  举报

导航