C++类 普通智能指针以及迭代器智能指针

tempate<class T>

class shared_ptr
{
public:
    T& operator*()const
    {return *px;}
    T* operator->()const
    {return px;}
    
    shared_ptr(T* p):px(p) {}

private:
    T* px;
    long* pn;
...
}


//使用
struct Foo
{
    ....
    void method(void){}
};

shared_ptr<Foo>sp(new Foo)//在这里使用new 生成天然指针,调用构造函数,转为为智能指针,sp
Foo f(*sp); //调用operator*()
sp->method();  //相当于调用px->method();  //同时->运算符具有延续性

区别于迭代器中的智能指针
 

//比如说是双向列表 node表示迭代器
recefermer operator*()
{

    return *node->data;
}

recefermer operator*()
{

    return(&(operator*())) 
}

 

C++ 中,**智能指针本身并不是容器**,因此它们没有“迭代器”这一概念。但你可能会遇到需要对包含智能指针的容器(如 `std::vector<std::unique_ptr<T>>` 或 `std::vector<std::shared_ptr<T>>`)进行遍历的场景,这时我们使用的是**容器的迭代器**,而解引用后得到的是智能指针对象。 --- ### 回答问题:什么是“智能指针迭代器”? 严格来说,**智能指针(如 `std::unique_ptr<T>`、`std::shared_ptr<T>`)没有自己的迭代器**。 但是,当你把智能指针存储在标准容器中时(例如 `std::vector<std::shared_ptr<MyClass>>`),你可以使用该容器的迭代器来遍历这些智能指针,并通过 `*it` 或 `->` 操作符访问所指向的对象。 #### ✅ 正确理解: - “智能指针迭代器” 实际上是指 **存放智能指针的容器的迭代器**。 - 迭代器指向的是一个智能指针(如 `std::shared_ptr<T>`)。 - 解引用迭代器后,再使用 `->` 可以调用目标对象的成员函数。 --- ### 示例代码:使用迭代器遍历包含智能指针的容器 ```cpp #include <iostream> #include <vector> #include <memory> #include <string> class Person { public: explicit Person(const std::string& name) : name_(name) {} void introduce() const { std::cout << "Hello, I'm " << name_ << "\n"; } private: std::string name_; }; int main() { // 创建一个 shared_ptr 的 vector std::vector<std::shared_ptr<Person>> people; people.push_back(std::make_shared<Person>("Alice")); people.push_back(std::make_shared<Person>("Bob")); people.push_back(std::make_shared<Person>("Charlie")); // 使用迭代器遍历智能指针容器 for (auto it = people.begin(); it != people.end(); ++it) { // *it 是 std::shared_ptr<Person> (*it)->introduce(); // 调用 Person 的方法 } // 或者使用范围 for 循环(更现代的方式) std::cout << "\nUsing range-based for loop:\n"; for (const auto& person_ptr : people) { person_ptr->introduce(); } return 0; } ``` --- ### 注意事项 1. **不能对单个智能指针使用迭代器** ```cpp std::unique_ptr<int> ptr = std::make_unique<int>(42); // auto it = ptr.begin(); // ❌ 编译错误!unique_ptr 不是容器 ``` 2. **`std::vector<std::unique_ptr<T>>` 支持迭代器,但元素不可复制** - `std::unique_ptr` 禁止拷贝,所以只能移动。 - 容器操作(如 `push_back`)必须使用 `std::move`。 ```cpp std::vector<std::unique_ptr<Person>> vec; auto p = std::make_unique<Person>("Dave"); vec.push_back(std::move(p)); // 必须 move ``` 3. **迭代器失效规则与普通容器一致** - 如 `std::vector` 在扩容时会失效。 --- ### 高级技巧:自定义智能指针支持解引用操作 虽然不常见,但你可以设计一个模拟智能指针行为并重载 `operator*` 和 `operator->` 来支持迭代器的操作: ```cpp template<typename T> class MySmartPointer { T* ptr; public: explicit MySmartPointer(T* p) : ptr(p) {} ~MySmartPointer() { delete ptr; } T& operator*() const { return *ptr; } T* operator->() const { return ptr; } }; ``` 但这不是标准用法,仅用于说明原理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值