c++中利用指针或应用如何安全的获取数据

指针

我们可以使用 std::shared_ptr 来表示一个指向常量的共享指针,这样用户就不能通过这个指针修改数据。

#include <iostream>  
#include <memory> // 包含智能指针的定义  
  
class hhhh {  
public:  
    hhhh(int h) : myNumber(h) {}  
  
    // 使用智能指针返回一个指向常量的指针  
    std::shared_ptr<const int> getData() const {  
        return std::shared_ptr<const int>(&myNumber, [](const int*){}); // 使用自定义删除器,防止删除内部成员  
    }  
  
    // 可以添加一个获取数据的简单方法,返回值的引用  
    int getDataValue() const {  
        return myNumber;  
    }  
  
private:  
    int myNumber;  
};  
  
int main() {  
    int myNumber = 123;  
      
    // 使用 std::unique_ptr 动态创建 hhhh 的实例  
    std::unique_ptr<hhhh> h = std::make_unique<hhhh>(myNumber);  
      
    // 获取智能指针并打印数据  
    auto dataPtr = h->getData();  
    std::cout << "通过函数返回的智能指针获取的数据: " << *dataPtr << std::endl;  
      
    // 或者使用简单的方法获取并打印数据  
    int dataValue = h->getDataValue();  
    std::cout << "通过简单方法获取的数据: " << dataValue << std::endl;  
      
    // 当 h 超出范围时,它会自动删除 hhhh 的实例  
    return 0;  
}

关于 getData 方法返回 std::shared_ptr 的部分,我仍然认为这不是一个好的实践,因为 myNumber 是 hhhh 类的一个成员,而不是一个动态分配的对象。更好的做法是直接提供一个访问器方法(如 getDataValue),或者如果需要,返回一个指向常量的引用 const int&。

引用

最常用

#include <iostream>  

class hhhh {
public:
    hhhh(int h) : myNumber(h) {}

    // 返回一个指向内部成员myNumber的常量引用  
    //const int& getData() const {
    //    return myNumber;
    //}
    void getData(int&h){
        h=myNumber;
    }

//private:
    int myNumber;
};

int main() {
    int myNumber = 123;
    hhhh h(myNumber);

    // 获取数据并打印  
    //const int& cc = h.getData(); // 使用常量引用获取数据  
    //cc = 100;
    int bb;
    h.getData(bb);
    bb = 100;

    std::cout << "通过函数返回的数据: " << h.myNumber << std::endl;

    return 0;
}
//

h.myNumber 同样没有被改变,原因与智能指针无关,而是因为你修改的是局部变量 bb 而不是 h.myNumber。getData 函数通过引用参数 h 返回了 myNumber 的值,并将其存储在 bb 中。然后,你修改了 bb 的值为 100,这并不影响 h.myNumber 的值。h.myNumber 保持不变,因为它是一个独立的变量,其值只在对象 h 的生命周期内通过构造函数初始化,除非有成员函数直接修改它。

相关推荐

  1. c++利用指针应用如何安全获取数据

    2024-03-10 11:44:03       21 阅读
  2. 如何安全进行数据获取!!

    2024-03-10 11:44:03       9 阅读
  3. 如何利用技术手段获取全球公开网站上数据

    2024-03-10 11:44:03       19 阅读
  4. 如何利用R语言获取worldclim30s气候数据

    2024-03-10 11:44:03       14 阅读
  5. C++指针、引用和数组

    2024-03-10 11:44:03       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 11:44:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 11:44:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 11:44:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 11:44:03       18 阅读

热门阅读

  1. 学习方法 学习态度

    2024-03-10 11:44:03       22 阅读
  2. Unity3D XML与Properties配置文件读取详解

    2024-03-10 11:44:03       20 阅读
  3. Centos / RedHat 安装 Redis 、MinIO、Zookeeper、Kafka

    2024-03-10 11:44:03       21 阅读
  4. Linux安装Whisper-Jax

    2024-03-10 11:44:03       22 阅读
  5. 高维多元中介分析:另外8种方法

    2024-03-10 11:44:03       24 阅读
  6. C++设计模式-设计模式简述

    2024-03-10 11:44:03       22 阅读
  7. 10个与TensorFlow相关的练习题及答案

    2024-03-10 11:44:03       20 阅读
  8. 各种测试用例、测试难点

    2024-03-10 11:44:03       20 阅读
  9. Rust的Linfa和Polars库进行机器学习

    2024-03-10 11:44:03       24 阅读
  10. 数据结构---C语言版 408 2019-41题代码版

    2024-03-10 11:44:03       22 阅读
  11. vue 下拉选择框点击外部关掉下拉弹框

    2024-03-10 11:44:03       26 阅读
  12. 2024 年 React学习笔记(一)

    2024-03-10 11:44:03       21 阅读