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

news2024/11/20 21:16:40

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

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


前言

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

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


一、类的定义

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

class className
{
	// 类体:由成员函数和成员变量组成

};  // 一定要注意后面的分号

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

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

类的两种定义方式

  1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
    在这里插入图片描述
  2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::
    在这里插入图片描述

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

成员变量命名规则的建议

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

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

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

  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++中有三种访问限定符,分别是publicprotectedprivate。这些访问限定符用于控制类的成员的访问权限。

  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. protectedprivate修饰的成员在类外不能直接被访问(此处protectedprivate是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到 } 即类结束。
  5. class的默认访问权限为privatestructpublic(因为struct要兼容C)

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

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

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

在这里插入图片描述

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

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

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

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

例题

C++中structclass的区别是什么?

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

封装

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

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 << "Area: " << area << endl;
    return 0;
}

在上面的示例中,Rectangle类封装了宽度和高度两个私有成员变量,以及设置和获取这两个成员变量的公有成员函数。外部代码通过这些公有成员函数来访问和修改类的数据。

例题

在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

在这里插入图片描述
在这里插入图片描述
对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。

在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1572682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【精品教程】护网HVV实战教程资料合集(持续更新,共20节)

以下是资料目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a; 01-HW介绍.zip 02-HTTP&Burp课程资料.zip 03-信息收集_3.zip 04-SQL注入漏洞_2.zip 05-命令执行漏洞.zip 06-XSS漏洞.zip 07-CSRF.zip 08-中间件漏洞.zip 09-SSRF.zip 10-XXE.zip 11-Java反序列…

Seata(分布式事务集成测试和总结)

文章目录 1.集成测试1.集成测试正常下单1.步骤2.浏览器访问 http://localhost:10008/order/save?userId666&productId1&nums1&money1003.注意事项和细节 2.集成测试模拟异常1.步骤1.com/sun/springcloud/controller/StorageController.java 休眠12s&#xff0c;模…

【项目新功能开发篇】需求分析和开发设计

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

揭秘rmallox病毒:防范、清除、恢复一步到位!

引言&#xff1a; 随着信息技术的快速发展&#xff0c;计算机病毒已成为网络安全领域的一大难题。其中&#xff0c;rmallox病毒是近年来备受关注的一种恶意软件。本文将深入探讨rmallox病毒的特性、传播途径、防范措施、清除方法以及数据恢复技巧&#xff0c;帮助读者全面了解这…

Mac苹果电脑air/pro包含m1~m3打开app显示弹框“xxx”已损坏,无法打开。您应该将它移到废纸篓

应该是保姆级教程了&#xff1a; Mac苹果电脑air/pro包含m1~m3打开app显示弹框“xxx”已损坏&#xff0c;无法打开。您应该将它移到废纸篓。 我下载的是 Sublime Text 3 for Mac中文直装版&#xff0c;https://www.32r.com/soft/38404.html 安装后打开就gg了&#xff1a; 表现…

【图论】【分类讨论】LeetCode3017按距离统计房屋对数目

本文涉及的知识点 图论 分类讨论 本题同解 【差分数组】【图论】【分类讨论】【整除以2】3017按距离统计房屋对数目 LeetCode3017按距离统计房屋对数目 给你三个 正整数 n 、x 和 y 。 在城市中&#xff0c;存在编号从 1 到 n 的房屋&#xff0c;由 n 条街道相连。对所有 …

2024最新Notepad++下载安装教程图文步骤演示

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 文章目录 &#x1f42f;2024最新Notepad下载安装教程图文步骤演示&#x1f4dd;摘要引言正文&#x1f4d8;Notepad简介&#x1f4e5;下载Notepad&#x1f4e6;安装教程1. 获取安装…

2024HW-->Wireshark攻击流量分析

在HW中&#xff0c;最离不开的&#xff0c;肯定是看监控了&#xff0c;那么就要去了解一些wireshark的基础用法以及攻击的流量&#xff01;&#xff01;&#xff01;&#xff01; 1.Wireshark的基本用法 比如人家面试官给你一段流量包&#xff0c;你要会用 1.分组详情 对于我…

深入理解Java异常处理机制(day20)

异常处理 异常处理是程序运行过程产生的异常情况进行恰当的处理技术 在计算机编程里面&#xff0c;异常的情况比所我们所想的异常情况还要多。 Java里面有两种异常处理方式&#xff1b; 1.利用trycatchfinaly语句处理异常&#xff0c;优点是分开了处理异常代码和程序正常代码…

Android自定义view;实现掌阅打开书籍动画效果

这里利用自定义view的方式来处理&#xff0c;初始化数据&#xff0c;camera通过setLocation调整相机的位置&#xff0c;但是Camera 的位置单位是英寸&#xff0c;英寸和像素的换算单位在 Skia 中被写成了72 像素&#xff0c;8 x 72 576&#xff0c;所以它的默认位置是 (0, 0, …

STL--deque

deque 容器deque是一个双向队列&#xff08;double-ended queue&#xff09;&#xff0c;可以在队列的两端进行元素的插入和删除操作。deque 和 vector 非常相似。也采用dynamic array(动态数组) 来管理元素&#xff0c;提供随机访向&#xff0c;并有着和 vector 几乎一模一样…

jenkins+docker实现可持续自动化部署springboot项目

目录 一、前言 二、微服务带来的挑战 2.1 微服务有哪些问题 2.2 微服务给运维带来的挑战 三、可持续集成与交付概述 3.1 可持续集成与交付概念 3.1.1 持续集成 3.1.2 持续交付 3.1.3 可持续集成与交付核心理念 3.2 可持续集成优点 3.3 微服务为什么需要可持续集成 四…

anaconda虚拟环境安装apex0.1教程win10

我安装apex0.1的环境是&#xff1a;torch&#xff08;gpu&#xff09;1.8.0&#xff0c;cuda10.2&#xff0c;cuda7.6.5。 第一步&#xff1a;下载对应的pytorch、cuda、cudnn版本 这里就不详细介绍了&#xff0c;具体可以参考我的这篇博文win10中anaconda创建虚拟环境配置py…

Redis(性能管理、主从复制、哨兵模式)概述及部署

目录 一、性能管理 1、查看Redis内存使用 2、内存碎片率 3、跟踪内存碎片率 4、内存使用率 5、内回收key 二、Redis集群有三种模式 三、Redis主从复制 1、主从复制的概念 2、主从复制的作用 3、主从复制的流程 4、搭建Redis主从复制 1.环境准备 2.安装Redis&#…

如何选择和注册域名,域名有什么作用,什么是域名解析?域名的需要多少钱?

大家好欢迎来到易极赞&#xff0c;今天我们来跟大家聊一下“如何选择和注册域名”这个话题。 域名用来做什么&#xff1f; 域名对您的网站至关重要&#xff0c;因为它代表您的品牌名称并充当网站的地址。对于企业主来说&#xff0c;一个令人难忘的域名有助于建立在线形象和客户…

RabbitMQ3.13.x之七_RabbitMQ消息队列模型

RabbitMQ3.13.x之七_RabbitMQ消息队列模型 文章目录 RabbitMQ3.13.x之七_RabbitMQ消息队列模型1. RabbitMQ消息队列模型1. 简单队列2. Work Queues(工作队列)3. Publish/Subscribe(发布/订阅)4. Routing(路由)5. Topics(主题)6. RPC(远程过程调用)7. Publisher Confirms(发布者…

嵌入式Qt QGridLayout网格布局管理器

一.QGridLayout网格布局管理器 //以行为单位 设置比例系数 void QGridLayout::setRowStretch ( int row, int stretch ) //以列为单位 设置比例系数 void QGridLayout::setColumnStretch ( int column, int stretch ) 实验&#xff1a; Widget.h&#xff1a; #ifndef _WIDGE…

了解强化学习算法 PPO

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 介绍&#xff1a; PPO 算法&#xff0c;即 Proximal Policy Optimization&#xff08;近端策略优化&#xff09;&#xff0c;是一种强化学习算法。它的主要目的是改进策略梯度方法&#xff0c;使得训练…

numpy二维与三维数组简单操作示例

1.运行PowerShell然后输入python 2.在python命令行输入 import numpy as np进入导入numpy库并添加别名为np 3.使用numpy的zeros函数创建一个2行4列的全0矩阵 4.查看上面创建的全0矩阵 5.查看矩阵类型 6.使用numpy的ones函数创建一个2行4列全1的矩阵 ,并查看类型及矩阵中的数据 …

JavaScript中堆栈内存管理机制及其在深拷贝与浅拷贝场景中的应用与解析

一.堆栈的定义 1.栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。 结论&#xff1a;后进先出&#xff08;Last In First Out&#xff09;&#xff0c;简称为LIFO线性表。 栈的应用有&#xff1a;数制转换&#xff0c;语法词法分析&…