- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十四章 构造函数 面向对象语言的构造函数是很重要的,它涉及到对象的构造及效率,但构造函数又很复杂。在JAVA语言和本门课前面的内容中,以及很多编程书中,为突出构造函数的基本概念和基本特性,有意的忽略了构造函数的复杂性。 现在,在类、继承、多态讲完后,作为单独的一章,集中讲一下C++的构造函数,为了有连续性,其中有一些内容与课件前面 “基于对象/面向对象” 相关章节(5,6,9,10章)的内容重复。课件前面有关构造函数讲的比较模糊的地方,与本章课件为准。 虽然讲的是C++的构造函数,但其中一部分内容对其它面向对象的语言(包括JAVA)也有参考价值。 本章内容包括: 单个类的构造函数; 继承方式下子类的构造函数; 一、单个类的构造函数; 1.一般特性 构造函数的作用是创建对象,进行对象的内存分配、初始化成员变量等工作。析构函数的作用与构造函数相反。 C++构造函数主要特点: 构造函数的名字与类名相同 构造函数也是成员函数,声明在类体内,实现在类体外或在类体内。 构造函数无需声明返回类型和返回值(有系统内部使用的隐含返回值)。 构造函数可以重载。 当类没有定义构造函数时,系统默认一个。 C++析构函数特点: 析构函数的名字是在类名前加~ 析构函数也是成员函数,声明在类体内,实现在类体外或在类体内。 析构函数无需声明返回类型和返回值,也无需形参。 析构函数不可以重载,一个类只能有一个析构函数。 当类没有定义析构函数时,系统默认一个。 2. 默认的构造函数 Q1:当类没有定义构造函数时,系统默认一个。 [注]本章所有程序均在VC8.0下调试 例1: #include stdafx.h #include iostream using namespace std; class A{ public: unsigned short int i; }; int _tmain(int argc, _TCHAR* argv[]) { A a1; couta1.i; } couta1.i输出了一个随意指定的整数,说明对象a1被默认的构造函数创建了,但这个程序在编译的时侯告警,运行时报错,按“确定”后才输出正确结果。为什么会这样?把程序改一下: 例2:以下程序在VC8.0下调试 #include stdafx.h #include iostream using namespace std; class A{ public: unsigned short int i; virtual int fun(){return 1}; //增加了一个虚函数 }; int _tmain(int argc, _TCHAR* argv[]) { //不能写成A(a1), //但可写成A* a1=new A()或A* a1=new A A a1; couta1.i; } 运行正常。 原来,很多C++书说错了,“当类没有定义构造函数时,系统默认一个”是有先决条件的: 如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,默认的构造函数:?1)如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;?2)如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);??3)在类中的所有非静态的对象数据成员,它们所属的类中有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数)。#include stdafx.h #include iostream using namespace std; class A {public: int i; virtual int fun(){return 1;}; A(){i=1;cout 构造函数1被执行;} A(int x){i=x;cout 构造函数2被执行;} }; int _tmain(int argc, _TCHAR* argv[]) { A a1; couta1.i; A a2; couta2.i; A a3(2); couta3.i; } 结论是对的,构造函数A()被执行了两次。 Q3:为什么用系统默认或无参构造函数实例化栈对象时,不能用A a1(),只能用A a的语法? 例4: #include stdafx.h #include iostream using namespace std; class A{ public: int i; virtual int fun(){return 1;}; A(){i=1;cout 构造函数1被执行;} A(int x){i=x;cout 构造函数2被执行;} }; int _tmain(int argc
文档评论(0)