指针

时间:2024-03-12 20:26:49

我们可以使用 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&。