类里有其余对象则该对象叫成员对象;有成员对象的类叫 封闭类;函数
class CTyre // 轮胎类 { public: // 有参数构造函数 // 初始化成员变量m_radius和m_width CTyre(int r, int w):m_radius(r),m_width(w) { } private: int m_radius; // 半径 int m_width; // 宽度 }; class CEngine // 引擎类 { // 默认会有无参数构造函数 }; class CCar // 汽车类 -- 封闭类 { public: // 有参数构造函数 // 对成员变量m_price初始化,对成员对象tyre初始化 CCar(int p, int tr, int tw):m_price(p),tyre(tr,tw){} private: int m_price; // 价格 CTyre tyre; // 成员对象 CEngine engine; // 成员对象 }; int main() { CCar car(10000,20,50); return 0; }
上例中,若是CCar
类不定义构造函数,则会使用默认的无参构造函数,那么下面的语句会编译出错:code
CCar car;
由于编译器不明白CCar
类中的tyre
成员对象该如何初始化。engine
成员对象的初始化则没问题呢,由于用默认构造函数便可。对象
任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象,是如何初始化的。编译器
具体的作法是:经过封闭类的构造函数的初始化列表。编译
class CTyre // 轮胎类 { public: CTyre(){ std::cout << "CTyre 构造函数" << std::endl; } ~CTyre(){ std::cout << "CTyre 析构函数" << std::endl; } }; class CEngine // 引擎类 { public: CEngine(){ std::cout << "CEngine 构造函数" << std::endl; } ~CEngine(){ std::cout << "CEngine 析构函数" << std::endl; } }; class CCar // 汽车类 -- 3. 最后构造封闭类对象 { public: CCar(){ std::cout << "CCar 构造函数" << std::endl; } ~CCar(){ std::cout << "CCar 析构函数" << std::endl; } private: CTyre tyre; // 1. 先构构造该成员对象 CEngine engine; // 2. 接着构造该成员对象 }; int main() { CCar car; return 0; }
执行结果:class
CTyre 构造函数 CEngine 构造函数 CCar 构造函数 CCar 析构函数 CEngine 析构函数 CTyre 析构函数
class A { public: // 无参数构造函数 A() { std::cout << "A 构造函数" << std::endl; } // 复制构造函数 A(A & a) { std::cout << "A 复制构造函数" << std::endl; } }; class B { // 若没有声明构造函数和复制构造函数,则编译器会默认生成构造函数和复制构造函数 A a; // 成员对象 }; int main() { B b1; // b1对象 和 成员对象a都会执行无参数的构造函数 B b2(b1); // b2对象 和 成员对象a都会执行复制构造函数 return 0; }
输出结果:变量
A 构造函数 A 复制构造函数