• 【C++面向对象】1. 类、对象


    • C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。 是 C++面向对象 的核心特性,通常被称为用户定义的类型。
    • 类用于指定对象的形式,它包含了 数据表示法 和用于处理数据的 方法。类中的数据和方法称为类的 成员。函数在一个类中被称为类的成员。

    【 1. 类 & 对象的定义 】

    1.1 类的定义

    • 定义一个类,本质上是定义一个数据类型的蓝图。这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。
    • 类定义是以关键字 class 开头,后跟类的名称。类的主体是包含在一对花括号中,类定义后必须跟着一个分号或一个声明列表。例如,我们使用关键字 class 定义 Box 数据类型,如下所示:
    class Box
    {
       public:
          double length;   // 盒子的长度
          double breadth;  // 盒子的宽度
          double height;   // 盒子的高度
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.2 对象的定义

    • 类提供了对象的蓝图,所以基本上,对象是根据类来创建的。声明类的对象,就像声明基本类型的变量一样。下面的语句声明了类 Box 的两个对象,对象 Box1 和 Box2 都有它们各自的数据成员:
    Box Box1;          // 声明 Box1,类型为 Box
    Box Box2;          // 声明 Box2,类型为 Box
    
    • 1
    • 2

    【 2. 类的访问修饰符

    • 数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的 访问限制 是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。
    • 一个类可以有多个 public、protected 或 private 标记区域。每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。
    • 成员和类的 默认访问修饰符是 private
    • 实例
    class Base 
    {
    
       public:
    
      // 公有成员
    
       protected:
    
      // 受保护成员
    
       private:
    
      // 私有成员
    
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.1 public 公有成员

    • 在类对象作用域内,public 公有成员在类的外部是可访问的 。我们可以不使用任何成员函数来 直接设置和获取公有变量的值。
    • 实例:
    #include 
    
    using namespace std;
    
    class Line
    {
       public:
          double length;
          void setLength( double len );
          double getLength( void );
    };
    
    // 成员函数定义
    double Line::getLength(void)
    {
        return length ;
    }
    
    void Line::setLength( double len )
    {
        length = len;
    }
    
    // 程序的主函数
    int main( )
    {
       Line line;
    
       // 设置长度
       line.setLength(6.0); 
       cout << "Length of line : " << line.getLength() <<endl;
    
       // 不使用成员函数设置长度
       line.length = 10.0; // OK: 因为 length 是公有的
       cout << "Length of line : " << line.length <<endl;
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在这里插入图片描述

    2.2 private 私有成员

    • 私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员

    • 默认情况下(没有使用任何访问修饰符时),类的所有成员都是私有的。如下所示:width 是 私有的。

    class Box
    {
       double width;
       public:
          double length;
          void setWidth( double wid );
          double getWidth( void );
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 实际操作中,我们 一般会在私有区域定义数据,在公有区域定义相关的函数,以便在类的外部也可以调用这些函数。
    #include 
    
    using namespace std;
    
    class Box
    {
       public:
          double length;
          void setWidth( double wid );
          double getWidth( void );
    
       private:
          double width;
    };
    
    // 成员函数定义
    double Box::getWidth(void)
    {
        return width ;
    }
    
    void Box::setWidth( double wid )
    {
        width = wid;
    }
    
    // 程序的主函数
    int main( )
    {
       Box box;
    
       // 不使用成员函数设置长度
       box.length = 10.0; // OK: 因为 length 是公有的
       cout << "Length of box : " << box.length <<endl;
    
       // 不使用成员函数设置宽度
       // box.width = 10.0; // Error: 因为 width 是私有的
       box.setWidth(10.0);  // 使用成员函数设置宽度
       cout << "Width of box : " << box.getWidth() <<endl;
    
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    在这里插入图片描述

    2.3 protected 保护成员

    • 保护成员变量或函数与私有成员十分相似,但有一点不同,即 public 保护成员在派生类(即子类)中是可访问的
    • 实例:从父类 Box 派生了一个子类 smallBox, width 成员可被派生类 smallBox 的任何成员函数访问。
    #include 
    using namespace std;
    
    class Box
    {
       protected:
          double width;
    };
    
    class SmallBox:Box // SmallBox 是派生类
    {
       public:
          void setSmallWidth( double wid );
          double getSmallWidth( void );
    };
    
    // 子类的成员函数
    double SmallBox::getSmallWidth(void)
    {
        return width ;
    }
    
    void SmallBox::setSmallWidth( double wid )
    {
        width = wid;
    }
    
    // 程序的主函数
    int main( )
    {
       SmallBox box;
    
       // 使用成员函数设置宽度
       box.setSmallWidth(5.0);
       cout << "Width of box : "<< box.getSmallWidth() << endl;
    
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在这里插入图片描述

    2.4 继承中的访问修饰符特点

    • 共有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。
    基类 成员的访问属性派生 成员的访问属性
    public继承public → public
    private → private
    protected → protected
    private 继承public → private
    private → private
    protected → private
    protected 继承public → protected
    private → private
    protected → protected
    • 但无论哪种继承方式,有两点都没有改变:
      • private 成员只能被本类成员(类内)和友元访问,不能被派生类访问;
      • protected 成员可以被派生类访问。

    【 3. 类的成员 】

    3.1 数据成员

    • 类的对象的公共数据成员可以使用直接成员访问运算符即小数点 . 来访问。私有的成员和受保护的成员不能使用直接成员访问运算符 . 来直接访问。
    • 实例:
    #include 
    
    using namespace std;
    
    class Box
    {
       public:
          double length;   // 长度
          double breadth;  // 宽度
          double height;   // 高度
    };
    
    int main( )
    {
       Box Box1;        // 声明 Box1,类型为 Box
       Box Box2;        // 声明 Box2,类型为 Box
       double volume = 0.0;     // 用于存储体积
    
       // box 1 详述
       Box1.height = 5.0; 
       Box1.length = 6.0; 
       Box1.breadth = 7.0;
    
       // box 2 详述
       Box2.height = 10.0;
       Box2.length = 12.0;
       Box2.breadth = 13.0;
    
       // box 1 的体积
       volume = Box1.height * Box1.length * Box1.breadth;
       cout << "Box1 的体积:" << volume <<endl;
    
       // box 2 的体积
       volume = Box2.height * Box2.length * Box2.breadth;
       cout << "Box2 的体积:" << volume <<endl;
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在这里插入图片描述

    3.2 成员函数

    • 类的成员函数是指那些把原型写在类定义内部的函数,就像类定义中的其他变量一样。
    • 类的成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。

    3.2.1 类的内部定义成员函数

    • 实例,在 Box类 的内部定义 getVolume() 函数:
    class Box
    {
       public:
          double length;      // 长度
          double breadth;     // 宽度
          double height;      // 高度
    
          double getVolume(void)
          {
             return length * breadth * height;
          }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.2.2 类的外部定义成员函数

    • 在类的外部使用 范围解析运算符 :: 定义成员函数,在 :: 运算符之前必须使用类名。
    • 实例:在 Box类 的外部定义 getVolume() 函数
    double Box::getVolume(void)
    {
        return length * breadth * height;
    }
    
    • 1
    • 2
    • 3
    • 4

    3.2.3 成员函数的访问

    • 调用成员函数是在对象上使用 点运算符 .,这样它就能操作与该对象相关的数据,
    • 实例
    Box myBox;          // 创建一个对象
    
    myBox.getVolume();  // 调用该对象的成员函数
    
    • 1
    • 2
    • 3

    3.3 实例

    #include 
    
    using namespace std;
    
    class Box
    {
       public:
          double length;         // 长度
          double breadth;        // 宽度
          double height;         // 高度
    
          // 成员函数
          double getVolume(void);
          void setLength( double len );
          void setBreadth( double bre );
          void setHeight( double hei )
          {
        		height = hei;
    	  }
    };
    
    // 成员函数定义
    double Box::getVolume(void)
    {
        return length * breadth * height;
    }
    
    void Box::setLength( double len )
    {
        length = len;
    }
    
    void Box::setBreadth( double bre )
    {
        breadth = bre;
    }
    
    
    // 程序的主函数
    int main( )
    {
       Box Box1;                // 声明 Box1,类型为 Box
       double volume = 0.0;     // 用于存储体积
    
       // box 1 详述
       Box1.setLength(6.0); 
       Box1.setBreadth(7.0); 
       Box1.setHeight(5.0);
    
       // box 1 的体积
       volume = Box1.getVolume();
       cout << "Box1 的体积:" << volume <<endl;
    
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    在这里插入图片描述

  • 相关阅读:
    用户管理的小demo--登录校检
    【ODX Studio编辑PDX】-0.2-如何对比Compare两个PDX/ODX文件
    【K8S专栏】Kubernetes应用配置管理
    2022牛客多校第四场C.Easy Counting Problem
    Qt 读写 xml 文件
    vue3+ts项目创建 使用npm create vue@latest
    华为认证 | HCIA、HCIP、HCIE,难度区别在哪里?
    OS Audit file could not be created; failing after 6 retries
    如何利用OpenMesh实现不同格式的3D文件间的转换
    SpringCloud OpenFeign
  • 原文地址:https://blog.csdn.net/qq_44431690/article/details/133894444