文章目录
- 一、类的封装 : 将数据和方法封装到一个类中
- 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、代码分析 - 类对象作为参数传递的几种情况 ( 指针 / 引用 / 直接 )
使用 类 对象 作为函数参数时 , 分别讨论下面三种情况 ;
- 第一种情况 : 使用 类对象 指针作为参数 , 传参时 , 传入的必须是一个指针值 , 也就是地址值 ,
- 如果将 Circle circle 对象传入 , 必须使用 取地址符 & 获取对象的地址 , 才能传给 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 . . .