C++从入门到精通——类的定义及类的访问限定符和封装

慈云数据 2024-04-09 技术支持 51 0

类的定义及类的访问限定符和封装

  • 前言
  • 一、类的定义
    • 类的两种定义方式
    • 成员变量命名规则的建议
    • 示例
    • 二、类的访问限定符和封装
      • 访问限定符
        • 访问限定符说明
        • C++为什么要出现访问限定符
        • 例题
        • 封装
          • 例题

            前言

            类的定义是面向对象编程中的基本概念,它描述了一类具有相同属性和方法的对象的抽象模板。类定义了对象的结构和行为,包括数据成员(属性)和成员函数(方法)。通过类,可以创建多个具有相同属性和方法的对象实例,从而实现代码的复用和模块化。类的定义通常包括类名、数据成员和成员函数的声明,以及可能的访问控制修饰符来指定成员的访问权限

            访问限定符用于控制类成员的访问权限,如private、protected和public等,它们决定了哪些代码可以访问类的属性和方法。封装则是将类的属性和方法隐藏在其内部,只通过公共接口与外部交互,从而保护数据不被外部直接访问和修改,提高代码的安全性可维护性。通过访问限定符和封装,可以实现更好的代码封装和信息隐藏,提高程序的模块化和可重用性。


            一、类的定义

            类的定义是面向对象编程的基础,它描述了具有相同属性和行为的对象的抽象模板。在类中,我们可以定义数据成员(属性)和成员函数(方法),这些成员共同构成了类的状态和行为。

            class className
            {
            	// 类体:由成员函数和成员变量组成
            };  // 一定要注意后面的分号
            

            class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。

            类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。

            类的两种定义方式

            1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。

              在这里插入图片描述

            2. 类声明放在.h文件中,成员函数定义放在.cpp文件中

              注意:成员函数名前需要加类名::

              在这里插入图片描述

            一般情况下,更期望采用第二种方式。

            成员变量命名规则的建议

            成员变量的命名应遵循以下建议:

            1. 使用有意义的名称:变量名应该能够清晰地描述其含义和用途。应该避免使用无意义的单词或缩写,以免给其他开发人员带来困惑。

            2. 使用驼峰命名法:变量名应使用驼峰命名法,即第一个单词的首字母小写,后续单词的首字母大写。例如,firstName、lastName。

            3. 避免使用缩写:除非广为人知并且相对简洁,否则应尽量避免使用缩写。使用完整的单词可以增加代码的可读性

            4. 使用具体的名称:变量名应该直观地反映该变量所表示的内容。例如,使用customerName而不是name来表示客户的姓名。

            5. 遵循命名约定:在开发团队中,应统一遵循一套命名约定。例如,使用下划线作为私有变量的前缀,或者使用前缀或后缀来区分变量的类型(如strName表示字符串类型的变量)。

            6. 避免使用保留字:变量名不能与编程语言中的保留字冲突。在选择变量名时,应避免使用关键字和内置函数的名称。

            7. 使用英文:英文是编程界的通用语言,应尽量使用英文来命名变量,以便其他开发人员可以更容易地理解代码。

            最重要的是,变量的命名应该具有一致性和可读性,并且能够准确地反映其含义和用途。这有助于提高代码的可维护性和可理解性。

            示例

            class Date
            {
            public:
            	void Init(int year)
            	{
            		// 这里的year到底是成员变量,还是函数形参?
            		year = year;
            	}
            private:
            	int year;
            };//使用这种函数进行初始化,初始化是不会成功的,是因为局部优先
            // 所以一般都建议这样
            class Date
            {
            public:
            	void Init(int year)
            	{
            		_year = year;
            	}
            private:
            	int _year;
            };
            // 或者这样
            class Date
            {
            public:
            	void Init(int year)
            	{
            		year_ = year;
            	}
            private:
            	int year_;
            };
            // 或者这样
            class Date
            {
            public:
            	void Init(int year)
            	{
            		mYear = year;
            	}
            private:
            	int mYear;
            };
            // 其他方式也可以的,主要看你未来公司要求。一般都是加个前缀或者后缀标识区分就行。
            

            二、类的访问限定符和封装

            访问限定符

            C++中有三种访问限定符,分别是public、protected和private。这些访问限定符用于控制类的成员的访问权限。

            1. public:公共访问限定符,被声明为public的成员可以在类的内部和外部被访问到。这意味着可以在任何地方访问该成员。

            2. protected:保护访问限定符,被声明为protected的成员可以在类的内部被访问到,但不能在类的外部被直接访问。但是,它可以被继承该类的派生类访问。

            3. private:私有访问限定符,被声明为private的成员只能在类的内部被访问到,不能在类的外部和派生类中被直接访问。

            访问限定符的默认访问级别取决于类的声明:

            • 默认情况下,类的成员(包括变量和函数)的访问级别为private。
            • 默认情况下,结构体的成员(包括变量和函数)的访问级别为public。

              例如,下面是一个使用访问限定符的类的示例:

              class MyClass {
              public:
                  int publicVar;   // 可以在类的内部和外部访问到
              protected:
                  int protectedVar;   // 可以在类的内部访问到,派生类也可以访问到
              private:
                  int privateVar;   // 只能在类的内部访问到
              };
              

              注意,访问限定符的目的是为了控制类的成员的访问权限,以保护数据的完整性和安全性,并且提供封装性。

              C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

              在这里插入图片描述

              访问限定符说明

              1. public修饰的成员在类外可以直接被访问
              2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
              3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
              4. 如果后面没有访问限定符,作用域就到 } 即类结束。
              5. class的默认访问权限为private,struct为public(因为struct要兼容C)

              注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

              C++为什么要出现访问限定符

              C++出现访问限定符是为了加强对类成员的访问控制,从而提高程序的安全性和可维护性。访问限定符可以限制外部的访问权限,防止无关的代码对类成员进行直接访问和修改,从而避免了意外的错误和数据不一致性。假如没有访问限定符可能会出现下面的场景,因为世界上的人口千千万,你制定了一个规则,不可能所有的人都会根据你所制定的规则去执行,总是会有一些特立独行的人,这时候就需要你用严厉的手段去强迫哪些人去执行你的规则。

              在这里插入图片描述

              访问限定符包括public、private和protected三种,分别用于指定成员的访问权限。public成员可以被类外部的代码访问,private成员只能在类内部的成员函数中访问,protected成员可以在类内部的成员函数和其子类中访问。通过使用这些访问限定符,可以明确规定哪些成员是对外公开的,哪些是内部实现细节,从而提高了程序的模块化和封装性。

              访问限定符还可以用于实现类的封装,隐藏类的内部实现细节,只暴露必要的接口给外部使用。这样可以有效地保护类的数据和实现细节,防止外部代码的错误操作和非法访问。

              另外,访问限定符也对继承关系起到了重要的作用。子类继承了父类的成员,但是访问限定符可以控制子类对父类成员的访问权限。这样可以在保持继承关系的同时,限制对继承成员的访问范围,提高了程序的灵活性和安全性。

              总之,C++出现访问限定符是为了提高程序的安全性、可维护性和灵活性,通过明确规定成员的访问权限,实现对类成员的访问控制和类的封装。

              例题

              C++中struct和class的区别是什么?

              解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。注意:在继承和模板参数列表位置,struct和class也有区别,后序文章给大家介绍。

              封装

              面向对象的三大特性:封装、继承、多态。

              C++的封装是一种面向对象的编程特性,它允许将数据和对数据的操作封装在一个类中,使得数据和操作与外部代码隔离,并提供了访问和修改数据的接口。

              C++的封装通过类的访问修饰符来实现。一个类可以包含公有、私有和保护三种类型的成员,其中公有成员可以被类的外部代码直接访问,私有成员只能在类的内部访问,而保护成员则只能在类的内部和其派生类中访问。

              封装的优点包括:

              • 数据隐藏:通过将数据封装在类的私有成员中,可以避免外部代码直接修改数据,从而提高代码的安全性和可靠性
              • 细节隐藏:封装可以隐藏类的实现细节,使得外部代码只需要关注类的公有接口,而不需要了解类的内部实现。
              • 代码重用:通过封装类的功能和数据,可以将类作为一个独立的模块,从而提高代码的可重用性。

                以下是一个使用封装的示例:

                class Rectangle {
                private://私有
                    int width;
                    int height;
                public://公有
                    void setWidth(int w) {
                        if (w > 0) {
                            width = w;
                        }
                    }
                    void setHeight(int h) {
                        if (h > 0) {
                            height = h;
                        }
                    }
                    int getWidth() {
                        return width;
                    }
                    int getHeight() {
                        return height;
                    }
                    int getArea() {
                        return width * height;
                    }
                };
                int main() {
                    Rectangle rect;
                    rect.setWidth(5);
                    rect.setHeight(3);
                    int area = rect.getArea();
                    cout 
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon