C++类和对象【1】—— 封装

简介: C++类和对象【1】—— 封装

一、对象的概念:

C++面向对象的三大特性为:<封装、继承、多态>


C++认为 "万事万物都皆为对象" ,对象上有其属性和行为。


例如:


人可以作为对象,属性有姓名、年龄、身高、体重...,行为有走、跑、跳、吃饭、唱歌...


车也可以作为对象,属性有轮胎、方向盘、车灯...,行为有载人、放音乐、放空调...


具有相同性质的==对象==,我们可以抽象称为==类==,人属于人类,车属于车类

二、封装

1)封装的意义

封装是C++面向对象的三大特性之一。

  • 将属性和行为作为一个个体,表现生活中的事务。
  • 将属性和行为加以权限控制。


(●'◡'●)封装意义一:

       在设计类的时候,把行为和属性放在一起,表现事物。

语法:  class 类名{ 访问权限: 属性/行为 };


(●'◡'●)示例一:设计一个圆类,求圆的周长

const double PI = 3.14; 
//设计一个圆类,求圆的周长:2 * PI *半径 
class Circle
{
  //访问权限
public: 
  //属性
  //半径
  int m_r; 
  //行为
  //求圆的周长
  double calculateZC()
  {
    return 2 * PI * m_r;
  } 
};
int main(){
  //通过圆类创建具体的圆(对象)
  //实例化(通过一个类 创建一个对象的过程) 
  Circle c1;
  c1.m_r = 10;
  cout<<"圆周长为:"<<c1.calculateZC() <<endl;
  system("pause");
  return 0;
}

(●'◡'●)示例二:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号

class Student 
{
  //访问权限
public: 
  //属性
  string ID;
  string Name; 
  //行为 
  void show()
  {
    cout<<"学生的姓名学号为:"<<Name<<" "<<ID<<endl;
  }
};
int main(){
  //对象实例化: 
  Student stu;
  stu.ID = "202102666";
  stu.Name="码雨";
  stu.show(); 
  system("pause");
  return 0;
}

一些类的术语:

       类中的属性和行为 我们统一称为 成员

       属性  成员属性  成员变量

       行为  成员函数  成员方法

(●'◡'●)示例三:

//学生类
class Student {
public:
    //利用方法给属性赋值
  void setName(string name) {
    m_name = name;
  }
  void setID(int id) {
    m_id = id;
  }
  void showStudent() {
    cout << "name:" << m_name << " ID:" << m_id << endl;
  }
public:
  string m_name;
  int m_id;
};
int main() {
  Student stu;
  stu.setName("德玛西亚");
  stu.setID(250);
  stu.showStudent();
  system("pause");
  return 0;
}

三、类中的访问权限

🥶三种访问权限:


公共权限 public          成员    类内可以访问    类外也可以访问

保护权限 protected    成员    类内可以访问    类外不可以访问    子类可以访问父类的保护内容

私有权限 private        成员    类内可以访问    类外不可以访问        

C++中struct和class的区别

在C++中 struct和class唯一的区别就在于 默认的访问权限不同🥶


struct默认权限是 公共 public


class默认权限是 私有 private

class C1
{
    int  m_A; //默认是私有权限
};
struct C2
{
    int m_A;  //默认是公共权限
};
int main() {
    C1 c1;
    c1.m_A = 10; //错误,访问权限是私有
    C2 c2;
    c2.m_A = 10; //正确,访问权限是公共
    system("pause");
    return 0;
}

成员属性设置为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限。


优点2:对于写权限,我们可以检测数据的有效性。


如果我们把属性全部设置为私有,就无法在类外面直接进行修改使用,这时就需要在public里面再写一个接口用来调用属性,对属性进行读写操作。

class Person {
public:
  //姓名设置可读可写
  void setName(string name) {
    m_Name = name;
  }
  string getName()
  {
    return m_Name;
  }
  //获取年龄 
  int getAge() {
    return m_Age;
  }
  //设置年龄
  void setAge(int age) {
    if (age < 0 || age > 150) {
      cout << "你个老妖精!" << endl;
      return;
    }
    m_Age = age;
  }
  //情人设置为只写
  void setLover(string lover) {
    m_Lover = lover;
  }
private:
  string m_Name; //可读可写  姓名
  int m_Age; //只读  年龄
  string m_Lover; //只写  情人
};
int main() {
  Person p;
  //姓名设置
  p.setName("张三");
  cout << "姓名: " << p.getName() << endl;
  //年龄设置
  p.setAge(50);
  cout << "年龄: " << p.getAge() << endl;
  //情人设置
  p.setLover("苍老师");
  //cout << "情人: " << p.m_Lover << endl;  //只写属性,不可以读取
  system("pause");
  return 0;
}

练习案例:设计立方体类


设计立方体类(Cube)


求出立方体的面积和体积


分别用全局函数和成员函数判断两个立方体是否相等。

//立方体类设计
//1、设计立方体
//2、设计属性
//3、设计行为 获取立方体面积和体积
//4、分别利用全局函数和成员函数 判断两个立方体是否相等
class Cube
{
public:
  //设置长
  void setL(int l)
  {
    m_L = l;
  }
  //获取长
  int getL()
  {
    return m_L;
  }
  //设置宽
  void setW(int w)
  {
    m_W = w;
  }
  //获取宽
  int getW()
  {
    return m_W;
  }
  //设置高
  void setH(int h)
  {
    m_H = h;
  }
  //获取高
  int getH()
  {
    return m_H;
  }
  //获取立方体面积
  int calculateS()
  {
    return 2 * (m_L*m_W + m_W*m_H + m_L*m_H);
  }
  //获取立方体体积
  int calculateV()
  {
    return m_L * m_H * m_W;
  }
  //利用成员函数判断两个立方体是否相等
  bool isequalByClass(Cube &c2)//应该用已知的对象来调用这个函数,然后再传进来一个对象c2进行比较
  {
    if (getL() == c2.getL() && getW() == c2.getW() && getH() == c2.getH())
    {//在类里面getL和m_L效果一样
      return true;
    }
    return false;
  }
private:
  int m_L;//长
  int m_W;//宽
  int m_H;//高
};
//利用全局函数判断 两个立方体是否相等
bool isequal(Cube &c1, Cube &c2)//直接利用引用,避免再拷贝数据
{
  if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())
  {
    return true;
  }
  return false;
}
int main() {
  //创建立方体对象
  Cube c1;
  c1.setH(10);
  c1.setL(10);
  c1.setW(10);
  cout << "c1的面积为:" << c1.calculateS() << endl;
  cout << "c1的体积为:" << c1.calculateV() << endl;
  //再创建一个立方体对象
  Cube c2;
  c2.setH(10);
  c2.setL(10);
  c2.setW(11);
  //利用全局函数比较
  if (isequal(c1, c2))
  {
    cout << "全局函数判断c1和c2是相等的" << endl;
  }
  else
  {
    cout << "全局函数判断c1和c2是不相等的" << endl;
  }
  //利用成员函数比较
  if (c1.isequalByClass(c2))
  {
    cout << "成员函数判断c1和c2是相等的" << endl;
  }
  else
  {
    cout << "成员函数判断c1和c2是不相等的" << endl;
  }
  system("pause");
  return 0;
}

用全局函数时,需要传两个对象进去;用成员函数,就需要传一个对象就好了(用一个已知的来调用,传进去一个未知的对象)

//点和圆的关系案例
//点类
class Point 
{
public:
  //设置x
  void setX(int x) {
    m_X = x;
  }
  //获取x
  int getX()
  {
    return m_X;
  }
  //设置y
  void setY(int y) {
    m_Y = y;
  }
  //获取y
  int getY() {
    return m_Y;
  }
private:
  int m_X;
  int m_Y;
};
//圆类
class Circle
{
public:
  //设置半径
  void setR(int r)
  {
    m_R = r;
  }
  //获取半径
  int getR()
  {
    return m_R;
  }
  //设置圆心
  void setCenter(Point Center)
  {
    m_Center = Center;
  }
    //获取圆心
  Point getCenter()
  {
    return m_Center;
  }
private:
  int m_R;//半径
  Point m_Center;//圆心
};
//判断点和圆的关系
void isInCircle(Circle& c, Point& p)
{
  //计算两点之间距离的平方
  int distance =
    (c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
    (c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());
  //计算半径平方
  int rDistance = c.getR() * c.getR();
  //判断关系
  if (distance == rDistance) {
    cout << "点在圆上" << endl;
  }
  else if (distance > rDistance) {
    cout << "点在圆外" << endl;
  }
  else
    cout << "点在圆内" << endl;
}
int  main() {
  //创建圆
  Circle c;
  c.setR(10);
  Point center;
  center.setX(10);
  center.setY(0);
  c.setCenter(center);
  //创建点
  Point p;
  p.setX(10);
  p.setY(10);
  //判断关系
  isInCircle(c, p);
  system("pause");
  return 0;
}
目录
打赏
0
0
0
0
2
分享
相关文章
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
1月前
|
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
70 19
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
52 13
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
54 5
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
42 5
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
48 4
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
本项目旨在通过C++编程实现一个教学游戏,帮助小朋友认识动物。程序设计了一个动物园场景,包含Dog、Bird和Frog三种动物。每个动物都有move和shout行为,用于展示其特征。游戏随机挑选10个动物,前5个供学习,后5个用于测试。使用虚函数和多态实现不同动物的行为,确保代码灵活扩展。此外,通过typeid获取对象类型,并利用strstr辅助判断类型。相关头文件如&lt;string&gt;、&lt;cstdlib&gt;等确保程序正常运行。最终,根据小朋友的回答计算得分,提供互动学习体验。 - **任务描述**:编写教学游戏,随机挑选10个动物进行展示与测试。 - **类设计**:基类
34 3
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等