《好学的C++程序设计》——2.4 对数据变量怎样保护

简介:

本节书摘来自异步社区出版社《好学的C++程序设计》一书中的第2章,第2.4节,作者: 张祖浩 , 沈天晴,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.4 对数据变量怎样保护

好学的C++程序设计
对数据变量进行保护就是对变量值进行保护。就是采取措施,使得在程序运行中变量值不受改变,以保证数据的安全。这在某些场合下是需要的,可以采取如下几方面的措施。

2.4.1 可用const声明常值数据变量

若数据变量的值保持不变,则称之为常值数据变量。常值数据变量的声明形式如下:

const 数据类型  变量名=常量值;

数据类型 const 变量名=常量值;

声明中,const可以放在开头,也可以放在紧靠变量名左侧。要注意,常值数据变量在声明时一定要用常量值进行初始化。在程序中是不允许对常值数据变量赋值的,这就保证了常值数据变量在整个程序中的值是不变的。

例如,我们可以声明一个double型常值数据变量如下:

const double pi=3.1416;

常值数据变量又叫做符号常量。经上述声明后,符号“pi”就是符号常量,在程序中它就代表常量3.1416了。如果作了如上声明以后,出现如下语句,则是非法的:

pi=1.2345;   //此语句非法!对常值数据变量再作赋值,是不允许的。

2.4.2 可在声明中用const对指针和别名进行限定

用const声明常值指针变量
若指针变量的值保持不变,则称之为常值指针变量。可用const声明常值指针变量。例如,我们作一个如下的声明:

int a=6,b=8;
int *const p=&a;

这种声明的特点是const紧靠指针变量名p的左侧。const限定p的值是恒定的。也就是说,指针p的指向是恒定的。在声明时就必须对p进行初始化(例如,设置初值为&a),以后不可再进行赋值。这说明指针p指向变量a不可动摇。但对变量a的值则无任何限制。

例如,作了如上声明以后,如果出现如下语句:

p=&b;    //非法!p是常指针变量,不允许再赋值。
a=29;    //合法。const只限定p的值,而对a的值无任何限制。```  
声明常值指针变量的一般形式为:


数据类型 *const 指针变量名=常地址;

情况已如上述。记住!此声明中,const必须紧靠着指针变量的左侧。声明时要初始化。

用const声明只读指针变量
我们知道,用指针(比如p)通过指针所指(*p)可以对所指变量(比如a)进行访问。访问包括对所指变量(a)进行“读”或“写”。但在某些场合下,需要限制指针的访问功能,使得用指针所指(*p)访问所指变量(a)时,只可读而不可写。这也就是说,不允许对指针所指(*p)进行赋值(写),以便从指针方面保证数据变量值的安全。这种对指针所指限制为只可读而不可写的指针变量称之为只读指针变量。

例如,我们有如下的声明及语句:

int a=80;      //A
const int *p;    //B
p=&a;        //C

B行声明中,const位于指针变量p声明的开头。这种声明不限制p的值,也就是不限制p的指向。因此,声明时不一定非要进行初始化。可以在声明过后另赋值。例如,C行对p赋值p=&a,这使p指向了变量a。这时,指针所指*p就是所指变量a。访问*p就是访问a。

但是,B行const限制了只可用*p进行取值(读值),而不可对*p进行赋值(写值)。这意味着,不可通过指针所指*p来改变所指变量a之值。这样的p就是只读指针变量。

若要改变所指变量a之值可以通过别的途径加以改变,例如对a重新赋值a=30000,或用别名改变a的值都行。就是限定不可通过指针所指*p来改变所指变量a之值。

例如,作了上述声明和语句以后,若有下列语句:

p=500;       //此句非法!不可对p进行赋值(写)。
a=4000;       //此句合法。声明中没有对变量a作任何限制。
cout<<p<<‘n’;   //此句合法。可用p进行读值。输出a值4000。

合法或非法的原因在于,上述B行声明中const的限制,使指针所指*p只可读而不可写。

声明只读指针变量的一般形式为:

const 数据类型 * 指针变量名;

情况已如上述。记住!此声明中,const必须位于开头,使指针所指只可读而不可写。

用const声明常值只读指针变量
要声明一个既是常值又是只读的指针变量,那就是上述两种情况的结合。可以参照上述两种情况用两个const来进行限定。

声明常值只读指针变量的一般形式如下:

const 数据类型 * const 指针变量名=常地址;

开头的const限定指针变量为只读,紧靠指针变量名左侧的const限定指针变量为常值。声明时必须初始化,以后不可再赋值。

用const声明只读别名变量

用const对别名变量进行限定和对指针变量有点类似。不过,别名变量在平常声明时就初始化确定了是哪个变量的别名,以后就终身不变。因此,不用const限定,它是谁的别名就已经恒定了。现在的问题是要用const来限定它为只读别名变量,只可读而不可写。

声明的一般形式为:

const 数据类型 * 别名变量名=变量名;

const位于声明语句的开头。声明时仍必须进行初始化,以表明是谁的别名。

经此声明后,别名变量就是只读别名变量。在程序中,不可对该别名变量赋值(写值)。例如,有下列程序段:

int a=80;      //A
const int &x=a;  //B
x=2000;       //此句非法!不可对x进行赋值(写)。
a=4000;       //此句合法。声明中没有对变量a作任何限制。
cout<

可见,作了B行的声明以后,使别名变量x只可读而不可写。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
相关文章
|
9月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
207 2
|
6月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
611 12
|
10月前
|
存储 C++
UE5 C++:自定义Http节点获取Header数据
综上,通过为UE5创建一个自定义HTTP请求类并覆盖GetResult方法,就能成功地从HTTP响应的Header数据中提取信息。在项目中使用自定义类,不仅可以方便地访问响应头数据,也可随时使用这些信息。希望这种方法可以为你的开发过程带来便利和效益。
411 35
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
463 12
|
12月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
241 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
318 5
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
425 1
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
145 6
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
317 2
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
215 1