C++类的组合

文章介绍了C++中类的组合概念,强调优先使用组合而非继承。详细阐述了初始化参数列表在构造函数中的应用,并通过示例展示了如何使用无参和带参构造函数。此外,还讨论了类组合时构造和析构的顺序,以及this指针的基本用法,用于在类方法中区分成员变量和局部变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是类的组合

类的组合就是以另一个对象为数据成员,这种情况称为类的组合

1.优先使用类的组合,而不是继承
2.组合表达式的含义 一部分关系

初始化参数列表

初始化参数列表,是构造函数的另一种写法

使用

初始化参数列表的形态
构造函数名(形参1, 形参2…) : 数据成员1(形参1), 数据成员2(形参2)…

#include<iostream>
#include<string>

using namespace std;

class MM
{
public:


	MM(int age, string name) : age(age), name(name)
	{

	}

	void printDate()
	{
		cout << age << " " << name;

	}

private:
	int age;
	string name;
};

int main()
{
	MM mm(19, "温柔了岁月");
	mm.printDate();

	system("pause");
	return 0;
}

初始化列表的其他写法

无参构造函数

#include<iostream>
#include<string>

using namespace std;


class MM
{
public:

	//无参构造函数
	MM() : age(18), name("温柔了岁月")
	{

	}

	void printDate()
	{
		cout << age << " " << name;

	}

private:
	int age;
	string name;
};

int main()
{
	MM mm;
	mm.printDate();

	system("pause");
	

类的组合案例分析

1.类组合包含的类的对象,必须采用初始化参数列表的方式去初始化
2.组合中初始化参数列表的写法:
构造函数名(形参1, 形参2, 形参3,…) : 对象1(形参1, 形参2), 对象2(形参3,…)

//组合类
#include<iostream>
#include<string>

using namespace std;

class MM1
{
public:
	MM1()
	{
		cout << "MM1号" << endl;
	}

private:
	int age;
	string name;

};

class MM2
{
public:
	MM2()
	{
		cout << "MM3号" << endl;
	}

private:
	int age;
	string name;

};

class MM3
{
public:
	MM3()
	{
		cout << "MM3号" << endl;
	}

private:
	int age;
	string name;
};

class MM
{
	void show()
	{
		
	}
private:         //其他三个类,都放在一个类中,当做一个数据类型进行使用  
	MM1 mm1; 
	MM2 mm2;
	MM3 mm3;
};
int main()
{
	MM mm;

	system("pause");
	return 0;
}

在这里插入图片描述

这是一个简单的类的组合,没有进行传参,
类的组合中,优先构造包含对象,再构造自身的对象
下面是传了形参的组合类

#include<iostream>
#include<string>

using namespace std;

class MM1
{
public:
	MM1(int age, string name)
	{
		cout << "MM1号" << endl;
	}

	void printDate()
	{
		cout << "MM3号" << endl;
	}

private:
	int age;
	string name;

};

class MM2
{
public:
	MM2(int age, string name)
	{
		cout << "MM3号" << endl;
	}

	void printDate()
	{
		cout << "MM3号" << endl;
	}
private:
	int age;
	string name;

};

class MM3
{
public:
	MM3(int age, string name)
	{
		cout << "MM3号" << endl;
	}

	void printDate()
	{
		cout << "MM3号" << endl;
	}

private:
	int age;
	string name;
};

class MM
{
public:

	MM(int x1,string y1, int x2, string y2, int x3, string y3): mm1(x1, y1), mm2(x2, y2),mm3(x3, y3){}
	
	void Print()
	{
		mm1.printDate();
		mm2.printDate();
	
		mm3.printDate();
	}

	MM1 getmm1()//访问数据成员
	{
		return mm1;
	}

	MM2 getMM2()
	{
		return mm2;
	}

	MM3 getMM3()
	{
		return mm3;
	}

private:         
	//构造顺序与此处有关,与初始化列表的顺序无关
	MM1 mm1;
	MM2 mm2;
	MM3 mm3;
};
int main()
{

	MM mm(1, "温柔", 2, "了", 3, "岁月");
	mm.Print();
	//mm.getmm1().printDate();//可以这样写

	system("pause");
	return 0;
}

指针的运用(new)

#include<iostream>

using namespace std;

class A
{

	
public:

	A(int a) : a(a)
	{

	}

	 int& getA()
	{
		 return a;
	}
private:
	int a;
};

class B
{
public:
	B(int b): b(b)
	{

	}

	int& getB()
	{
		return b;
	}
private:
	int b;
};

class C
{
public:
	C()
	{
		pa = new A(10);    //方法一:直接赋值
		pb = new B(123);
	}

	C(int a, int b) :pa(new A(10)), pb(new B(12))  //方法二,new的初始化列表
	{

	}

	void printDate()
	{
		cout << pa->getA() << endl;
		cout << pb->getB() << endl;
	}

private:
	A* pa;
	B* pb;
};

int main()
{
	C c;
	c.printDate();

	system("pause");
	return 0;
}

组合构造和析构顺序问题

1.一般构造顺序和析构顺序是相反的
2.类的组合中,优先构造包含对象,在构造自身对象
3.类的组合中,包含对象的构造顺序只和定义顺序有关,和初始化参数列表无关

this指针

任何指针都存在一个this指针,this指针只允许在类中的函数的函数中使用

避免形参名和数据成员的命名相同

基本用法和作用

this指针代表的是每个对象抽象的地址

#include<iostream>
#include<string>

using namespace std;

class MM
{
public:
	MM(int age, string name)
	{
		this->age = age;   //可以用this指针来进行区分
		MM::name = name;  // 类加作用域,来进行区分
 	}
private:
	int age;
	string name;
};
int main()
{
	system("pause");
}

其他作用
1.返回对象本身
2.返回对象地址

MM& returnMM() //返回对象本身
	{
		return *this;
	}

	MM* returnM()
	{
		return this; //返回对象地址
	}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温柔了成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值