核心内容摘要
【xxxx好看wwww精彩推荐】彻底打破审美天花板!这大概是今年最值得你细细品味的佳作
提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录完整测试案例代码代码编译运行说明关键代码解释
总结你希望我为MyUniquePtr中重载的解引用运算符operator*和箭头运算符operator-编写一个完整的测试案例直观展示这两个运算符的使用方式和效果这是理解智能指针核心行为的关键完整测试案例代码我会先给出可直接编译运行的完整代码包含MyUniquePtr的完整实现带*/-重载以及针对性的测试逻辑#includeiostream#includestring// 完整的MyUniquePtr实现包含*和-重载templatetypenameTclassMyUniquePtr{public:// 普通构造接管裸指针explicitMyUniquePtr(T*ptrnullptr)noexcept:m_ptr(ptr){}// 禁用拷贝unique_ptr核心特性MyUniquePtr(constMyUniquePtr)delete;MyUniquePtroperator(constMyUniquePtr)delete;// 移动构造必须noexcept适配vectorMyUniquePtr(MyUniquePtrother)noexcept{m_ptrother.m_ptr;other.m_ptrnullptr;// 原对象置空避免重复析构}// 移动赋值MyUniquePtroperator(MyUniquePtrother)noexcept{if(this!other){// 防止自赋值deletem_ptr;// 释放当前资源m_ptrother.m_ptr;other.m_ptrnullptr;}return*this;}// 析构释放资源~MyUniquePtr()noexcept{deletem_ptr;m_ptrnullptr;}// 重载解引用运算符*ptr 访问对象本身Toperator*()constnoexcept{return*m_ptr;// 返回对象的引用支持读写const版本则返回const引用}// 重载箭头运算符ptr-func() 访问对象的成员T*operator-()constnoexcept{returnm_ptr;// 返回裸指针编译器会自动拼接-调用成员}// 辅助函数获取裸指针验证用T*get()constnoexcept{returnm_ptr;}private:T*m_ptr;// 管理的裸指针};// 测试用的业务类包含成员变量和成员函数方便测试*和-classPerson{public:// 构造函数初始化成员Person(conststd::stringname,intage):m_name(name),m_age(age){std::cout[Person构造] m_name (m_age岁)\n;}// 成员函数展示信息voidshowInfo()const{std::cout[Person信息] 姓名m_name年龄m_age\n;}// 成员函数修改年龄voidsetAge(intnew_age){m_agenew_age;std::cout[Person修改] m_name的年龄改为m_age岁\n;}// 析构函数验证资源释放~Person(){std::cout[Person析构] m_name\n;}// 公开成员变量方便测试*运算符直接访问std::string m_name;intm_age;};// 主函数测试*和-运算符intmain(){std::cout 测试1创建MyUniquePtr指向Person实例 \n;// 创建智能指针接管Person对象MyUniquePtrPersonptr(newPerson(张三,
);std::cout\n 测试2使用operator*解引用 \n;//
*ptr 访问对象本身调用成员函数(*ptr).showInfo();//
*ptr 直接修改成员变量因为返回的是引用(*ptr).m_age26;std::cout[直接修改] 年龄改为26岁后;(*ptr).showInfo();std::cout\n 测试3使用operator-箭头 \n;//
ptr- 调用成员函数更简洁的写法等价于(*ptr).func()ptr-showInfo();//
ptr- 调用修改成员的函数ptr-setAge(
;//
ptr- 直接访问成员变量std::cout[箭头访问] 姓名ptr-m_name\n;std::cout\n 测试4验证指针有效性 \n;std::cout智能指针管理的裸指针地址ptr.get()\n;std::cout解引用后的对象地址(*ptr)\n;// (*ptr) 等价于 ptr.get()std::cout箭头运算符返回的指针地址ptr.operator-()\n;std::cout\n 程序结束智能指针自动析构 \n;return0;}代码编译运行说明编译命令GCC/Clangg -stdc11 unique_ptr_test.cpp -o unique_ptr_test ./unique_ptr_test运行结果清晰展示*和-的效果 测试1创建MyUniquePtr指向Person实例 [Person构造] 张三 (25岁) 测试2使用operator*解引用 [Person信息] 姓名张三年龄25 [直接修改] 年龄改为26岁后[Person信息] 姓名张三年龄26 测试3使用operator-箭头 [Person信息] 姓名张三年龄26 [Person修改] 张三的年龄改为27岁 [箭头访问] 姓名张三 测试4验证指针有效性 智能指针管理的裸指针地址0x55f8b867e2a0 解引用后的对象地址0x55f8b867e2a0 箭头运算符返回的指针地址0x55f8b867e2a0 程序结束智能指针自动析构 [Person析构] 张三关键代码解释operator*重载返回值是T对象的引用因此*ptr可以直接操作原对象读/写加const修饰表示“调用该运算符的智能指针对象是const时也能使用”noexcept标记是因为解引用指针本身不会抛异常前提是指针非空实际使用中建议先判空比如if (ptr.get()) { ... }。
operator-重载返回值是T*裸指针编译器会自动处理ptr-showInfo()等价于(ptr.operator-())-showInfo()这是C的语法糖让智能指针的使用方式和裸指针完全一致降低学习成本同样加const和noexcept保证异常安全和const正确性。
测试逻辑(*ptr).showInfo()解引用后调用成员函数语法上必须加括号因为.的优先级高于*ptr-showInfo()箭头运算符更简洁无需括号是实际开发中最常用的写法(*ptr).m_age 26/ptr-m_age直接访问对象的成员变量验证运算符支持读写。
总结operator*重载的核心作用让智能指针支持*ptr语法直接访问所指向的对象本身返回引用支持读写operator-重载的核心作用让智能指针支持ptr-成员语法简洁访问对象的成员函数/变量返回裸指针编译器自动拼接-两个运算符的重载遵循“模拟裸指针行为”的设计原则是智能指针能替代裸指针的关键语法特性。
补充实际使用中建议给operator*增加空指针检查比如抛出异常或断言避免解引用空指针导致崩溃比如Toperator*()const{if(!m_ptr){throwstd::runtime_error(解引用空的MyUniquePtr);}return*m_ptr;}