- 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课件第1章构造函数
第十四章 构造函数
面向对象语言的构造函数是很重要的,它涉及到对象的构造及效率,但构造函数又很复杂。在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)