• 【C++漂流记】一文搞懂类与对象的封装


    本篇文章主要说明了类与对象中封装的有关知识,包括属性和行为作为整体、访问权限、class与struct的区别、成员属性的私有化,希望这篇文章可以帮助你更好的了解类与对象这方面的知识。
    在这里插入图片描述



    一、属性和行为作为整体

    封装是面向对象编程中的一种特性,它将数据和操作数据的方法组合在一起,形成一个类。封装的目的是将数据和方法进行包装,使其成为一个独立的实体,外部只能通过类提供的接口来访问和操作数据,而不需要了解内部的实现细节。

    示例:

    class Circle {
    private:
        double radius;
    
    public:
        void setRadius(double r) {
            radius = r;
        }
    
        double getRadius() {
            return radius;
        }
    
        double getArea() {
            return 3.14 * radius * radius;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在上面的示例中,我们定义了一个名为Circle的类,它具有一个私有的属性radius和三个公有的方法setRadiusgetRadiusgetArea

    • 属性:属性是类中的变量,用于存储对象的状态。在示例中,radiusCircle类的私有属性,只能通过类的方法来进行访问和修改。

    • 行为:行为是类中的方法,用于操作对象的状态。在示例中,setRadius方法用于设置radius的值,getRadius方法用于获取radius的值,getArea方法用于计算圆的面积。

    通过封装,我们将属性和行为组合在一起,形成了一个完整的圆对象。外部代码只能通过类的公有方法来访问和操作圆的属性,而不需要知道属性的具体实现细节。这样可以提高代码的可维护性和安全性,同时也方便了代码的重用。


    二、访问权限

    同样以上面为示例

    在示例中,属性radius被声明为私有(private)。私有属性只能在类的内部访问,外部代码无法直接访问或修改私有属性的值。这是通过使用访问修饰符(private, public, protected)来实现的。

    私有属性和方法只能在类的内部使用,对外部是不可见的。这种封装的好处是可以隐藏类的内部实现细节,提高代码的安全性和可维护性。

    示例解释:

    在示例中,radius属性被声明为私有,这意味着外部代码无法直接访问radius属性。为了访问和修改radius的值,我们提供了公有的setRadiusgetRadius方法。通过setRadius方法,外部代码可以传递一个新的半径值来修改radius的值;通过getRadius方法,外部代码可以获取radius的当前值。

    Circle circle;
    circle.setRadius(5.0); // 通过公有方法setRadius设置radius的值为5.0
    double radius = circle.getRadius(); // 通过公有方法getRadius获取radius的值
    
    • 1
    • 2
    • 3

    在上面的示例中,外部代码无法直接访问circle对象的radius属性,而是通过公有方法setRadiusgetRadius来间接访问和修改radius的值。这样可以确保radius属性的访问和修改是受控的,同时隐藏了radius属性的具体实现细节。


    三种访问权限修饰符

    在C++中,有三种访问权限修饰符privateprotectedpublic。这些修饰符用于控制类的成员(属性和方法)对外部的可见性和可访问性。

    1. private(私有):私有成员只能在类的内部访问,外部代码无法直接访问或修改私有成员的值。私有成员的目的是隐藏类的内部实现细节,提高代码的安全性和封装性。

    2. protected(保护):保护成员在类的内部和派生类中可访问,但对外部是不可见的。保护成员的目的是在继承关系中提供一定的访问权限,使派生类能够继承和访问基类的成员。

    3. public(公有):公有成员可以在类的内部和外部访问。公有成员没有访问限制,可以被任何代码访问和修改。

    这些访问权限修饰符可以应用于类的成员(属性和方法)的声明。默认情况下,类的成员是私有的。


    三、class与struct的区别

    在C++中,classstruct是用于定义自定义数据类型的关键字。它们之间的主要区别在于默认的成员访问权限和默认的继承权限。

    1. 成员访问权限:
    • class:默认的成员访问权限是私有(private)
    • struct:默认的成员访问权限是公有(public)

    这意味着在class中声明的成员(属性和方法)默认是私有的,只能在类的内部访问。而在struct中声明的成员默认是公有的,可以在类的内部和外部访问。

    示例:

    class MyClass {
        int x;  // 默认为私有(private)
        void foo();  // 默认为私有(private)
    };
    
    struct MyStruct {
        int x;  // 默认为公有(public)
        void foo();  // 默认为公有(public)
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 继承权限:
    • class:默认的继承权限是私有继承(private inheritance)
    • struct:默认的继承权限是公有继承(public inheritance)

    这意味着在class中继承的成员默认是私有继承的,派生类只能访问基类的公有和保护成员。而在struct中继承的成员默认是公有继承的,派生类可以访问基类的公有、保护和私有成员。

    继承部分会在下一篇文章详细的说明,可以前往我主页订阅专栏,每天一个C++知识点

    示例:

    class BaseClass {
        // ...
    };
    
    class DerivedClass : BaseClass {
        // 默认为私有继承(private inheritance)
    };
    
    struct BaseStruct {
        // ...
    };
    
    struct DerivedStruct : BaseStruct {
        // 默认为公有继承(public inheritance)
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    除了上述区别之外,classstruct在语法上没有其他差异,它们可以具有相同的成员、方法和功能。选择使用class还是struct取决于个人偏好和代码的语义。一般来说,如果定义的是一个拥有私有成员和实现细节的复杂数据类型,通常会使用class;如果定义的是一个简单的数据容器或数据结构,通常会使用struct


    四、成员属性私有化

    将类的成员属性私有化是一种常见的编程实践,它可以提供更好的封装性和数据安全性。私有成员属性只能在类的内部访问,外部代码无法直接访问或修改私有属性的值。这样可以隐藏类的内部实现细节,防止外部代码对属性的误操作或非法访问。

    在C++中,可以使用访问权限修饰符来设置成员属性的访问权限。通过将属性声明为私有(private),可以将其限制为只能在类的内部访问。私有属性通常通过公有的成员函数(例如getterssetters)来间接访问和修改。

    示例代码:

    class MyClass {
    private:
        int privateAttribute;  // 私有属性
    
    public:
        // 公有成员函数用于访问和修改私有属性
        int getPrivateAttribute() {
            return privateAttribute;
        }
    
        void setPrivateAttribute(int value) {
            privateAttribute = value;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在上述示例中,privateAttribute被声明为私有属性,外部代码无法直接访问。通过公有的getPrivateAttribute()setPrivateAttribute()函数,可以间接地访问和修改私有属性的值。

    私有化成员属性的好处包括:

    • 隐藏类的内部实现细节,提高代码的封装性和安全性。
    • 通过公有的成员函数来控制对私有属性的访问和修改,可以进行数据验证和处理。
    • 允许在不改变类的接口的情况下,修改属性的实现细节。
  • 相关阅读:
    在window11上安装sshd
    基于$indexStats 构建mongodb 所有集合的索引监控程序
    y81.第四章 Prometheus大厂监控体系及实战 -- 监控扩展(十二)
    Angular 配置开发环境
    大一新生HTML期末作业 学生个人网页设计作业 HTML5响应式个人简历网站模板 web前端网页制作课作业
    移动端开发环境 - Mac
    Json字符串转换小工具
    TIJ14_类型信息
    【MindSpore】MindQuantum的新功能——量子线路图及测量的svg格式
    保存 uboot图像配置
  • 原文地址:https://blog.csdn.net/Goforyouqp/article/details/132774506