类的默认构造函数

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

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

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

//==============================================================
//           ExamDefaultConstructor.h
//
// begin   : 2012-05-13
// author  : zwq
// describe: 默认构造函数例子。
//==============================================================
#if !defined(AFX_EXAMDEFAULTCONSTRUCTOR_H__2425242C_2C23_43E4_B38B_A039FCA3F929__INCLUDED_)
#define AFX_EXAMDEFAULTCONSTRUCTOR_H__2425242C_2C23_43E4_B38B_A039FCA3F929__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

// C++新标准头文件提倡的写法
#include <string>
// C++新标准中的标准库中的名称都是在std命名空间中
using namespace std;

//===============================================================
//
//				CExamDefaultConstructor
//				  默认构造函数例子类
//
//===============================================================

class CExamDefaultConstructor  
{
public:
	// 没有提供默认的构造函数,编译器会为该类自动生成默认构造函数
	// 自动生成的默认构造函数称为合成的默认构造函数
	// CExamDefaultConstructor();
	virtual ~CExamDefaultConstructor();

public:
	string m_strName;	// 抽象标准库类型,有自己的默认构造函数,值为空串
	int m_nAge;			// 基本内置数据类型,且在局部作用域内,系统不进行自动初始化,随机值
	static int m_nLevel;// 静态数据成员,且在局部作用域内,系统进行自动初始化,值为0
};

#endif // !defined(AFX_EXAMDEFAULTCONSTRUCTOR_H__2425242C_2C23_43E4_B38B_A039FCA3F929__INCLUDED_)

//==============================================================
//           ExamDefaultConstructor.cpp
//
// begin   : 2012-05-13
// author  : zwq
// describe: 默认构造函数例子。
//==============================================================

#include "stdafx.h"
#include "ExamDefaultConstructor.h"

//===============================================================
//
//				CExamDefaultConstructor
//				  默认构造函数例子类
//
//===============================================================

// static数据成员必须在类定义体的外部定义(正好一次)。
// 不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。
// 在这里可以不显示初始化,系统将隐式初始化为0。
int CExamDefaultConstructor::m_nLevel;

// CExamDefaultConstructor::CExamDefaultConstructor()
// {
// 
// }

CExamDefaultConstructor::~CExamDefaultConstructor()
{

}


执行上述程序:

// CPlusPlusPrimer.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include "ExamDefaultConstructor.h"

using namespace std;

int main(int argc, char* argv[])
{
	// 调用编译器合成的默认构造函数
	CExamDefaultConstructor exam;

	cout << "the name is " << exam.m_strName << endl;
	cout << "the age is " << exam.m_nAge << endl;
	cout << "the level is " << CExamDefaultConstructor::m_nLevel << endl;

	return 0;
}



执行结果如下:


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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值