C++数据的共享和保护
1、函数原型作用域:C++中最小的作用域
①在函数原型声明时,形参的作用范围就是函数原型作用域。
2、局部作用域/块作用域

3、类作用域
类可以被看做是一组有名成员的集合,类X的成员m具有类作用域,对m的访问方式有如下三种:
①如果在X的成员函数中,没有声明同名的局部作用域标识符,那么在该函数内可以直接访问成员m
②通过表达式X.m或X::m(访问静态成员变量)访问。
③通过ptr→m这样的表达式,ptr为指向X类的一个对象的指针
对象的成员函数具有类作用域
4、文件作用域
eg:全局变量

5、限定作用域的enum枚举类
定义限定作用域的枚举类型的方式是enum class{...},即多了class或struct限定符,此时枚举元素的名字遵循类作用域,在枚举类型的作用域外是不可访问的。相反,在不限定作用域的枚举类型中,枚举元素的作用域与枚举类型本身的作用域相同。

6、可见性
①如果在两个或多个具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见。
7、对象的生存期
①静态生存期
- 如果对象的生存期与程序的运行期相同,我们称它具有静态生存期。
- 使用static可以在函数内部的局部作用域中声明具有静态生存期的对象
- 局部作用域中静态变量的特点:当一个函数返回后,下一次再调用时,该变量还会保持上一回的值,即使发生了递归调用,也不会为该变量建立新的副本,该变量会在各次调用间共享。
- 定义静态变量的同时可以为它赋初值,只有第一次调用时赋值语句才生效。
- 定义时未指定初值的基本类型静态生存期变量,会被以0值初始化
②动态生存期
8、静态数据成员
static的作用域为类
①static关键字可以实现同一类的不同对象之间的数据共享,静态数据成员具有静态生存期
②由于静态数据成员不属于任何一个对象,因此可以通过类名对它进行访问,一般的用法是“类名::标识符”
③在类的定义中仅仅对静态数据成员进行引用性声明,必须在文件作用域的某个地方使用类名限定进行定义性声明,这时也可以进行初始化
④C++11标准支持常量表达式类型修饰(constexpr,const)的静态常量在类内初始化,此时仍可在类外定义该静态成员,但不能做再次初始化操作。
【注】之所以类的静态数据成员需要在类定义之外再加以定义,是因为需要以这种方式专门为它们分配空间。非静态数据成员无须以此方式定义,因为它们的空间是与它们所属对象的空间同时分配的。
9、静态函数成员
①在静态函数成员中访问类的非静态成员需要指明对象,因为对静态成员函数的调用是没有目的对象的

10、传对象参数时,习惯传引用,传引用可以降低开销
11、友元:提供不同类或对象之间的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制
①从一定程度上讲,友元是对数据隐蔽和封装的破坏
②在一个类中,可以利用关键字friend将其他函数或类声明为友元。
③三点友元声明
- 友元关系是不能传递的
- 友元关系是单向的
- 友元关系是不能被继承的。(理解:别人信任你,不见得信任你的孩子)
12、友元函数:在类中用friend修饰的非成员函数
①虽然友元函数不是本类的成员函数,但是在它的函数体中可以通过对象名访问类的私有和保护成员。

②友元函数不能通过对象调用【因为友元函数不是类的成员函数,不属于该类】
③友元函数必须在参数表中显示地指明要访问的对象,而成员函数则在它的对象上操作
13、友元类
①若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。
14、常对象
①常对象的数据成员的值在对象的整个生存期内不能被改变。
②常对象必须进行初始化,而且不能被更新。

15、用const修饰的类成员
①常成员函数:使用const修饰的函数为常成员函数,常成员函数声明的格式如下:

【注1】const是函数类型的一个组成部分,因此在函数的定义部分也要带const关键字
【注2】如果将一个对象说明为常对象,则通过该常对象只能调用它的常成员函数,而不能调用其他成员函数
【注3】无论是否通过常对象调用常成员函数,在常成员函数调用期间,目的对象都被视为常对象,因此常成员函数不能更新目的对象的数据成员,也不能针对目的对象调用该类中没有用const修饰的成员函数
【注4】const关键字可以用于对重载函数的区分

如果仅以const关键字区分对成员函数的重载,那么通过非const的对象调用该函数,两个重载的函数都可以与之匹配,这时编译器将选择最近的函数——不带const关键字的函数

②常数据成员
- 构造函数对常数据成员进行初始化,只能通过初始化列表
- 类成员中的常静态变量和常量都应当在类体之外加以定义,C++中规定:类的静态常量如果具有整数类型或枚举类型,那么可以直接在类定义中为它指定常量值

16、常引用
①如果在声明引用时用const修饰,被声明的引用就是常引用。常引用所引用的对象不能被更新。常引用的声明形式如下:

②非const的引用只能绑定到普通的对象,而不能绑定到常对象,但常引用可以绑定到常对象
③一个常引用,无论绑定到一个普通对象,还是常对象,通过该引用访问该对象时,都只能把该对象当作常对象。
17、多文件结构和编译预处理命令
①通常一个项目至少划分为3个文件:类定义文件(.h文件)、类实现文件(.cpp文件)、类使用文件(*.cpp,注函数文件)
18、静态函数成员的访问

C++数据的共享和保护的更多相关文章
- 我的C++笔记(数据的共享与保护)
*数据的共享与保护: * .作用域: * 作用域是一个标识符在程序正文中有效的区域.C++中标识符的作用域有函数原型作用域.局部作用域(块作用域).类作用域和命名空间作用域. * ().函数原型作用域 ...
- C/C++基础知识总结——数据的共享与保护
1. 标识符的作用域与可见性 1.1 作用域 标识符的作用域包括:函数原型作用域.局部作用域.类作用域.命名空间作用域 (1) 函数原型作用域:函数的参与的作用域就是从函数的开始到结束 (2) 局部作 ...
- 清华大学《C++语言程序设计基础》线上课程笔记03---数据的共享和保护&数组
数据的共享和保护 对象的生存期 static类型的局部变量,生存期在整个程序,局部可见. void example() { static a=1; int b=2 } 当调用完example函数后,b ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(33)-数据验证共享
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(33)-数据验证共享 注:本节阅读需要有MVC 自定义验证的基础,否则比较吃力 一直以来表单的验证都是不可 ...
- ie页面数据导入共享版
为了解决自动输入号码的正确率,原来的版本一直采用鼠标检测的方法.但是这个方法在其他ie平台的使用不太方便.于是直接检测ie的方法.现在的这个版本完全不需要鼠标的检测.方便而且快速精准可靠. 经过作者的 ...
- java 使用volatile实现线程数据的共享
java 使用volatile实现线程数据的共享 直接上代码看效果: public class VolatileTest extends Thread { private volatile boole ...
- 频繁的或者大范围的来实现数据的共享要使用Vuex
一. Vuex 概述 1.1 组件之间共享数据的方式 由于使用频繁,通常将v-bind:属性名=" "的格式简写成:属性名=" ".兄弟组件之间的共享即不相干组 ...
- EF Core利用Transaction对数据进行回滚保护
What? 首先,说一下什么是EF Core中的Transaction Transaction允许以原子方式处理多个数据库操作,如果事务已提交,则所有操作都应用于数据库,如果事务回滚,则没有任何操作应 ...
- Python多进程-进程间数据的共享
不同的进程不能同时修改一份数据,但是不同的进程能对一份数据进行修改 可通过Manager来实现进程间的数据共享 # -*- coding:utf-8 -*- __author__ = "Mu ...
- 大数据freestyle: 共享单车轨迹数据助力城市合理规划自行车道
编者按:近年来,异军突起的共享单车极大地解决了人们共同面临的“最后一公里”难题,然而,共享单车发展迅猛,自行车道建设却始终没有能够跟上脚步.幸运的是摩拜单车大量的轨迹数据为我们提供了一种新的思路:利用 ...
随机推荐
- Slort pg walkthrough Intermediate window
nmap ┌──(root㉿kali)-[~] └─# nmap -p- -A -sS 192.168.226.53 Starting Nmap 7.94SVN ( https://nmap.org ...
- 解密prompt系列47. O1 Long Thought的一些特征分析
之前我们花很多章讨论过思维链,包括思维链的 组织结构,例如Self-Consistency,TOT,TOMT, GOT,AOT,POT 编排方式,例如Plan-and-Slove,Least-to-m ...
- 极客时间《Redis核心技术与实战》阅读笔记
极客时间<Redis核心技术与实战>阅读笔记 数据结构 为了实现从键到值的快速访问,Redis 使用了一个哈希表来保存所有键值对. 哈希桶中的元素保存的并不 ...
- js脚本实现文本文件格式批量转换
问题: 在Windows环境下,从某些软件中导出的文本格式的数据,选择了默认的ANSI格式.双击打开数据文件后,一切正常,没乱码问题.但是为什么自己的代码里,先按照ANSI格式打开,在转换为UTF8, ...
- H5调用手机拨打电话的功能
里面加上: 我没有写也是可以的 <meta name="format-detection" content="telephone=yes"/> 该标 ...
- Zabbix Server 5.0 安装及Zabbix5.2 一键部署脚本
zabbix 5.0 安装部署 1.关闭防火墙和selinux,安装repository源 [1]关闭防火墙,SELINUX firewall-cmd --state #查看默认防火墙状态,关闭后显示 ...
- 安川机器人U轴减速机 HW9381465-C维修具体细节
安川机器人U轴减速机 HW9381465-C的维修是一个相对复杂的过程,涉及到多个部件的检查.维修和更换.以下是一些具体细节: 1.故障诊断: · 对安川机器人U轴减速机 HW9381465-C进行彻 ...
- docker - [07] 部署ES+Kibana
思考问题:以后在Tomcat部署项目,如果每次都要进入容器会十分麻烦,是否可以在容器外部提供一个映射路径,webapps,在外部放置项目,自动同步到容器内部? 一.启动es docker run -d ...
- C#中对面向standard2.0、standard2.1的项目进行单元测试
单元测试项目的目标框架 (TargetFramework或TargetFrameworks) 不能是standard2.0或standard2.1. 这是因为.NET Standard只是一个规范,它 ...
- 08_使用python 内置 json 实现数据本地持久化
使用python 内置 json 实现数据本地持久化 四个json函数 函数 json.load() 将本地json数据文件读取出来,并以列表形式返回从文件对象中读取 JSON 格式的字符串,并将其反 ...