高程 | 数据的共享与保护(c++)

文章目录

  • 📚标识符的作用域与可见性
    • 🐇作用域
    • 🐇可见性
  • 📚对象的生存期
    • 🐇静态生存期
    • 🐇动态生存期
  • 📚类的静态成员
    • 🐇静态数据成员
    • 🐇静态函数成员
  • 📚类的友元
  • 📚共享数据的保护

📚标识符的作用域与可见性

🐇作用域

  • 作用域是一个标识符在程序正文中有效的区域。
  • ⭐️函数原型作用域
    • 是C++程序中最小的作用域。
    • 在函数原型声明时形参的作用范围就是函数原型的作用域。
    • double area (double radius) //标识符radius的作用在area形参列表的左右括号之间。
  • ⭐️局部作用域
    • 函数形参列表中形参的作用域,从形参列表中的声明处开始,到整个函数体结束之处为止;
    • 函数体内声明的变量,其作用域从声明处开始,一直到声明所在的块结束的大括号为止;
    • 具有局部作用域的变量也称为局部变量。
  • ⭐️类作用域
    • 类可以被看成是一组有名成员的集合,类X的成员m具有类作用域,对m的访问方式有三种
      • 如果X的成员函数中没有声明同名的局部作用域标识符,那么在该函数内可直接访问成员m;
      • 通过表达式 x.mX::m。这是程序中访问对象成员的最基本方法;
      • 通过 ptr->m这样的表达式,其中ptr为指向X类的一个对象的指针。
  • ⭐️命名空间作用域:具有命名空间作用域的变量也称全局变量。

🐇可见性

  • 程序运行到某一点,能够引用到的标识符,就是该处可见的标识符。
  • 可见性规则
    • 声明在前,使用在后。
    • 同一作用域中,不能声明同名的标识符。
    • 在没有互相包含关系的不同作用域中声明的同名标识符互不影响。
    • 在两个或多个具有包含关系的作用域中声明同名标识符,则外层标识符在内层不可见。
      在这里插入图片描述

📚对象的生存期

🐇静态生存期

  • 如果对象的生存期与程序运行期相同,则称它具有静态生存期。
    • 在命名空间作用域中声明的对象都具有静态生存期。
    • 如果要在函数内部作用域中声明具有静态生存期的对象要用关键字static
    • 局部作用域中静态变量特点:不会随着每次函数调用而产生一个副本,也不会随着函数返回而失效。

🐇动态生存期

  • 除了上述两种情况,其余对象都具有动态生存期。
  • 在局部作用域中声明具有动态生存期的对象,也称局部生存期对象。
  • 局部生存期对象诞生于声明点,结束于声明所在的块执行完毕之时。

📚类的静态成员

  • 类的静态成员用来解决一个类的不同对象之间数据和函数共享问题

🐇静态数据成员

  • 若某个属性为整个类所共有,不属于任何一个具体对象,则采用static关键字来声明为静态成员。
  • 类属性是描述类的所有对象共同特征的一个数据项,对于任何对象实例,它的属性值是相同的。
  • 静态数据成员具有静态生存期。
  • 由于静态数据成员不属于任何一个对象,因此可通过类名对它进行访问,类名::标识符
  • 之所以类的静态数据成员需要在类定义之外再加定义,是因为需要以这种方式专门为它们分配空间。非静态数据成员无须以此方式定义,因为它们的空间是与它们所属对象的空间同时分配的。

🐇静态函数成员

  • 使用static关键字声明的函数成员。
  • 静态函数成员可以通过类名或对象名来调用,而非静态成员函数只能通过对象名来调用(一般习惯于通过类名调用。即使通过对象名调用,起作用的也只是对象的类型信息,与使用的具体对象无关)。
  • 静态成员函数可以直接访问该类的静态数据和函数成员。而访问非静态成员,必须通过对象名。

📚类的友元

  • 友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。
  • 在一个类中,可以利用关键字friend将其他函数或类声明为友元。
  • 如果友元是一般函数或类的成员函数,称为友元函数;如果友元是一个类,则称为友元类,友元类的所有成员函数都自动成为友元函数。
  • 友元函数
    • 是在类中用关键字friend修饰的非成员函数。
    • 虽然不是本类的成员函数,但是在它的函数体中可以通过对象名访问类的私有和保护成员。
  • 友元类
    • 若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。
  • ⚠️注意
    • 友元关系不能传递
    • 友元关系是单向的
    • 友元关系不被继承

📚共享数据的保护

  • 常对象
    • 它的数据成员值在对象的整个生存期内不能被改变。即:常对象必须进行初始化,而且不能被更新
    • 声明常对象: const 类型说明符 对象名;
  • 用const修饰的类成员
    • ⭐️常成员函数类型说明符 函数名 (参数表)const;
      • const是函数类型的一个组成部分,因此在函数的定义部分也要带const关键字。
      • 如果将一个对象说明为常对象,则通过该常对象只能调用它的常成员函数,而不能调用其他函数。
      • 无论是否通过常对象调用常成员函数,在常成员函数调用期间目的对象都被视为常对象,因此常成员函数不能更新目的对象的数据成员,也不能针对目的对象调用该类中没有用const修饰的成员函数
        在这里插入图片描述
    • ⭐️常数据成员:构造函数对该数据成员进行初始化,就只能通过初始化列表。
    • ⭐️常引用
      • 在声明引用时用const修饰,常引用所引用的对象不能被更新。
      • const 类型说明符 &引用名;
      • 非const的引用只能绑定到普通对象;但常引用可以绑定到(非)常对象,无论绑定哪一种引用后只能把对象当常对象。

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

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

相关文章

你的电脑关机吗

目录 程序员为什么不喜欢关电脑? 电脑长时间不关机会怎样? 电脑卡顿 中度风险 硬件损耗 能源浪费 散热问题 软件问题 网络安全问题 程序员为什么不喜欢关电脑? 大部分人都会选择将电脑进行关机操作。其实这不难理解,毕竟人类都需要…

MyBatis篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、MyBatis 实现一对一有几种方式?具体怎么操作的?二、MyBatis 实现一对多有几种方式,怎么操作的?三、Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?四、Mybatis 的一级、二级缓存前言 前些天发现了一个巨牛的人工智能…

每日一题 KY11 二叉树遍历

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后&…

【数据库_MySQL】MySQL彻底卸载

程序员为什么不喜欢关电脑? 你是否注意到,程序员们似乎从不关电脑?别以为他们是电脑上瘾,实则是有他们自己的原因!让我们一起揭秘背后的原因,看看程序员们真正的“英雄”本色! 卸载 要是你的…

【机器学习案例3】从科学论文图片中提取标题、作者和摘要【含源码】

在这个项目中,我的目标是从科学论文图片中提取某些部分(标题、作者和摘要)。预期提取部分是科学论文中常见的部分,例如标题、摘要和作者。输入与最终结果。我的输入是将第一页纸转换成图像。最终结果是一个 txt 文件,其中包含标题、作者和摘要部分,如下图1和图2所示。我将…

SpringBoot整合第三方技术-缓存

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈,…

每日OJ题_递归①_力扣面试题 08.06. 汉诺塔问题

目录 递归算法原理 力扣面试题 08.06. 汉诺塔问题 解析代码 递归算法原理 递归算法个人经验:给定一个任务,相信递归函数一定能解决这个任务,根据任务所需的东西,给出函数参数,然后实现函数内容,最后找出…

CodeForces Round 925 Div.3 A-F 题解

文章目录 A题目AC Code: B题目AC Code: C题目AC Code: D题目AC Code: E题目AC Code: F题目AC Code: A 题目 此题尽量让后面的更大,前面的更小。 我们尽量让第 3 3 3 位更大,如果…

AI定胜负?微软云Azure规模“快速赶上”亚马逊云AWS

AI技术搅动云计算格局。 据媒体报道,有分析数据表示,微软Azure云业务规模已经达到亚马逊AWS云业务规模的四分之三,而在五年前,Azure规模仅为AWS的一半。 得益于人工智能热潮和与Open AI的合作,微软Azure云业务最新财…

冒泡排序平均需要跑多少趟:拉马努金Q函数初探

摘要: 拉马努金Q函数在算法分析中的应用,初步体验 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】 我的网站:潮汐朝夕的生活实验室 我的公众号:算法题刷刷 我的知乎&#x…

100条经典C语言题第一天(1-10)

准备复习一下C语言,刷一些和面试相关的问题。 请填写 bool, float, 指针变量 与 “零值”比较的if语句 A.Bool flag 与 “零值”比较的if语句 1为true 0为false 分析 这里的flag 是布尔类型的变量 标准…

YOLOv5改进 | 一文汇总:如何在网络结构中添加注意力机制、C3、卷积、Neck、SPPF、检测头

一、本文介绍 本篇文章的内容是在大家得到一个改进版本的C3一个新的注意力机制、或者一个新的卷积模块、或者是检测头的时候如何替换我们YOLOv5模型中的原有的模块,从而用你的模块去进行训练模型或者检测。因为最近开了一个专栏里面涉及到挺多改进的地方,不能每篇文章都去讲…

linux内核原理--用户态线性地址空间,mmap,malloc,缺页异常

1.概述 前面我们介绍了内核态线性地址空间划分,及在内核态运行时,如何利用伙伴系统完成连续可用物理页框申请和释放。如何利用小块内存分配器实现高效的动态内存分配和释放。如何利用vmalloc,vfree完成线性地址连续但物理地址不连续的多个页框…

什么是 Flet?

什么是 Flet? Flet 是一个框架,允许使用您喜欢的语言构建交互式多用户 Web、桌面和移动应用程序,而无需前端开发经验。 您可以使用基于 Google 的 Flutter 的 Flet 控件为程序构建 UI。Flet 不只是“包装”Flutter 小部件,而是…

Socket.D 开源输传协议的集群转发特性

1、简介 Socket.D 是基于"事件"和"语义消息""流"的网络应用层协议。底层可以依赖 TCP、UDP、KCP、WebSocket 等传输层协议。其开发背后的动机是用开销更少的协议取代超文本传输协议(HTTP),HTTP 协议对于许多任务(如微服务通信)来说效…

paddlepaddle 2.6版本在WSL2环境中如何使用NVIDIA显卡运行神经网络

paddlepaddle 2.6版本发布后,官网上可以使用NVIDIA cuda 12.x进行机器学习了,训练神经网络的效率大为提升。因为是在wsl2环境中安装,不是纯正的linux环境,其中一些小问题需要注意。 使用conda 安装飞浆,wsl2中安装了c…

上位机图像处理和嵌入式模块部署(上位机主要功能)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 目前关于机器视觉方面,相关的软件很多。比如说商业化的halcon、vision pro、vision master,当然也可以用opencv、pytorch自…

使用 Chainlit, Langchain 及 Elasticsearch 轻松实现对 PDF 文件的查询

在我之前的文章 “Elasticsearch:与多个 PDF 聊天 | LangChain Python 应用教程(免费 LLMs 和嵌入)” 里,我详述如何使用 Streamlit,Langchain, Elasticsearch 及 OpenAI 来针对 PDF 进行聊天。在今天的文章中&#xf…

ArrayList 与 LinkedList 区别

serialVersionUID 有什么作用? serialVersionUID 是 Java 序列化机制中的一个重要概念,它用于确保反序列化对象与序列化对象保持兼容。当一个类实现 java.io.Serializable 接口时,可以通过定义一个名为 serialVersionUID 的静态常量来指定该…