#include <iostream>
#include <string>
using namespace std;
class Game
{
public:
// explicit:防止利用隐式类型转换方式来构造对象。
explicit Game(string iname)
{
name = iname;
cout<<"Game::Game(string iname)"<<endl;
}
~Game()
{
cout<<"Game::~Game()"<<endl;
}
string getname()
{
return name;
}
private:
string name;
};
class Phone
{
public:
Phone(string iname)
{
name = iname;
cout<<"Phone::Phone(string iname)"<<endl;
}
~Phone()
{
cout<<"Phone::~Phone()"<<endl;
}
string getname()
{
return name;
}
private:
string name;
};
class Person
{
public:
// 其他类对象作为本类成员,先构造其他类对象,再构造自身,析构与构造相反。
Person(string iname, string pname, string gname):name(iname), phone(pname), game(gname)
{
cout<<"Person::Person(string iname, string pname, string gname)"<<endl;
}
~Person()
{
cout<<"Person::~Person()"<<endl;
}
void playGame()
{
cout<<name<<"正在用"<<phone.getname()<<"玩"<<game.getname()<<endl;
}
private:
string name;
Phone phone;
Game game;
};
// 一个类对象作为另一个类的成员
void test01()
{
Person p("李四", "iphone7 plus", "王者荣耀");
p.playGame();
}
// 类的调用方式
void test02()
{
Game g1("王者荣耀"); // 括号法调用
Phone p1 = Phone("iphone"); // 显示法调用
//Phone p2 = "123";
Phone("Apple"); // 匿名对象 - 当前行执行后,编译器立即回收匿名对象
// 注意:不要利用拷贝构造函数初始化匿名对象
// Phone(p1); // Phone(p1); <=> Phone p1;
// 隐式调用法,避免该调用方法,可在有参构造函数前加explicit关键字来防止
Phone p = "xiaomi";
}
int main()
{
//test01();
test02();
return 0;
}