c++类中的成员可以是另一个类的对象。该对象为对象成员
class A{}
class B
{
A aa;
}
则A,B构造和析构的顺序是怎样的,谁先谁后?
1.有参构造函数和之前的void setname()之间的异同
class phone
{
public:
void setpname(string pname) //有参构造赋值的作用和这个void函数一样,不过要方便很多
{
m_pname = pname;
}
string getpname()
{
return m_pname;
}
phone() //因为自己创建了有参构造,所以系统没有了默认构造,要创建一个
{
}
phone(string pname)
{
m_pname = pname;
}
string m_pname;
};
class person
{
public:
string m_name;
phone m_phone; //手机也是一个类
};
int main()
{
phone p; person pe;
p.setpname("大");
p = phone("阿萨德"); //已经建立了对象后,可用显示法传输到有参构造
cout << p.getpname() << endl;
system("pause");
return 0;
}
2.(1)初始化列表隐式转换点的解释
(2)显示法与括号法与默认构造函数的关系
(3)pe = person("老朱", pe.m_phone.m_pname)的错误写法
(4)两个类构造和析构的顺序
先构造作类成员的其他类对象,再构造自身
先析构自身,再析构类成员的其他类对象
class phone
{
public:
phone()
{
}
~phone()
{
cout << "phone析构函数调用" << endl;
}
phone(string pname)
{
m_pname = pname;
cout << "phone构造函数调用" << endl;
}
string m_pname;
};
class person
{
public:
//这里的初始化列表pname是一个字符串,但m_phone是一个对象,为什么能赋值?
//phone m_phone = pname 是隐式转换法等同于 phone m_phone = phone(pname)
person(string name, string pname) :m_name(name), m_phone(pname)
{
m_name = name;
m_phone = pname;
cout << "person构造函数调用" << endl;
}
~person()
{
cout << "person析构函数调用" << endl;
}
string m_name;
phone m_phone; //手机也是一个类
};
int main()
{
phone p("华米");
//pe = person("老朱", pe.m_phone.m_pname);不能写成这样,因为这行的意思是将老朱和person类中
//的phone类中的m_pname值传到m_pname中,但此时m_pname还没有值,所有传过去一个空
//不显示
person pe = person("老汪", p.m_pname); //显示法先建变量pe,再传输值,所以需要一个系统构造函数
//括号法直接传输值,不需要加一个默认构造函数
cout << pe.m_name << " " << pe.m_phone.m_pname << endl;
system("pause");
return 0;
}
。