C++中构造函数的使用.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

?

?

C++中构造函数的使用

?

?

论文导读:C++语言的一个重要机制是类的引入,它不仅丰富了C++的数据类型,而且增强了C++对现实世界的描述能力。在C++中,建立和初始化对象的过程由专门的成员函数来完成,这个函数很特殊,只要对象建立,它马上被调用,为对象分配空间和初始化,这个函数就是构造函数。类中数据成员可以分为两种:普通数据成员和对象成员,包含对象成员的类称为聚集类。由继承得到的类称为派生类,派生类中既包括从基类继承而来的成员(即基类子对象部分),又包括自身特有的成员(即新增成员部分)。

关键词:类,构造函数,聚集,派生

1.引言

C++语言的一个重要机制是类的引入,它不仅丰富了C++的数据类型,而且增强了C++对现实世界的描述能力。论文参考网。对象是类的一个实例,它描述的是现实世界中的实体,因此,一旦创建一个某类对象,就需要有一个有意义的初始值,表示该对象的初始状态。在C++中,建立和初始化对象的过程由专门的成员函数来完成,这个函数很特殊,只要对象建立,它马上被调用,为对象分配空间和初始化,这个函数就是构造函数。

2.普通构造函数

以类名作为函数名的函数称为类的构造函数(C++标准中认为构造函数是无名函数,原因是类型名不能作为函数名。为了便于理解和描述,将类名称为构造函数的函数名)。构造函数用于将其所属类的对象初始化到一个指定状态并且完成内存分配。其中,内存分配一般由编译器生成相关代码自动完成,而对象各个数据成员的初值状态则通过构造函数的函数体实现。

例1

#includeiostream.h

classA

{public:

A(intx):{a=x;coutAConstructingaendl;}//有参构造函数

private:

inta;

};

voidmain()

{Aa1(1);

A*p1=newA(2);

}

运行结果如下:

AConstructing1

AConstructing2

不能为构造函数指定任何返回类型,即使void也不行;由于构造函数是无名函数,即对于程序正文而言是不可见的,因此,在程序中不能直接调用构造函数,它是由编译器自动调用的。例1的主函数中,首先调用有参构造函数创建了A类对象a1,然后,以操作符new带普通参数向堆区动态申请的方式初始化A类指针p1时,编译器自动调用的也是该类的有参构造函数,所以有上述两行输出结果。

3.默认构造函数

如果在例1的主函数中增加语句:Aa2;,则程序编译时会出现一个语法错误,其原因是类A中只定义了一个有参构造函数,显然不能用它去构造无参对象a2,解决办法很简单,在类A的声明中增加一个无参构造函数如下:

A(){a=0;coutDefaultConstructingaendl;}//无参构造函数

此时,编译器会自动调用该无参构造函数去完成对象a2的初始化工作。类似地,若在主函数中增加语句:A*p2=newA;,则编译器也会自动调用该无参构造函数在堆区中创建一个无参匿名对象,然后用其地址去初始化A类指针p2。

由此可见,编译器自动调用构造函数的时机是在创建一个对象时:即以不带参数或带普通参数的方式执行一个对象定义语句或用操作符new动态创建对象时;构造函数可以带上形参,称为有参构造函数,并且可以带默认形参;也可以不带形参,称为无参构造函数,又叫默认构造函数或缺省构造函数,即构造函数可以重载。在创建对象时,编译器会根据所给实参的类型、个数与次序,选择恰当的构造函数完成对象的初始化工作;如果没有为一个类定义任何构造函数时,编译器会为该类自动生成一个隐含声明的默认构造函数,隐含声明的默认构造函数什么都不做。

4.转换构造函数

多态性是C++的三大基本特征(封装性,继承性,多态性)之一,C++的多态性包括强制多态、重载多态、包含多态和参数类型多态。将一种类型的值强制转换成为另一种类型的值称为类型强制,即强制多态。在基本数据类型之间可以通过显式的强制类型转换实现类型强制。论文参考网。如:对于intx;用x=(int)3.14;或x=int(3.14);或x=static_castint(3.14);都可以将浮点数3.14转换为整型数3。在使用类类型时也同样存在类似的类型强制,只不过这种类型强制既可以通过显式的方式来完成,也可以隐式地由构造函数来自动转换,甚至可以根据需要在类中定义类型强制转换成员函数来完成指定的类型强制。

例2

#includeiostream.h

classB{

public:

B(intx):b(x){coutbconstructoriscalled!;}

//构造函数用于类型强制

operatorint(){coutboperatorint()iscalled!;ret

您可能关注的文档

文档评论(0)

木槿流年 + 关注
实名认证
内容提供者

悟已往之不谏,知来者之可追

1亿VIP精品文档

相关文档