C++学习-构造函数(3)

来源:互联网 发布:python 闭包 编辑:程序博客网 时间:2024/06/07 23:49
来源:http://blog.csdn.net/gzshun

C++规定:构造函数必须与相应的类同名,它可以带参数,也可以不带参数,与一般的成员函数定义相同,而且可以重载,构造函数的重载跟普通的成员函数的重载是一样的。

一.构造函数的重载

[cpp] view plaincopy
  1. /*构造函数的重载*/  
  2. #include <iostream>  
  3.   
  4. using namespace std;  
  5.   
  6. class CDate  
  7. {  
  8. public:  
  9.     CDate();  
  10.     CDate(int day);  
  11.     CDate(int month, int day);  
  12.     CDate(int year, int month, int day);  
  13.     ~CDate();  
  14.     void printInfo() const;  
  15. private:  
  16.     int mYear;  
  17.     int mMonth;  
  18.     int mDay;  
  19. };  
  20.   
  21. CDate::CDate()  
  22. {  
  23.     cout << "调用构造函数1" << endl;  
  24.     mYear = 2012;  
  25.     mMonth = 2;  
  26.     mDay = 10;  
  27. }  
  28.   
  29. CDate::CDate(int day)  
  30. {  
  31.     cout << "调用构造函数2" << endl;  
  32.     mYear = 2012;  
  33.     mMonth = 2;  
  34.     mDay = day;  
  35. }  
  36.   
  37. CDate::CDate(int month, int day)  
  38. {  
  39.     cout << "调用构造函数3" << endl;  
  40.     mYear = 2012;  
  41.     mMonth = month;  
  42.     mDay = day;  
  43. }  
  44.   
  45. CDate::CDate(int year, int month, int day)  
  46. {  
  47.     cout << "调用构造函数4" << endl;  
  48.     mYear = year;  
  49.     mMonth = month;  
  50.     mDay = day;  
  51. }  
  52.   
  53. CDate::~CDate()  
  54. {  
  55.     cout << "调用默认析构函数" << endl;  
  56. }  
  57.   
  58. void CDate::printInfo() const  
  59. {  
  60.     cout << "Date: "  
  61.          << mYear << "年"  
  62.          << mMonth << "月"  
  63.          << mDay << "日"  
  64.          << endl << endl;  
  65. }  
  66.   
  67. int main()  
  68. {  
  69.     CDate day1;  
  70.     day1.printInfo();  
  71.   
  72.     CDate day2(12);  
  73.     day2.printInfo();  
  74.   
  75.     CDate day3(2, 14);  
  76.     day3.printInfo();  
  77.   
  78.     CDate day4(2012, 2, 20);  
  79.     day4.printInfo();  
  80.   
  81.     return 0;  
  82. }  

执行结果:

[plain] view plaincopy
  1. 调用构造函数1  
  2. Date: 2012年2月10日  
  3.   
  4. 调用构造函数2  
  5. Date: 2012年2月12日  
  6.   
  7. 调用构造函数3  
  8. Date: 2012年2月14日  
  9.   
  10. 调用构造函数4  
  11. Date: 2012年2月20日  
  12.   
  13. 调用默认析构函数  
  14. 调用默认析构函数  
  15. 调用默认析构函数  
  16. 调用默认析构函数  

上面的例子使用了:void printInfo() const;
const在这里的作用是,保证在printInfo函数体中,不更改变量的值,若不小心设置了某变量的值,编译器会在编译的第一时间提醒用户程序出错,提高了开发效率。


二.带默认参数的构造函数

构造函数与成员函数,都可以设置形参的默认参数。如果构造函数或成员函数在类中的声明初始化了默认参数,那么在类外定义的时候,形参不能写出默认值,具体看以下例子。

[cpp] view plaincopy
  1. /*带默认参数的构造函数*/  
  2. #include <iostream>  
  3.   
  4. using namespace std;  
  5.   
  6. class CDate  
  7. {  
  8. public:  
  9.     CDate(int year, int month = 2, int day = 8);  
  10.     ~CDate();  
  11.     void printInfo() const;  
  12. private:  
  13.     int mYear;  
  14.     int mMonth;  
  15.     int mDay;  
  16. };  
  17.   
  18. CDate::CDate(int year, int month, int day)  
  19. {  
  20.     cout << "调用构造函数" << endl;  
  21.     mYear = year;  
  22.     mMonth = month;  
  23.     mDay = day;  
  24. }  
  25.   
  26. CDate::~CDate()  
  27. {  
  28.     cout << "调用默认析构函数" << endl;  
  29. }  
  30.   
  31. void CDate::printInfo() const  
  32. {  
  33.     cout << "Date: "  
  34.          << mYear << "年"  
  35.          << mMonth << "月"  
  36.          << mDay << "日"  
  37.          << endl << endl;  
  38. }  
  39.   
  40. int main()  
  41. {  
  42.     CDate day1(2012);  
  43.     day1.printInfo();  
  44.   
  45.     CDate day2(2012, 3, 15);  
  46.     day2.printInfo();  
  47.   
  48.     return 0;  
  49. }  

执行结果:

[plain] view plaincopy
  1. 调用构造函数  
  2. Date: 2012年2月8日  
  3.   
  4. 调用构造函数  
  5. Date: 2012年3月15日  
  6.   
  7. 调用默认析构函数  
  8. 调用默认析构函数  


(1).上面的例子是用了:CDate(int year, int month = 2, int day = 8);
被设置默认参数的形参都是靠后面的参数,那如果是:CDate(int year=2012, int month = 2, int day);这样可以吗?
经过编译器验证,这样声明是错误的。在声明一个对象时,一般都会省略后面的参数,而不会省略靠前面的参数,不然就乱套了。所以从这里可以得出一个概念:在构造函数或成员函数中,被设置默认参数的形参,后面绝对不允许出现没有设置默认参数的形参。
以CDate(int year, int month = 2, int day = 8)为例,设置默认参数有以下几种情况:
1.全部给形参设置默认参数
CDate(int year=2012, int month = 2, int day = 8);   正确


2.给一部分形参设置默认参数
CDate(int year, int month = 2, int day = 8);   正确
CDate(int year, int month, int day = 8);   正确
有且只有这3种情况出现,比如以下声明均是错误的:
CDate(int year, int month = 2, int day);   错误
CDate(int year=2012, int month = 2, int day);   错误


(2).带默认参数的函数的定义
1.构造函数的声明与定义分开,在类中声明:
CDate(int year, int month = 2, int day = 8);
在类外定义:

[cpp] view plaincopy
  1. CDate::CDate(int year, int month, int day)  
  2. {  
  3.     cout << "调用构造函数" << endl;  
  4.     mYear = year;  
  5.     mMonth = month;  
  6.     mDay = day;  
  7. }  

在函数定义的时候,那些默认参数就不必写出来了。


2.在类中声明与定义
如果直接在类中声明并定义带默认参数的构造函数,直接定义:

[cpp] view plaincopy
  1. CDate(int year, int month = 2, int day = 8)  
  2. {  
  3.     cout << "调用构造函数" << endl;  
  4.     mYear = year;  
  5.     mMonth = month;  
  6.     mDay = day;