- 在B类中,组合了一个A类的对象(A类设计了有参构造函数),根据构造函数的调用规则,写了 就必须要用,但是B并没有机会初始化A,因此编译时系统会出错。因此需要使用新的语法规则:Constructor:: Constructor:m1(v1),m2(v1,v2),m3(v3),举例:
#include<iostream>
class A
{
public:
A(int m_a) //A是含参构造体
{
a = m_a;
std::cout<<"构造函数"<<"a的值为: "<<a<<std::endl;
}
~A()
{
std::cout<<"A正在被析构"<<std::endl;
}
private:
int a;
};
// 组合对象的构造顺序
//先执行被组合的对象的构造函数,如果有多个被组合对象,则按照被定义的顺序来执行其构造函数,并不是按照初始化列表的顺序进行初始化
// 析构的顺序与构造的顺序相反
class B
{
public:
B(int m_b1,int m_b2):a1(1),a2(2),c(0)//因为这里包含对象A所以要这么写,否则该对象中的A对象无法被初始化
// B(int m_b1,int m_b2):a1(1),a2(2),c(0) 这个东西叫做初始化列表
{
b1 = m_b1;
b2 = m_b2;
std::cout <<"B的构造函数,b1的值为:"<<b1<<std::endl;
std::cout <<"B的构造函数,b2的值为:"<<b2<<std::endl;
}
~B()
{
std::cout<<"B正在被析构"<<std::endl;
}
private:
int b1;
int b2;
A a1; //B对象中组合有A的值
A a2;
const int c;
};
void objplay()
{
// A obja(1);
B objb(1,2); //会把构造函数那一行全部都给调用了
}
void main1()
{
objplay();
system("pause");
return;
}
- 如果在对象中包含const变量,则一定要在构造的时候对其初始化eg:const int c;
Constructor:: Constructor:m1(v1),m2(v1,v2),m3(v3),c(0),即要对c进行赋值 - 不仅在有参或无参构造函数后面可以跟初始化列表,在复制构造函数后面也可以跟初始化列表。
- 如果对象B中组合了对象A,,若 B obj1,则对应的构造函数那一行全部都会执行,eg:
B(int m_b1,int m_b2):a1(1),a2(2),则会执行a1、a2、obj的构造函数,而不是仅仅执行obj的构造函数。 - 直接写B(100,200)这也是一个匿名对象,会在建立一个构造体之后立刻被析构。
- 不要在构造函数中调用构造函数