构造函数能够初始化对象,而缺省构造函数(指没有参数的构造函数)则可以不利用任何在建立对象时的外部数据就能初始化对象。这带来正反两面的效果:正面效果是:一些行为特性与数字相仿的对象被初始化为空值或不确定值是合理的,还有例如链表、哈希表、图等数据结构也可以被初始化为空容器;反面效果是:对很多对象来说,不利用外部数据进行完全的初始化是不合理的,比如一个输入姓名的通讯录对象是没有意义的。
理想情况下,无需任何数据就可以建立对象的类可以包含缺省构造函数,而需要初始数据来建立对象的类则不能包含缺省构造函数。但实际上必须考虑更多因素。
当一个类没有缺省构造函数时,使用上会存在一些限制:
考虑下面的类:
class ASCEMessage{
public:
ASCEMessage(int id);
...
};
由于ASCEMessage没有缺省构造函数,可能遇到以下问题:
1)建立数组时,一般来说,没有一种方法能在建立对象数组时给构造函数传递参数。也就是说此时不能建立ASCEMessage对象数组:
ASCEMessage asceMessages[20]; //栈上建立,错误,没有正确调用,ASCEMessage没有默认构造函数
ASCEMessage *pasceMessages = new ASCEMessage[20]; //堆上建立,错误,同上
对于栈数组,一种解决方法是在数组定义时提供必要的参数:
int id1, id2, ..., id20; //存储短信id的变量
...
ASCEMessage asceMessages[] = { //正确,提供了构造函数的参数
ASCEMessage(id1),
ASCEMessage(id2),
ASCEMessage(id3),
...,
ASCEMessage(id20)
};
遗憾的是,这种方法不能用在堆数组的定义上。
一种更通用的解决方法是利用指针数组来代替一个对象数组:
typedef ASCEMessage* PAM; //PAM指针指向一个ASCEMessage对象
PAM messages[20]; //正确,没有调用构造函数
PAM *messages = new PEM[20]; //也正确
//在指针数组里的每一个指针重新赋值,以指向一个不同的ASCEMessage对象
for(int i=0; i<20; i++)
{
messages[i] = new ASCEMessage(idx);
}
当然,该方法存在两个缺点:一是必须删除数组里每个指针所指向的对象;二是增加了内存分配量。
2)无法在许多基于模板的容器类里使用,因为实例化一个模板时,模板的类型参数应该提供一个缺省构造函数,这个要求来自模板内部,被建立的模板参数类型数组里。如下面的数组模板类:
template<class T>
class Array
{
public:
Array(int size);
...
private:
T *data;
};
template<class T>
Array<T>::Array(int size)
{
data = new T[size]; //为每个数组元素依次调用T::T()
...
}
3)设计虚基类时:一:如果不提供缺省构造函数,则很难使用它。因为几乎所有的派生类在实例化时都必须给虚基类构造函数提供参数。这就要求所有由没有缺省构造函数的虚基类继承下来的派生类都必须知道并理解提供给虚基类构造函数的参数的含义。二:提供缺省构造函数,但优化如下:
class ASCEMessage
{
public:
ASCEMessage(int ID = UNSPECIFIED);
...
private:
static const int UNSPECIFIED; //其值代表ID值不确定
};
但这样有引入一个问题,由于不能确定ID是否有意义,在用到ID的成员函数中都必须检测ID的有效性,这大大减低了代码的效率。
分享到:
相关推荐
本次课的主题是“承担角色责任”,选自教材第二章“认清自身角色”的第二部分“管理角色”。 ##### 2. **核心内容** - 将“责任”内容分为四类:必须做的事情、努力做的事情、应该做的事情、选择做的事情。 - 每种...
做好规划认清自我让自己不再是SEO“流浪者”-文档资料.pdf做好规划认清自我让自己不再是SEO“流浪者”-文档资料.pdf做好规划认清自我让自己不再是SEO“流浪者”-文档资料.pdf做好规划认清自我让自己不再是SEO“流浪...
做好规划认清自我让自己不再是SEO“流浪者”-文档资料.ppt做好规划认清自我让自己不再是SEO“流浪者”-文档资料.ppt做好规划认清自我让自己不再是SEO“流浪者”-文档资料.ppt做好规划认清自我让自己不再是SEO“流浪...
教育精品资料
上海市中考政治 认清基本国情复习教案-人教版初中九年级全册政治教案.doc
中考政治 九年级 第二单元 第三课 认清基本国情复习教案-人教版初中九年级全册政治教案.doc
建筑钢结构工程技术-认清分包、转包、内包、挂靠.docx
【知识点解析】 1. **诚信与信任的关系**:诚信是建立信任的基础,只有诚实的人才能得到他人的信任。在《诚信是金》的故事中,农民因为诚实得到了信用社的信任,从而获得更多的贷款。这说明诚实的行为能够赢得他人...
九年级思想品德教案-第三课《认清基本国情》
### 51CTO开发月刊011期知识点概览 ...以上内容概述了51CTO开发月刊011期中涉及的主要知识点,涵盖了编程语言排行、LOGO语言介绍、计算机科学基础知识、Java语言相关话题、Web设计与开发以及移动应用开发等多个方面。
认清自己.exe
认清基本国情.ppt
【知识点详解】 1. 教育工作者的历史使命与责任担当: 教育工作者在中华民族伟大复兴的进程中扮演着至关重要的角色。他们不仅是基础工程的建设者,还是民族振兴的推动者。教师,尤其是校长,必须深刻理解和践行十...
### 重要知识点解析 #### 一、认识航空业的基本架构及特点 - **竞争者概况**:中国的航空市场竞争激烈,主要包括四大航空公司(国航、南航、东航、海航集团)以及其他小型航空公司如春秋航空等。...
作为这个优秀团体的一员,我深感荣幸能够在这里发表讲话,与大家共同探讨一个主题——“认清现实,提高自我”。 同学们,当我们跨入大学校门的那一刻,我们就开始了人生的新篇章。无论是满怀激动、顺利考入理想的...
九年级政治全册 第三课 认清基本国情导学与测评 新人教版-新人教版初中九年级全册政治学案.doc
秋九年级政治全册第二单元了解祖国爱我中华第三课认清基本国情教案3新人教版-新人教版初中九
认清形势明确职责.ppt
【海底捞收缩门店策略分析】 海底捞,作为中国知名的火锅连锁餐厅,在港股市场具有较高的知名度。近期,该公司宣布将在2021年底前关闭约300家表现不佳的门店,占其门店总数的18.8%,这一举措是海底捞应对新冠疫情及...
这三招教你认清企业内部数字化!.docx这三招教你认清企业内部数字化!.docx这三招教你认清企业内部数字化!.docx这三招教你认清企业内部数字化!.docx这三招教你认清企业内部数字化!.docx这三招教你认清企业内部数字化!....