嵌入对象
类的成员变量为用户自定义的类型时,这些成员变量称为嵌入对象。
示例:将Master嵌入World
#include<iostream>
class Master
{
public:
Master(int id):
_identifier(id)
{
std::cout << "Master for " << _identifier << "created" << std::endl;
}
~Master()
{
std::cout << "Master for " << _identifier << "destory" << std::endl;
}
private:
int _identifier;
};
class World
{
public:
World(int id) :_identifier(id), _master(_identifier)
{
std::cout << "hello from world" << _identifier << std::endl;
}
~World()
{
std::cout << "Goodbye from world" << _identifier << std::endl;
}
private:
const int _identifier;
const Master _master;
};
World theWorld(1);
int main()
{
World smallWorld(2);
return 0;
}
对象嵌入称做"has-a"关系,就上例来说” World has a Master"。
在World构造函数的前导为:
public:
World(int id) :_identifier(id), _master(_identifier)
首先初始化_identifier,然后用_identifier初始化成员变量_master。因为_master是类的对象,所以调用类Master的构造函数,该构造函数需要一个值,这个值就是传递的_identifier。 类World的成员变量皆为常量成员,需要在前导中初始化,且在World生存期不变。
为什么可以用_identifier初始化_master?
在World的成员变量定义中 _identifier 在 _master 前面,所以_indentifier先被初始化,然后初始化_master。
(所以说,上面前导中的顺序,其实并不代表真正的_indentifer和_master初始化顺序。而成员变量定义的顺序,才是初始化前后的顺序。其实在普通的变量定义时,变量定义先后的顺序,就是代表初始化前后的顺序)
代码修改如下,输出结果一致。但是把两个变量定义的前后顺序修改后,输出结果不一致。
public:
World(int id) : _master(_identifier),_identifier(id)
综上所述:例子中首先初始化成员变量,之后调用了Master的构造函数,之后调用World的构造函数。。当释放对象时,反过来,先调用World的析构函数,再调用Master的析构函数。