C++学习笔记20:类的组合

本文深入探讨了类的组合概念,即一个类内嵌其他类的对象作为成员,阐述了组合类的构造函数设计,包括初始化次序和成员对象构造函数的调用顺序。通过具体代码示例,展示了如何在C++中实现组合类及其构造过程。

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

类的组合

定义:一个类内嵌其他类的对象作为成员的情况,他们之间的关系是一种包含与被包含的关系。

组合类的构造函数设计

当创建类的对象时,如果这个类具有内嵌对象成员,那么各个内嵌函数对象将首先被自动创建。
在创建对象时既要对本类的基本类型数据成员进行初始化,又要对内嵌对象进行初始化。

类名::类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表),...
{类的初始化}
构造组合类对象时的初始化次序

首先对构造函数初始化列表中列出的成员(包括基础类型成员和对象成员),次序为成员在类体中定义的次序。

  • 成员对象构造函数调用顺序:按对象成员的声明顺序,先声明者,先构造。
  • 初始化列表中未出现的成员对象,调用默认构造函数(即无形参)的初始化。

处理完初始化列表后,再执行构造函数的函数体。

//4_4.cpp
#include <iostream>
#include <cmath>
using namespace std;

class Point {	//Point类定义
public:
	Point(int xx = 0, int yy = 0) {//点的构造函数
		x = xx;
		y = yy;
	}
	Point(Point &p);
	int getX() { return x; }
	int getY() { return y; }
private:
	int x, y;
};

Point::Point(Point &p) {	//点的复制构造函数的实现
	x = p.x;
	y = p.y;
	cout << "正在调用点的复制构造函数" << endl;
}

//类的组合
class Line {	//Line类的定义
public:	//外部接口
	Line(Point xp1, Point xp2);//构造函数
	Line(Line &l);//复制构造函数
	double getLen() { return len; }
private:	//私有数据成员
	Point p1, p2;	//Point类的对象p1,p2
	double len;
};

//组合类的构造函数
Line::Line(Point xp1, Point xp2) : p1(xp1), p2(xp2) {
	cout << "正在调用组合线类的构造函数" << endl;
	double x = static_cast<double>(p1.getX() - p2.getX());
	double y = static_cast<double>(p1.getY() - p2.getY());
	len = sqrt(x * x + y * y);
}

//组合类的复制构造函数,带有初始化列表将l.p1赋值给p1
Line::Line (Line &l): p1(l.p1), p2(l.p2) {
	cout << "正在调用组合类线的复制构造函数" << endl;
	len = l.len;
}

//主函数
int main() {
	Point myp1(1, 1), myp2(4, 5);	//建立Point类的对象
	Line line(myp1, myp2);	//建立Line类的对象,调用四次点的复制构造,包括两个点对象的形参传递和初始化列表的对象赋值,进入组合类线的构造函数体
	Line line2(line);	//利用复制构造函数建立一个新对象,调用一次组合类线的复制构造函数,初始化列表的两次点的复制构造,进入线的复制构造函数体
	cout << "The length of the line is: ";
	cout << line.getLen() << endl;
	cout << "The length of the line2 is: ";
	cout << line2.getLen() << endl;
	return 0;
}

前向引用声明

类应该先声明,后使用。如果需要在某个类的定义之前引用该类,则应进行前向引用声明。前向引用声明只为程序引入一个标识符,但具体说明在其他地方。

class 类名;//类名处为需要前向声明的类名

注:

  • 使用前向引用声明虽然可以解决一些问题,但它并不是万能的。
  • 在提供一个完整的类声明之前,不能声明该类的对象,也不能在内联成员函数中使用该类的对象。
  • 当使用前向引用声明时,只能使用被声明的符号,而不能涉及类的任何细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值