手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C 类对象的拷贝构造函数

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
对于普通类型的对象来说,他们之间的复制是很简单的,例如:
int a=100;



int b=a;



而类对象和普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。
#include <iostream>



using namespace std;



class CA



{



public:



	CA(int b)



	{



		a=b;



	}



	void Show ()



	{



		cout<<a<<endl;



	}



private:



	int a;



};







int main()



{



	CA A(100);



	CA B=A;



	B.Show ();



	return 0;



}



   运行程式,屏幕输出100。 从以上代码的运行结果能够看出,系统为对象B分配了内存并完成了和对象A的复制过程。 就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。下面我们举例说明拷贝构造函数的工作过程。
#include <iostream>



using namespace std;



class CA



{



public:



	CA(int b)



	{



		a=b;



	}



	CA(const CA& C)



	{



		a=C.a;



	}



	void Show()



	{



		cout<<a<<endl;



	}



private:



	int a;



};







int main()



{



	CA A(100);



	CA B=A;



	B.Show ();



	return 0;



}



  CA(const CA& C)就是我们自定义的拷贝构造函数。可见,拷贝构造函数是一种特别的构造函数,函数的名称必须和类名称一致,他的唯一的一个参数是本类型的一个引用变量,该参数是const类型,不可变的。例如:类X的拷贝构造函数的形式为X(X& x)。
当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:
  • 一个对象以值传递的方式传入函数体
  • 一个对象以值传递的方式从函数返回
  • 一个对象需要通过另外一个对象进行初始化。

  假如在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。位拷贝又称浅拷贝,后面将进行说明。
  自定义拷贝构造函数是一种良好的编程风格,他能够阻止编译器形成默认的拷贝构造函数,提高源码效率。
浅拷贝和深拷贝
  在某些状况下,类内成员变量需要动态开辟堆内存,假如实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,假如B中有一个成员变量指针已申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。
  深拷贝和浅拷贝能够简单理解为:假如一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。下面举个深拷贝的例子。

#include <iostream>



using namespace std;



class CA



{



public:



	CA(int b,char* cstr)



	{



		a=b;



		str=new char[b];



		strcpy(str,cstr);



	}



	CA(const CA& C)



	{



		a=C.a;



		str=new char[a]; //深拷贝



		if(str!=0)



			strcpy(str,C.str);



	}



	void Show()



	{



		cout<<str<<endl;



	}



	~CA()



	{



		delete str;



	}



private:



	int a;



	char *str;



};







int main()



{



	CA A(10,"Hello!");



	CA B=A;



	B.Show();



	return 0;



}



好吧,就说这些,希望本文能对您有所帮助。




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS