C++封装

C++面向对象的三大特性为:封装、继承、多态。万物皆为对象,对象有其相应的属性和行为。

1 封装
1.1 封装的意义
封装是C++面向对象三大特性之一

1.2 语法
 class name
 {
 访问权限:
 ​
         属性
 ​
         行为
 };
注意:类中的属性和行为 统称为成员

属性 又称 成员属性 / 成员变量

行为 又称 成员函数 / 成员方法

封装将属性和行为作为一个整体,表现生活中的事物

1.3 示

接下来创建一个圆类,以计算圆的周长

创建圆类:

// 创建一个 圆 类,class后跟着的就是类的名称
 class Circle
 {
     // 访问权限
 public:// 公共权限
 ​
     // 属性
     int r; // 半径
 ​
     // 行为
     double caculate_perimeter() // 计算圆的周长
     {
         return 2 * PI * r;
     }
 };

主函数

实例化:通过类创建一个对象的过程

 #define PI 3.14
 int main()
 {    //   实例化:通过类创建一个对象的过程
     Circle c; // 通过 圆 类创建具体的圆(对象) 
 ​
     cin >> c.r; // 给 圆 对象 的属性赋值
 ​
     cout << "半径为" << c.r << "的圆的周长为" << c.caculate_perimeter() << endl;
     return 0;
 }

1.3.2 示例2
设计一个学生类,属性有姓名和学号,行为可以给学生姓名和学号赋值,而且可以显示学生姓名和学号

class student
 {
 public:
 ​
     // 属性:姓名 学号
     string s_name;
     int s_number;
 ​
     // 行为:给姓名与学号赋值/显示
     void show()
     {
         cout << "学生姓名为" << s_name << endl;
         cout << "学生学号为" << s_number;
     }
     // 赋值
     void assignment1() // 键盘输入
     {
         cout << "请输入姓名" << endl;
         cin >> s_name;
         cout << endl;
         cout << "请输入学号" << endl;
         cin >> s_number;
     }
     void assignment2(string name,int Studnet_number)// 直接传参
     {
         s_name = name;
         s_number = Studnet_number;
     }
 };
对于给姓名和学号赋值,有2种方法

直接键盘cin

调用函数时直接传参

方法不同,调用函数时写法也不同

 int main()
 {
     student s1;
     s1.assignment1();   //1键盘cin输入
     s1.assignment2("joyce", 32054123); // 2直接传参
     s1.show();
 ​
     return 0;
 }
1.4 将属性和行为加以权限控制
类在设计时,可以把属性和行为放在不同的权限下,加以控制

访问权限有3种:

名称    作用范围    不同点    
public    公共权限    类内可以访问,类外可以访问    \
protected    保护权限    类内可以访问,类外不可以访问    继承关系中,子可以使用父的
private    私有权限    类内可以访问,类外不可以访问    继承关系中,子不能使用父的
示例:

 class person
 {
 public:
     string name;// 姓名,公共权限
 ​
 protected:
     string car;// 汽车,保护权限
 ​
 private:
     int password;// 密码,私有权限
 };
 ​
 int main()
 {
     person p;
     p.name = "joyce";// 只有公共权限在类外才可以访问
     p.car = "BMW";
     p.password = 131221;
     return 0;
 }

不过,如果在类内定义一个公共权限的函数,以访问各个权限的属性,则

 class person
 {
 public:
     string name;// 姓名,公共权限
 ​
 protected:
     string car;// 汽车,保护权限
 ​
 private:
     int password;// 密码,私有权限
 ​
 public: //类内定义的公共权限的函数
     void func()
     {
         string name = "nana";
         string car = "BMW";
         int password = 19931312;
     }
 };

在main函数中调用func函数,则可以访问保护权限和私有权限的属性

     p.func();
不过若是将函数的权限从public改为protected或是private,则仍然无法访问

1.5 struct与class的区别
区别仅在于 默认的访问权限不同

名称    默认访问权限    
struct    public    公共权限
class    private    私有权限
1.5.1 示例
创建struct和class两个类型

 struct P1
 {
     int a;
 };
 class P2
 {
     int a;
 };
在main函数中
创建变量并尝试访问
 int main()
 {
     P1 p1; // 结构体
     p1.a = 5;
 ​
     P2 p2; // 类
     p2.a = 5;
     return 0;
 }

1.6 成员属性设置为私有
作用:

可以自己控制成员的读写权限

 class My
 {
 public:
     void setname(string name)// 设置姓名
     {
         m_name = name;
     }
     string getname() // 返回姓名
     {
         return m_name;
     }
 ​
     int getage() // 返回年龄,无法修改
     {
         return age;
     }
 ​
     void setPassword(int password) // 修改密码,无法查看
     {
         m_Password = password;
     }
 private:
     string m_name; // 设置为可读可写
     int age = 5; // 设置为只读
     int m_Password; // 设置为只写
 };
接下来使用各个函数,修改或查看各个属性

int main()
 {
     My m;
     m.setname("joyce"); // 设置姓名
     cout << m.getname() << endl; // 查看姓名
 ​
     cout << m.getage() << endl;// 查看年龄
     //m.age = 6; // 若想修改年龄,无法访问
 ​
     m.setPassword(3171321); // 修改密码,无法查看
     m.m_Password; 
 ​
     return 0;
 }

C++中,封装是面向对象编程中的一个重要概念。封装指的是将数据和对数据的操作封装在一起,形成一个类。这个类可以看作是一个黑盒子,外部只能通过类的接口来访问数据和操作,而无法直接访问类的内部实现。这样做的好处是可以隐藏类的内部实现细节,提高程序的安全性和可维护性。 在C++中,封装主要通过访问控制权限来实现。C++提供了三种访问控制权限:public、protected和private。public成员可以在任何地方访问,protected成员可以被派生类访问,private成员只能在本类中访问。 一个类中的数据成员通常被声明为private,而对外提供一些公共的成员函数来访问和修改这些数据成员。这些公共的成员函数就是类的接口。通过这样的封装,可以有效地控制数据的访问和修改,从而保证程序的正确性和安全性。 下面是一个简单的示例代码,演示了如何在C++封装一个类: ```cpp class MyClass { public: MyClass(); // 构造函数 void setData(int data); // 设置数据 int getData(); // 获取数据 private: int m_data; // 数据成员 }; MyClass::MyClass() { m_data = 0; } void MyClass::setData(int data) { m_data = data; } int MyClass::getData() { return m_data; } int main() { MyClass obj; obj.setData(100); cout << obj.getData() << endl; return 0; } ``` 在上面的代码中,MyClass类中的数据成员m_data被声明为private,而对外提供了两个公共的成员函数setData和getData,用于设置和获取数据成员。这样,外部代码就无法直接访问和修改m_data成员,必须通过MyClass类的接口来访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值