一、整体代码
Object.h
#ifndef _Object_H_
#define _Object_H_
#include "ObjectA.h"
class Object
{
public:
enum E_TYPE
{
TYPE_A = 100,
TYPE_B = 200
};
public:
// 如果类不提供任何一个构造函数,系统将为我们提供一个不带参数的
// 默认的构造函数
Object(int num=0);
~Object();
void DisplayKNum();
private:
ObjectA obj;
int num_;
const int kNum_;
int& refNum_;
};
#endif
Object.cpp
#include"Object.h"
#include<iostream>
using namespace std;
// 不带参数的构造函数称为默认构造函数
Object::Object(int num) : num_(num),kNum_(num), refNum_(num_),obj(3)//之前没有分配内存,这里是初始化,而不是赋值
{
cout<<"Object "<<num_<<" ..."<<endl;
}
Object::~Object()
{
cout<<"~Object "<<num_<<" ..."<<endl;
}
void Object::DisplayKNum()
{
cout<<"kNum="<<kNum_<<endl;
}
ObjectA.h
#ifndef _ObjectA_H_
#define _ObjectA_H_
class ObjectA
{
public:
ObjectA(int num);//如果有了新的构造函数,那么默认构造函数就没有了
~ObjectA();
void DisplayKNum();
private:
int num_;
};
#endif
#include"ObjectA.h"
#include<iostream>
using namespace std;
// 不带参数的构造函数称为默认构造函数
ObjectA::ObjectA(int num)
{
num_=num;
cout<<"ObjectA "<<num_<<" ..."<<endl;
}
ObjectA::~ObjectA()
{
cout<<"~ObjectA "<<num_<<" ..."<<endl;
}
void ObjectA::DisplayKNum()
{
}
01.cpp
#include <iostream>
#include "Object.h"
using namespace std;
// const成员的初始化只能在构造函数初始化列表中进行
// 引用成员的初始化也只能在构造函数初始化列表中进行
// 对象成员(对象所对应的类没有默认构造函数)的初始化,也只能在构造函数初始化列表中进行
int main(void)
{
Object obj(10);
obj.DisplayKNum();
return 0;
}
二、运行结果
三、解释
一共有四种类型一定要在构造函数初始化列表初始化:
一、const成员的初始化只能在构造函数初始化列表中进行
二、 引用成员的初始化也只能在构造函数初始化列表中进行
三、对象成员的初始化,也只能在构造函数初始化列表中进行,如果代码中没有初始化,那么编译器已经默认添上了对象的构造函数obj( )。
四、继承父类的构造函数只能在构造函数初始化列表中进行,如果代码中没有初始化,那么编译器已经默认添上了父类的构造函数base( )。
对象在初始化列表中初始化,请参考http://blog.youkuaiyun.com/yili_xie/article/details/4803428