指针
我们可以使用 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 的生命周期内通过构造函数初始化,除非有成员函数直接修改它。