类的默认构造函数

如果没有为一个类显式地定义任何构造函数,编译器将自动为这个类生成默认构造函数。
由编译器创建的默认构造函数称为合成的默认构造函数,它将依据如下规则初始化类中的成员变量:
1.内置数据类型的初始化
内置数据类型是否自动初始化取决于变量定义的位置。如果变量在全局作用域内定义(即不在任何函数中)或定义为静态局部变量,则这些成员将被初始化为0。如果变量在局部作用域内定义,则这些成员没有初始化。
2.类类型变量的初始化
调用类的默认构造函数来初始化类类型变量。

小心地雷:基于以上的初始化规则,合成的默认构造函数一般适用于仅包含类类型成员的类。而对于含有内置数据类型或者复合类型成员的类,则通常应该定义他们自己的默认构造函数初始化这些成员。

举一个没有默认构造函数的例子:

[cpp]  view plain copy
  1. //==============================================================  
  2. //           ExamDefaultConstructor.h  
  3. //  
  4. // begin   : 2012-05-13  
  5. // author  : zwq  
  6. // describe: 默认构造函数例子。  
  7. //==============================================================  
  8. #if !defined(AFX_EXAMDEFAULTCONSTRUCTOR_H__2425242C_2C23_43E4_B38B_A039FCA3F929__INCLUDED_)  
  9. #define AFX_EXAMDEFAULTCONSTRUCTOR_H__2425242C_2C23_43E4_B38B_A039FCA3F929__INCLUDED_  
  10.   
  11. #if _MSC_VER > 1000  
  12. #pragma once  
  13. #endif // _MSC_VER > 1000  
  14.   
  15. // C++新标准头文件提倡的写法  
  16. #include <string>  
  17. // C++新标准中的标准库中的名称都是在std命名空间中  
  18. using namespace std;  
  19.   
  20. //===============================================================  
  21. //  
  22. //              CExamDefaultConstructor  
  23. //                默认构造函数例子类  
  24. //  
  25. //===============================================================  
  26.   
  27. class CExamDefaultConstructor    
  28. {  
  29. public:  
  30.     // 没有提供默认的构造函数,编译器会为该类自动生成默认构造函数  
  31.     // 自动生成的默认构造函数称为合成的默认构造函数  
  32.     // CExamDefaultConstructor();  
  33.     virtual ~CExamDefaultConstructor();  
  34.   
  35. public:  
  36.     string m_strName;   // 抽象标准库类型,有自己的默认构造函数,值为空串  
  37.     int m_nAge;         // 基本内置数据类型,且在局部作用域内,系统不进行自动初始化,随机值  
  38.     static int m_nLevel;// 静态数据成员,且在局部作用域内,系统进行自动初始化,值为0  
  39. };  
  40.   
  41. #endif // !defined(AFX_EXAMDEFAULTCONSTRUCTOR_H__2425242C_2C23_43E4_B38B_A039FCA3F929__INCLUDED_)  

[cpp]  view plain copy
  1. //==============================================================  
  2. //           ExamDefaultConstructor.cpp  
  3. //  
  4. // begin   : 2012-05-13  
  5. // author  : zwq  
  6. // describe: 默认构造函数例子。  
  7. //==============================================================  
  8.   
  9. #include "stdafx.h"  
  10. #include "ExamDefaultConstructor.h"  
  11.   
  12. //===============================================================  
  13. //  
  14. //              CExamDefaultConstructor  
  15. //                默认构造函数例子类  
  16. //  
  17. //===============================================================  
  18.   
  19. // static数据成员必须在类定义体的外部定义(正好一次)。  
  20. // 不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。  
  21. // 在这里可以不显示初始化,系统将隐式初始化为0。  
  22. int CExamDefaultConstructor::m_nLevel;  
  23.   
  24. // CExamDefaultConstructor::CExamDefaultConstructor()  
  25. // {  
  26. //   
  27. // }  
  28.   
  29. CExamDefaultConstructor::~CExamDefaultConstructor()  
  30. {  
  31.   
  32. }  


执行上述程序:

[cpp]  view plain copy
  1. // CPlusPlusPrimer.cpp : Defines the entry point for the console application.  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include <iostream>  
  6. #include "ExamDefaultConstructor.h"  
  7.   
  8. using namespace std;  
  9.   
  10. int main(int argc, char* argv[])  
  11. {  
  12.     // 调用编译器合成的默认构造函数  
  13.     CExamDefaultConstructor exam;  
  14.   
  15.     cout << "the name is " << exam.m_strName << endl;  
  16.     cout << "the age is " << exam.m_nAge << endl;  
  17.     cout << "the level is " << CExamDefaultConstructor::m_nLevel << endl;  
  18.   
  19.     return 0;  
  20. }  



执行结果如下:


通过输出结果可以看出:
在合成的默认构造函数中,初始化变量m_strName时调用string的默认构造函数,初始化的结果为空串;初始化m_nAge时,由于该变量定义在了局部作用域内,则没有初始化,是运行时分配的随机值;静态数据成员m_nLevel被系统自动初始化为0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值