- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深入分析C中构造函数
深入分析C中构造函数
[摘 要]深入分析了复制构造函数和转换构造函数的作用和实现方法,并指出了程序设计中出现的问题和解决方法。
[关键词]复制构造函数 转换构造函数 资源
[中图分类号]G64 [文献标识码]A [文章编号]1009-5489(2009)04-0018-03
C++程序设计语言既可进行过程化程序设计,也可进行面向对象程序设计。C++实现了类的封装、数据隐藏、继承及多态,使得其代码容易维护及高度可重用。在类定义时,如果用户没有显示定义构造函数,则系统会提供一个默认的构造函数,仅负责创建对象,而不做任何初始化工作;用户可以显示定义构造函数,用来初始化数据成员和资源,包括定义不带参数的和带参数的构造函数,还可以定义转换构造函数和复制构造函数;转换构造函数能够实现将平台提供的基本数据类型变量赋给类型对象,而复制构造函数解决了类对象之间的拷贝和资源冲突的问题。
一、默认构造函数与用户定义的构造函数
C++规定每个类必须有一个构造函数,没有构造函数,就不能创建任何对象,若用户未提供一个类的构造函数(一个都未提供),则C++提供一个默认仅负责创建对象,而不做任何初始化工作;若用户对(一个类定义了一个构造函数不一定是无参构造函数),C++就不再提供默认的构造函数,也就是说,如果为类定义了一个带参数的构造函数,还想要无参构造函数,则必须自己定义。在用默认构造函数创建对象时,如果创建的是全局对象或静态对象,则对象的位模式全为0,否则,对象值是随机的。
例如,下面的代码试图定义一个带参数的构造函数,若要创建无参对象,将不能正确地编译:
#include<string.h>
class Test
{public:
Test(char*pName){strcpy(name,pName);}
protected:char name20;
};
void main()
另外一个值得注意的是,如果用户要定义构造函数时,必须在public区定义,类定义时不能对其数据成员初始化,且结尾处一定要有一个分号。为了解决上面这个问题,我们可以重载构造函数,再定义一个不带参数的构造函数,问题就解决了。如:Test(){strcpy(name,″zhangsan″);}
二、复制构造函数与转换构造函数
可用一个对象去构造另一个对象,或者说,用另一个对象值初始化一个新构造的对象;函数的参数是对象时,都会涉及复制构造函数。复制构造函数的形参是本类的引用。而转换构造函数一般定义为含一个参数的构造函数(或相当于一个参数的构造函数),它可以实现将基本数据类型转化为类类型,在这两类构造函数使用过程中,经常涉及到临时对象和无名对象。当函数返回一个对象时,要创建一个临时对象以存放返回的对象,而无名对象一般是调用转化构造函数产生的。看下面的程序代码:
//hello.h
#include″iostream.h″
class stu
{public:
stu(){cout<<″Hello″<<endl;}?
stu(int m){kk=m;cout<<″structure″<<kk<<endl;}
//定义转化构造函数
stu(stu s){kk=s.kk+4;cout<<″copy″<<kk<<
endl;}//定义复制构造函数
protected:
int kk;
};
事例一、#include″hello.h″
stu tt()
{stu ms=4;cout<<″clever″<<endl;return ms;}
void main()
{stu d=7;d=tt();}
运行结果:
structure7
structure4
clever
copy8
destroy4
destroy8
destroy8
由于函数stu tt()的返回类型是对象,所以要调用一次复制构造函数来实现将ms赋给tt函数的临时对象,所以有第四行的输出(构造一个临时对象)和第六行的输出(析构临时对象),tt函数中的局部对象ms通过复制构造函数赋给临时对象后才析构自己,然后临时对象把自己再赋给对象d后,再析构自己,所以对象d中的数据成员kk得到临时对象的数据成员kk的值8,即析构时d的数据成员kk是8(最后一行输出),过程如图1所示。
事例二、#include″hello.h″
stu tt()
{stu ms=4;cout<<″clever″<<endl;return
文档评论(0)