一、整体代码
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
#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.csdn.net/yili_xie/article/details/4803428