C++学习笔记八
2015-09-24 21:50
309 查看
24、子对象
》当一个类的成员时另一个类的对象时,该对象就为子对象。
》子对象即是对象的成员
》当类中出现了子对象(对象成员),该类的构造函数要包含对子对象的初始化,
通常采用成员初始化列表的方法来初始化子对象;
#include<iostream.h>
class A
{
public:
A(int i,int j) { A1 = i;A2 = j;}
void Print() { cout<<A1<<","<<A2<<endl; }
private:
int A1,A2;
};
class B
{
public:
B(int i,int j,int k):a(i,j),b(k){} //成员初始化列表,私有成员可以通过这种方式初始化
void Print();
private:
A a; //定义在私有成员
int b;
//定义在私有成员
};
void B::Print()
{
a.Print();
cout<<b<<endl;
}
void main()
{
B b(7,8,9);
b.Print();
}
总结:a.成员初始化列表,私有成员可以通过这种方式初始化
b.被成员初始化列表初始化的变量都定义在私有成员,也包括前面的const变量。
子对象(二) (50_子对象(复杂点))
#include"whole.h"
void main()
{
Whole anObject(5,6,10);//Constructor of Whole.错误!!!
//Constructor of Part
//Constructor of Part
anObject.Print(); //6
//5
} //10
//Destructor of Part
//Destructor of Part
//Destructor of Whole.错误!!!
总结:
在主函数中,调用一个对象Whole,而且对象中有对象成员Part,则构造时将会先构造调用的对象成员Part,
再构造Whole。
退出时,也要先析构Part对象,再析构Whole对象。
a.子对象必须在成员初始化列表中初始化;
b.建立一个对象时,它的所有子对象一起建立; //重要
c.先执行子对象构造函数,在执行对象的构造函数。
d.析构函数的执行顺序与构造函数的执行顺序严格相反。
e.构造函数的调用顺序仅与子对象在类中声明的顺序有关,而与成员初始化列表中给出的对构造
函数的调用顺序无关
//难点:即构造函数的调用顺序不是跟成员初始化列表中的赋值顺序有关,而是与类子对象声明
顺序有关。
f.构造函数的成员初始化列表中未给出对子对象的调用,则表示使用子对象的缺省构造函数。
》当一个类的成员时另一个类的对象时,该对象就为子对象。
》子对象即是对象的成员
》当类中出现了子对象(对象成员),该类的构造函数要包含对子对象的初始化,
通常采用成员初始化列表的方法来初始化子对象;
#include<iostream.h>
class A
{
public:
A(int i,int j) { A1 = i;A2 = j;}
void Print() { cout<<A1<<","<<A2<<endl; }
private:
int A1,A2;
};
class B
{
public:
B(int i,int j,int k):a(i,j),b(k){} //成员初始化列表,私有成员可以通过这种方式初始化
void Print();
private:
A a; //定义在私有成员
int b;
//定义在私有成员
};
void B::Print()
{
a.Print();
cout<<b<<endl;
}
void main()
{
B b(7,8,9);
b.Print();
}
总结:a.成员初始化列表,私有成员可以通过这种方式初始化
b.被成员初始化列表初始化的变量都定义在私有成员,也包括前面的const变量。
子对象(二) (50_子对象(复杂点))
#include"whole.h"
void main()
{
Whole anObject(5,6,10);//Constructor of Whole.错误!!!
//Constructor of Part
//Constructor of Part
anObject.Print(); //6
//5
} //10
//Destructor of Part
//Destructor of Part
//Destructor of Whole.错误!!!
总结:
在主函数中,调用一个对象Whole,而且对象中有对象成员Part,则构造时将会先构造调用的对象成员Part,
再构造Whole。
退出时,也要先析构Part对象,再析构Whole对象。
a.子对象必须在成员初始化列表中初始化;
b.建立一个对象时,它的所有子对象一起建立; //重要
c.先执行子对象构造函数,在执行对象的构造函数。
d.析构函数的执行顺序与构造函数的执行顺序严格相反。
e.构造函数的调用顺序仅与子对象在类中声明的顺序有关,而与成员初始化列表中给出的对构造
函数的调用顺序无关
//难点:即构造函数的调用顺序不是跟成员初始化列表中的赋值顺序有关,而是与类子对象声明
顺序有关。
f.构造函数的成员初始化列表中未给出对子对象的调用,则表示使用子对象的缺省构造函数。
相关文章推荐
- C++学习笔记七
- C++学习笔记五
- C++学习笔记六
- c/c++:efficient c++,返回值优化,RVO
- C++学习笔记四
- C++学习笔记三
- C++学习笔记二
- C++学习笔记
- 漫谈C++11 Thread库之原子操作
- More Effective C++ 条款21 利用重载技术避免隐式类型转换
- VC++6_0调试篇:变量的观察--watch窗口的技巧
- C语言函数sscanf()的用法
- 二级指针的申请跟删除(基于C++的new机制)
- [一道搜狗输入法的面试题]C++转换构造函数和类型转换函数
- More Effective C++ 条款20 协助完成"返回值优化(RVO)"
- (更新)OutputDebugString函数简单封装,实现格式化打印输出(VC++)
- C++中的SFINAE
- C++实现屏幕截图(全屏截图)
- c++连接SQL server2005
- C++ 3维数组指针声明的3种方式