Time t1;
t1.show_time();
return 0;
}
问学生,这程序的输出结果是什么?演示程序,程序给出的结果是事先不可预知的,是随机值,a的输出是随机值,因为没有初始化,而时间类的数据成员的输出也是随机值,说明没有初始化,对象的数据成员如何初始化?和学生互动,对学生进行启发,能否在定义数据成员进行初始化,即能否在定义数据成员的同时赋值?
修改上面的代码
int hour=0,minute=0,sec=0;
编译时会出现6个错误。那如何初始化,就引入构造函数概念。把数据成员都初始化为固定的值,例如上面的Time类的hour、minute和sec都初始化为0。在Time类中“private:”前面补充如下代码:
Time()
{
hour=0;minute=0;sec=0;
}
这个程序为“程序二”。
主函数中的a初始化为0,则程序的执行结果如下:
图1.程序二的运行结果
通过无参构造函数,引入构造函数的概念,构造函数是特殊的成员函数,它的名字与类名相同,没有返回值类型,在建立对象时自动执行。
1.2有参构造函数的引入
类名后面跟着对象名,定义对象时调用无参构造函数,通过无参构造函数定义对象时,对象数据成员的初始化是固定,如果想定义2个不同的对象,对象的数据成员的初始化的值不同,如何处理?这样引入有参构造函数。对于上面的Time类需要对三个数据成员初始化,需要一个三参构造函数,在Time类中“private:”前面补充如下代码:
Time(int h,int m,int s)
{
hour=h;minute=m;sec=s;
}
主函数修改如下,为程序三:
int main()
{
Time t1(1,2,3);
t1.show_time();
return 0;
}
运行程序,执行结果如下:
图2.“程序三”的运行结果
对于上面的时间类的三参构造函数的使用,是在定义对象的时候提供三个参数,对象名的后面用括号括起的三个参数,为什么这样写?Time t1(1,2,3)可以写成
Time t1=Time(1,2,3)
这样可以理解为,定义对象也像普通的double型数的初始化一样进行赋值,这里的赋值是调用三参构造函数进行赋值,“Time t1(1,2,3)”这样写是省略了“=Time”。
2 动态对象数组
对象的动态数组,利用对象指针来实现,给学生演示下面的例子“程序四”,代码如下:
#include
#include
using namespace std;
class Box
{
public:
Box(int h,int w,int len)
{
height=h; width=w; length=len;
}
void output()
{ cout<<"V="<int volume()
{ return(height*width*length); }
private:
int height,width,length;
};
int main()
{
int n; cout<<"长方体的个数:";
cin>>n; Box *pt;
pt=new Box[n];
for(int i=0;icout<delete[]pt;
return 0;
}
“程序四”编译后,会出现如下错误:
error C2512: 'Box' : no appropriate default constructor available
这个错误的原因是类Box没有无参构造函数。解决办法一是增加无参构造函数,办法二是修改开辟动态数组的方法,对“pt=new Box[n]”进行修改,得到“程序五”,修改如下:
pt=(Box*)operator new(sizeof(Box)*n);
用operator new开辟动态数组,对象数组的每个元素的数据成员都是随机值。
图3“程序五”的运行结果
3 利用构造函数修改对象的数据成员
“程序五”给出的结果是随机值,这是因为数组的每个元素的数据成员都是随机值,可以利用构造函数对动态数组中元素中数据成员进行设置。
修改“程序五”中的主函数,得到“程序六”,“程序六”与“程序五”的区别只是主函数不同,“程序六”主函数如下。
int main()
{
int n,i;
cout<<"长方体的个数:";
cin>>n; Box *pt;
pt=(Box*)operator new(sizeof(Box)*n);
for(i=0;i{
int a,b,c;
cout<<"输入长宽高(整数)";
cin>>a>>b>>c;
new(pt+i)Box(a,b,c);
}
for(i=0;icout<delete[]pt;
return 0;
}
图4.“程序六”的运行结果
从“程序六”的代码可以看出,可以利用构造函数修改数据成员。
4 利用构造函数修改常数据成员
给学生演示下面的例子“程序七”,代码如下:
#include
using namespace std;
class Time
{
public:
void show_time()
{ cout<Time(int h,int m,int s):hour(h)
{ minute=m;sec=s;}
private:
const int hour;
int minute,sec;
};
int main()
{
Time t(1,2,3);
return 0;
}
对于常数据成员必须且只能在构造函数的参数初始化表里面进行初始化。只是修改“程序七”的主函数得到“程序八”,“程序八”的主函数如下:
int main()
{
Time t(1,2,3);
t.show_time(); new(&t)Time(0,0,0);
t.show_time();
return 0;
}
图5.“程序八”的运行结果
从“程序八”的运行结果可以看出,Time对象的常数据成员发生变化,hour为常数据成员,从1变为0.
结 论
设计了《C++程序设计》课程中构造函数部分采用启发式教学方案,文章通过实际的例子引入构造函数,逐步引出在没有默认构造函数时,开辟动态对象数组的方法,补充课本中没有的构造函数可以用来修改数据成员的内容,用构造函数可以修改常数据成员。
[1]梁伍七.C++构造函数构造类成员的方法剖析[J].安徽广播电视大学学报,2002,(01):86-88.
[2]程有娥.C++构造函数构造类成员的方法剖析[J].华北工学院学报(社科版),2003,(03):91-92.
[3]宋初一,格日乐图,姜静清,等.C++构造函数的剖析[J].内蒙古民族大学学报(自然科学版),2003,(06):502-503.
[4]庄银霞.关于C++构造函数中的不合理设计的研究[J].信息技术与信息化,2015,(10):139-141.
[5]张勇.C++中构造函数与析构函数的使用[J].宿州教育学院学报,2004,(03):107-108+133.
[6]张永,叶水生,张小锋.C++中构造函数的深入分析[J].计算机与现代化,2005,(02):14-15+21.
[7]王帅,马梦娜.关于C++构造函数的几点探究[J].电脑编程技巧与维护,2013,(10):6-7+19.
(责任编校:何俊华)
2016-01-08
湖南省教育厅资助科研项目(12A054)
史小飞(1970-),女,吉林梨树人,助理馆员,研究方向为图书馆学、情报学、计算机程序设计。
G642.0
A
1673-2219(2016)05-0105-03