34共用数据的保护

简介: 34共用数据的保护

C++入门——60s从0到1

共用数据的保护

 

在C++中,常量是一种用于保护共享数据的完整性、可靠性和安全性的重要概念。常量是指在程序运行期间不允许被修改的值。在共用数据的情况下,使用常量可以确保数据不会被意外地修改或破坏,从而提高程序的安全性和可靠性。

 

除了变量和函数参数可以被声明为常量外,C++还支持常对象、常对象成员、指向对象的常指针、指向常对象的指针变量和对象的常引用等概念。这些概念可以帮助我们更好地保护共用数据的完整性、可靠性和安全性。

 

常对象

 

常对象是指将对象声明为常量。这意味着对象的状态不能被修改,包括对象的成员变量和成员函数。在声明常对象时,需要在类定义前加上关键字`const`。例如:

 

class MyClass {
public:
    void setValue(int value) {
        data = value; // 可以修改data成员变量
    }
    void printData() const {
        cout << data << endl; // 只能访问data成员变量,不能修改它的值
    }
private:
    int data;
};
 
const MyClass myObj; // 声明一个常对象myObj

 

在上面的代码中,我们定义了一个名为`MyClass`的类,其中包含一个私有成员变量`data`和一个公有成员函数`setValue`和`printData`。`setValue`函数用于设置`data`成员变量的值,但是由于它是可变的(没有使用关键字`const`),所以可以修改`data`的值。`printData`函数用于输出`data`成员变量的值,但是由于它是常成员函数,所以不能修改`data`的值。然后我们声明了一个名为`myObj`的常对象,并且不能调用`setValue`函数来修改它的状态。

 

常对象成员

 

常对象成员是指类的成员变量或成员函数被声明为常量。例如:

 

class MyClass {
public:
    void setValue(int value) {
        data = value; // 可以修改data成员变量
    }
    void printData() const {
        cout << data << endl; // 只能访问data成员变量,不能修改它的值
    }
private:
    int data;
};

 

const MyClass myObj; // 声明一个常对象myObj

 

在上面的代码中,我们将整个类`MyClass`声明为常类型(使用关键字`const`),这意味着所有的公有成员函数都是常成员函数,所有的私有成员变量都是常量。因此我们可以创建一个名为`myObj`的常对象,并且只能调用`printData`函数来输出`data`成员变量的值,而不能调用`setValue`函数来修改它的值。

 

指向对象的常指针

 

指向对象的常指针是指指向对象的指针被声明为常量。这意味着指针本身不能被修改,但是它所指向的对象的状态可以被修改。例如:

 

class MyClass {

public:

   void setValue(int value) {

       data = value; // 可以修改data成员变量

   }

   void printData() const {

       cout << data << endl; // 只能访问data成员变量,不能修改它的值

   }

private:

   int data;

};

 

MyClass* ptr = new MyClass(); // 创建一个普通指针ptr指向MyClass类型的对象

const MyClass* const_ptr = ptr; // 将普通指针ptr转换为指向对象的常指针const_ptr

ptr->setValue(1); // 可以调用setValue函数来修改MyClass对象的data成员变量的值

const_ptr->printData(); // 可以调用printData函数来输出MyClass对象的data成员变量的值,但不能通过const_ptr来改变MyClass对象的data成员变量的值

delete ptr; // 释放内存

```

 

在上面的代码中,我们首先创建了一个名为`ptr`的普通指针,它指向一个名为`temp`的`MyClass`类型的对象。然后我们将`ptr`转换为一个指向对象的常指针`const_ptr`。由于`const_ptr`是一个指向对象的常指针,所以它所指向的对象的状态不能被修改。然后我们调用了`setValue`函数来设置`temp`对象的`data`成员变量的值为1。最后我们调用了`printData`函数来输出`temp`对象的`data`成员变量的值。注意我们不能通过`const_ptr`来改变`temp`对象的`data`成员变量的值。最后我们释放了内存。

 

指向常对象的指针变量

 

指向常对象的指针变量是指将指向对象的指针声明为只读(即指向一个已经被赋予初值的只读变量)。例如:

class MyClass {
public:
    void setValue(int value) {
        data = value; // 可以修改data成员变量
    }
private:
    int data;
};

MyClass temp = {10}; // 创建一个普通类型的MyClass对象temp并初始化它的数据成员为10

const MyClass* ptr = &temp; // 将普通类型的MyClass对象的地址赋给指向常类型的MyClass对象的指针ptr

ptr->setValue(20); // 可以调用setValue函数来修改MyClass对象的data成员变量的值,但是不能通过ptr来改变MyClass对象的data成员变量的地址或者其他状态的属性

在上面的代码中,我们首先创建了一个名为`temp`的普通类型的`MyClass`对象并初始化它的数据成员为10。然后我们将普通类型的`temp`对象的地址赋给了指向常类型的`MyClass`对象的指针`ptr`。由于`ptr`是一个指向常类型的指针变量,所以它所指向的对象的状态不能被修改(即不能通过它来改变其他状态属性的值)。然后我们调用了`setValue`函数来设置`temp`对象的`data`数据属性的值为20。注意我们不能通过`ptr`来改变其他状态属性的值。

 

目录
相关文章
|
设计模式 算法 程序员
程序员为何需要反复修改Bug?探寻代码编写中的挑战与现实
作为开发者,我们在日常开发过程中,往往会遇到反复修改bug的情况,而且不能一次性把代码写的完美无瑕,其实开发项目是一项复杂而富有挑战性的任务,即使经验丰富的程序员也难以在一次性编写完美无瑕地完成代码,我个人觉得一次性写好代码是不可能完成的事情。虽然在设计之初已经尽力思考全面,并在实际操作中力求精确,但程序员仍然需要花费大量时间和精力来调试和修复Bug。那么本文就来分享程序员需要反复修改Bug的原因,以及在开发中所面临的复杂性与挑战。
460 1
程序员为何需要反复修改Bug?探寻代码编写中的挑战与现实
|
资源调度
There appears to be trouble with your network connection.Retrying
There appears to be trouble with your network connection.Retrying
2219 0
There appears to be trouble with your network connection.Retrying
|
Web App开发 API Windows
取接口访问者信息[IP,浏览器,操作系统]免费API接口教程
此API用于获取访问者的IP地址、浏览器和操作系统信息,支持70多种浏览器和操作系统。通过POST或GET请求至`https://cn.apihz.cn/api/ip/getapi.php`,需提供用户ID和KEY。返回结果包括状态码、消息、IP、浏览器和操作系统信息。示例:{&quot;code&quot;:200,&quot;ip&quot;:&quot;175.154.88.178&quot;,&quot;browser&quot;:&quot;Chrome&quot;,&quot;os&quot;:&quot;Windows 10&quot;}。详情见官网文档。
|
Java 测试技术 开发者
初学者入门:掌握单元测试的基础与实践
【10月更文挑战第14天】单元测试是一种软件测试方法,它验证软件中的最小可测试单元——通常是单独的函数或类——是否按预期工作。单元测试的目标是确保每个模块在其自身范围内正确无误地运行。这些测试应该独立于其他模块,并且应该能够反复执行而不受外部环境的影响。
332 2
|
5G 网络架构
已解决:树莓派外接硬盘 usb 或者sata 导致wifi无法链接 无线网卡无法使用问题
已解决:树莓派外接硬盘 usb 或者sata 导致wifi无法链接 无线网卡无法使用问题
449 4
|
缓存 监控 NoSQL
【MongoDB 专栏】MongoDB 的变更流(Change Streams)应用
【5月更文挑战第11天】MongoDB的变更流是实时监控数据库动态的机制,允许应用程序订阅并响应文档的插入、更新和删除事件。它提供实时性、灵活性和解耦性,适用于数据同步、实时通知、缓存更新等多种场景。然而,使用时需注意性能、错误处理和版本兼容性。随着技术发展,变更流将在构建智能实时系统中扮演更重要角色,为数据处理带来新机遇。
590 1
【MongoDB 专栏】MongoDB 的变更流(Change Streams)应用
|
11月前
|
运维 物联网 数据处理
TDengine vs InfluxDB:谁的“流式计算”功能是真的?
随着物联网、车联网、工业物联网等领域的快速发展,时序数据的处理需求也在不断增加。为了满足这一需求,时序数据库应运而生,为高频数据写入和实时分析提供了强有力的支持。在这一领域,TDengine 和 InfluxDB 是两大领先的解决方案。尽管两者都具有强大的时序数据处理能力,但在流式计算方面,二者存在显著差异。
274 5
|
机器学习/深度学习 算法 关系型数据库
【文献学习】DeepReceiver: A Deep Learning-Based Intelligent Receiver for Wireless Communications in the Ph
文章介绍了一种名为DeepReceiver的基于深度学习的无线通信智能接收机模型,它通过输入IQ信号并输出恢复的信息比特流,能够适应不同的调制和编码方式,在噪声、射频损伤、信道衰落等非理想条件下进行性能验证。
359 0
|
SQL 存储 安全
【SQL刷题】Day3----SQL必会的常用函数专项练习
【SQL刷题】Day3----SQL必会的常用函数专项练习
344 0
【SQL刷题】Day3----SQL必会的常用函数专项练习
|
Ubuntu Linux
【问题复盘】在Ubuntu 20.04下安装OFED驱动 复盘:在Ubuntu 20.04下安装OFED驱动
整个问题主要是由于不同的内核版本导致文件路径不同,进而导致安装过程中某些库无法按预期安装而出现问题。 为什么使用最新的OFED驱动解决了问题呢?推测是最新驱动补充了之前缺失的某些文件,因此后续安装过程能够正常进行。 例如,在OFED 5.4中,某个安装所需的文件F位于A处,但安装程序却在B处查找该文件,导致报错。而在OFED 5.8中,该安装所需的文件F被移回到B处,此时不管去哪里查找都能找到文件F,因此安装可以正常进行。
1192 0