构造函数初始化列表(与注意事项)

  1. 在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;

}
  1. 如果在对象中包含const变量,则一定要在构造的时候对其初始化eg:const int c;
    Constructor:: Constructor:m1(v1),m2(v1,v2),m3(v3),c(0),即要对c进行赋值
  2. 不仅在有参或无参构造函数后面可以跟初始化列表,在复制构造函数后面也可以跟初始化列表。
  3. 如果对象B中组合了对象A,,若 B obj1,则对应的构造函数那一行全部都会执行,eg:
    B(int m_b1,int m_b2):a1(1),a2(2),则会执行a1、a2、obj的构造函数,而不是仅仅执行obj的构造函数。
  4. 直接写B(100,200)这也是一个匿名对象,会在建立一个构造体之后立刻被析构。
  5. 不要在构造函数中调用构造函数
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值