文章目录

  • 一、类的封装 : 将数据和方法封装到一个类中
  • 1、封装最基本的表层概念
  • 2、代码分析 - 基本封装
  • 3、代码分析 - 类对象作为参数传递的几种情况 ( 指针 / 引用 / 直接 )
  • 4、完整代码示例







一、类的封装 : 将数据和方法封装到一个类中




1、封装最基本的表层概念



将数据和方法封装到一个类中 , 是封装最基础的概念 ;



类的封装 最基本的功能 就是将 若干数据 和 若干方法 , 封装到一个类中 , 这些数据在内存中以一个整体的形式进行运作 ;

封装 Encapsulation : 将 数据 和 操作 封装在类中 , 可以将 类 内部的 实现细节 隐藏 , 只暴露有限的 接口 与外部进行交互 , 从而达到保护 类 对象的 内部状态 不被外部随意修改 ;



将 现实世界 中 存在的 客观事物 封装成 抽象 的 类 , 类 中 包含了 数据 和 操作 ,

  • 只有 可信的 类 或 对象 才能访问 隐藏起来的信息 ;
  • 大部分类默认只能访问 类 公开的接口 ;


2、代码分析 - 基本封装



在下面的代码中 , 定义了一个 Circle 类对象 , 其中 封装了 2 个成员属性 ;

// 定义属性成员 , 圆的半径
	double m_r;

	// 定义属性成员 , 圆的面积
	double m_s;

3 个成员方法 ;

定义该 Circle 类对象 circle , 则借助 circle 对象 , 可以直接访问其中的 2 个成员属性 和 3 个成员 方法 ;

// 获取半径
	double getR()
	{
		return m_r;
	}

	// 设置半径
	void setR(double r)
	{
		m_r = r;
	}

	// 获取面积
	double getS()
	{
		m_s = 3.14 * m_r * m_r;
		return m_s;
	}



3、代码分析 - 类对象作为参数传递的几种情况 ( 指针 / 引用 / 直接 )



使用 类 对象 作为函数参数时 , 分别讨论下面三种情况 ;

  • 第一种情况 : 使用 类对象 指针作为参数 , 传参时 , 传入的必须是一个指针值 , 也就是地址值 ,
  • 必须使用 取地址符 & 获取对象的地址 , 才能传给 void fun1(Circle* circle) 函数 ;
  • 在函数内部调用 circle 对象的成员 , 需要使用 -> 符号调用 , 也就是访问指针内存空间的成员的方式 ;
// 使用 类对象指针作为参数
void fun1(Circle* circle) 
{
	cout << "fun1(Circle* circle) : " << circle->getS() << endl;
}

Circle circle;
// 传递指针必须使用取地址符取地址
fun1(&circle);
  • 第二种情况 : 使用 类对象引用作为 参数 ; 传参时 , 可以直接将 circle 对象传入 , 因为 C++ 编译器在编译引用时 , 会自动为 引用参数 添加 & 取地址 , 在函数内部访问时 , 会自动为引用添加 -> 符号访问内存空间数据 , 引用 等价于 一级指针 ;
// 使用 类对象引用作为参数
void fun2(Circle& circle)
{
	cout << "fun2(Circle& circle) : " << circle.getS() << endl;
}

Circle circle;
// 传递引用直接传递即可
fun2(circle);
  • 第三种情况 : 直接使用 类对象作为参数 , 这种情况下 , 需要拷贝整个对象作为副本 ,该调用方式与 引用 类型参数操作相同 , 推荐使用 引用类型的参数 ;
// 直接使用 类对象作为参数
void fun3(Circle circle)
{
	cout << "fun3(Circle circle) : " << circle.getS() << endl;
}

Circle circle;
// 传递对象直接传递 , 需要拷贝整个对象效率很低
fun3(circle);



4、完整代码示例



完整代码示例 :

// 包含 C++ 头文件
#include "iostream"

// 使用 std 标准命名空间
//		该命名空间中 , 定义了很多标准定义
using namespace std;

// 定义圆形类
class Circle
{
public:
	// 定义属性成员 , 圆的半径
	double m_r;

	// 定义属性成员 , 圆的面积
	double m_s;

public:
	// 获取半径
	double getR()
	{
		return m_r;
	}

	// 设置半径
	void setR(double r)
	{
		m_r = r;
	}

	// 获取面积
	double getS()
	{
		m_s = 3.14 * m_r * m_r;
		return m_s;
	}
};

// 使用 类对象指针作为参数
void fun1(Circle* circle) 
{
	cout << "fun1(Circle* circle) : " << circle->getS() << endl;
}

// 使用 类对象引用作为参数
void fun2(Circle& circle)
{
	cout << "fun2(Circle& circle) : " << circle.getS() << endl;
}

// 直接使用 类对象作为参数
void fun3(Circle circle)
{
	cout << "fun3(Circle circle) : " << circle.getS() << endl;
}

int main()
{
	Circle circle;
	circle.setR(10);
	cout << "圆面积为 : " << circle.getS() << endl;

	// 传递指针必须使用取地址符取地址
	fun1(&circle);

	// 传递引用直接传递即可
	fun2(circle);

	// 传递对象直接传递 , 需要拷贝整个对象效率很低
	fun3(circle);

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
    return 0;
}

执行结果 :

圆面积为 : 314
fun1(Circle* circle) : 314
fun2(Circle& circle) : 314
fun3(Circle circle) : 314
Press any key to continue . . .

【C++】类的封装 ② ( 封装最基本的表层概念 | 类对象作为参数传递的几种情况 )_类