设为首页 加入收藏

TOP

13.1.4 构造函数
2013-10-07 01:13:51 来源: 作者: 【 】 浏览:78
Tags:13.1.4 构造 函数

13.1.4  构造函数

构造函数就是构造类的实例时,系统自动调用的成员函数。当一个对象被创建时,它是否能够被正确地初始化,在C++(www.cppentry.com)中是通过构造函数来解决问题的。每当对象被声明或者在堆栈中被分配时,构造函数即被调用。构造函数是一种特殊的类成员,其函数名和类名相同,声明格式如下:

  1. <函数名>(<参数列表>); 

【示例13-6】 演示构造函数的使用方法。

  1. class student  
  2. {  
  3. private:  
  4.     int id;                         //学号  
  5.     float chinese,english,math;     //语文、英语、数学三门课程成绩  
  6. public:  
  7.     //构造函数  
  8.     student();  
  9.     //构造函数,设置学号,姓名,三门课程成绩  
  10.     student(int m_id,float m_chinese,float m_english,float m_math);  
  11.     void show();  
  12. }  
  13. //无参数构造函数的定义,初始化各属性  
  14. student::student()  
  15. {  
  16.     id=0;  
  17.     chinese=english=math=0;  
  18. }  
  19. //有参数构造函数的定义,初始化各属性  
  20. student(int m_id,char * m_name,float m_chinese,float m_english,float m_math)  
  21. {  
  22.     id=m_id;  
  23.     chinese=m_chinese;  
  24.     english=m_english;  
  25.     math=m_math;  
  26. }  
  27. student::show()  
  28. {  
  29.     cout<<id<<endl;  
  30.     cout<<chinese<<endl;  
  31.     cout<<english<<endl;  
  32.     cout<<math<<endl;  

分析:该示例定义了两个构造函数,第一个构造函数不带参数,所有属性都被初始化为0。第二个构造函数带参数,用传入的参数来初始化类的属性。构造函数的个数没有限制,可以根据需要定义多个,每个都针对不同的初始化情况。

在定义和使用构造函数时要注意以下几个问题:

构造函数的名字必须与类名相同,否则编译程序将把它作为一般的成员函数来处理;

构造函数没有返回值,在声明和定义构造函数时是不能说明它的类型的;

构造函数的功能是对对象进行初始化,因此在构造函数中只能对属性做初始化,这些属性一般为私有成员;

构造函数不能像其他方法一样被显式地调用。

下面通过示例13-6中的类student,来说明构造函数使用上应该注意的几个问题。

1.构造函数的调用

【示例13-7】 演示类student的构造函数调用的方法。

  1. int main()  
  2. {  
  3.     student s1;                     //定义类的实例,不显式初始化  
  4.     student s2(1,60,70,80);         //定义类的实例,显式初始化  
  5.     //s2.student(1,60,70,80);       //不能显式调用构造函数  
  6.     s1.show();  
  7.     s2.show();  
  8.     return 0;  

程序运行结果如下:

  1. 0  
  2. 0  
  3. 0  
  4. 0  
  5. 1  
  6. 60  
  7. 70  
  8. 80 

分析:从输出结果看,在main函数中,构造函数没有被显式调用,而在初始化对象时自动调用。其中,s1调用的构造函数是不带参数的student(),s2调用的则是带参数的构造函数。代码中注释掉的语句是错误的,构造函数不能被显式调用。

2.拷贝构造函数

拷贝构造函数是一种特殊的构造函数,即复制另一个对象的构造函数。一般在下述3种情况下会用到拷贝构造函数:

用一个类对象显式初始化另一个类对象;

把类对象作为实参传递给函数;

将类对象作为函数的返回值时。

在这些情况下,系统就会自动调用拷贝构造函数,将参数代表的对象中的属性逐个拷贝到新创建的对象中。拷贝构造函数有两种形式:系统默认形式和自定义形式。

【示例13-8】 演示系统默认形式的使用方法。

  1. int main()  
  2. {  
  3.     student s1(1,80,90,85); //显式初始化  
  4.     s1.show();  
  5.     student s2(s1);         //拷贝构造  
  6.     s2.show();  
  7.     return 0;  

程序运行结果如下:

  1. 1  
  2. 80  
  3. 90  
  4. 85  
  5. 1  
  6. 80  
  7. 90  
  8. 85 

分析:对象s1在定义时,调用了带参数的构造函数。在定义对象s2时,采用了student s2(s1)的形式,此时调用的是系统默认的拷贝构造函数。拷贝构造函数将s1对象的属性都复制给了s2对象相应的属性中。因此,s2对象的属性值与s1对象的属性值相同。

自定义形式的构造函数的声明方式如下:

  1. <类名>::<函数名>(<类名>&<参数名>)  
  2. {  
  3. //函数体  

【示例13-9】 给示例13-6增加一个具有自定义拷贝构造功能的构造函数,演示自定义形式的使用方法。

  1. //自定义拷贝构造函数在类体内的声明方式  
  2. //student(const student &s);  
  3. //它的定义如下所示  
  4. inline student::student(const student &s)  
  5. {  
  6.     id=s.id;  
  7.     name=s.name;  
  8.     chinese=s.chinese;  
  9.     english=s.english;  
  10.     math=s.math;  
  11. }  
  12. void main()  
  13. {  
  14.     student s1(1,80,90,85);     //显式初始化  
  15.     s1.show();  
  16.     student s2(s1);             //调用拷贝构造函数  
  17.     s2.show();  

程序运行结果如下:

  1. 1  
  2. 80  
  3. 90  
  4. 85  
  5. 1  
  6. 80  
  7. 90  
  8. 85 

分析:当定义s2时,采用student s2(s1)的形式,调用了用户自定义的拷贝构造函数。实际上,拷贝构造函数就是用类作为构造函数的参数。

提示:如果类不定义构造函数,则编译器生成默认构造函数。这种构造函数不进行任何初始化,因此生成对象时,不能保证处于一致状态。

【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇13.1.6 静态成员 下一篇13.1.7 友元

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: