首页 > 代码库 > 讲讲c++ Session 5:成员对象(Member objects)和封闭类(Enclosing class)
讲讲c++ Session 5:成员对象(Member objects)和封闭类(Enclosing class)
成员对象: 一个类的成员变量是另一个类的对象
封闭类:包含成员对象的类
举个栗子:
规范:
1、出现成员对象时,该类的构造函数要包含对成员的初始化。如果构造函数的成员初始化列表没有对成员对象初始化时,则使用成员对象的缺省构造函数。
2、建立一个类的对象时,应先调用其构造函数。但是如果这个类有成员对象,则要先执行成员对象自己所属类的构造函数,当全部成员对象都执行了自身类的构造函数后,再执行当前类的构造函数。
例如:
其输出为:
Engine contructor
Tyre contructor
Car contructor
Car destructor
Tyre destructor
Engine destructor
根据规范可知,调用顺序和编译器顺序是不一样的,因此输出也不同。
【参考Tips】
封闭类:包含成员对象的类
举个栗子:
class Tyre { private: int radius; int width; public: Tyre(int r, int w):radius(r), width(w) { } }; class Engine { };
class Car { // 这个类就是所谓的封闭类 //其中包括成员对象Engine和Tyre private: int price; Tyre tyre; Engine engine; public: Car(int p, int tr, int tw); }; Car::Car(int p, int tr, int w):price(p), tyre(tr, w){ }; int main(){ Car car(20000,17,225); return 0; }
规范:
1、出现成员对象时,该类的构造函数要包含对成员的初始化。如果构造函数的成员初始化列表没有对成员对象初始化时,则使用成员对象的缺省构造函数。
2、建立一个类的对象时,应先调用其构造函数。但是如果这个类有成员对象,则要先执行成员对象自己所属类的构造函数,当全部成员对象都执行了自身类的构造函数后,再执行当前类的构造函数。
例如:
class Tyre { public: Tyre() { cout << "Tyre contructor" << endl; } ~Tyre() { cout << "Tyre destructor" << endl; } }; class Engine { public: Engine() { cout << "Engine contructor" << endl; } ~Engine() { cout << "Engine destructor" << endl; } }; 7 class CCar { private: Engine engine; Tyre tyre; public: Car( ) { cout << “Car contructor” << endl; } ~Car() { cout << "Car destructor" << endl; } }; int main(){ Car car; return 0; }
其输出为:
Engine contructor
Tyre contructor
Car contructor
Car destructor
Tyre destructor
Engine destructor
根据规范可知,调用顺序和编译器顺序是不一样的,因此输出也不同。
【参考Tips】
#include<iostream> using namespace std; class Date { public: Date( ){ cout<<"This is Date"<<endl; } //Date的缺省构造函数 Date(int A) { cout<<"The value=http://www.mamicode.com/"<
注释1:
主程序运行到Time t1 , t2时,会检查Time类中是否有成员对象,检查中根据Date d1 , d2; 发现有成员对象d1和d2,就先执行d1和d2对应的Date类中的构造函数,然后再执行Time中的构造函数。
具体步骤为:
(一)在创建t1对象(无参数)时,按下列步骤进行:
1、执行d1所属类Date的构造函数,因为d1在Time中未初始化,故在重载时调用缺省构造函数,输出 This is Date;
2、执行d2所属类Date的构造函数,因为d1在Time中未初始化,故在重载时调用缺省构造函数,输出 This is Date;
3、执行t1所属类Time的构造函数,因为d1在Time中未初始化,故在重载时调用缺省构造函数,输出 This is time;
(二)在创建t2对象(有参数)时,按下列步骤进行:
4、执行d1所属类Date的构造函数,因为d1在Time中未初始化,故在重载时调用缺省构造函数,输出 This is Date.
5、执行d2所属类Date的构造函数,根据Time中 Time(int A):d2(A); 发现d2已经被初始化为d2(A),在这里即为d2(6),由此则需要调用Date类的构造函数Date(int A),输出 The value= http://www.mamicode.com/.
6、执行t2所属类Time的构造函数,t2的重载函数应为Time(int A),输出 Hello.
【参考Tips原文地址:http://blog.csdn.net/rhzwan123/article/details/2105205】讲讲c++ Session 5:成员对象(Member objects)和封闭类(Enclosing class)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。