C++ 重载操作符之一(指针运算符*,->)

本文介绍了一个模板类`MyPtr`的设计,该类重载了指针运算符*和->,并通过实例演示了如何使用这些运算符来访问指向的对象成员。展示了通过智能指针访问对象的不同方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



//重载指针运算符*,->
#include <iostream>
using namespace std;


template<class T>
class MyPtr
{
private:
	T * m_ptr;
public:
	MyPtr(T* ptr = NULL) :m_ptr(ptr){}
	T& operator*()const
	{
		return *m_ptr;
	}
	//重载箭头
	T * operator->()
	{
		return m_ptr;
	}
};
struct Alienware
{
	void Show()
	{
		cout << "i am Alienware" << endl;
	}
};
int main()
{
	MyPtr<Alienware> m(new Alienware());
	m->Show();
	m.operator->()->Show();//m.operator->()返回指针

	m.operator*().Show();//m.operator*()返回对象
	(*m).Show();
	


	return 0;
}


<think>好的,我现在需要回答用户的问题:为什么运算符 -> 或 ->* 可以应用于 struct Book 类型而不是指针类型,以及它们在C++中的应用原理。首先,我得回忆一下C++中结构体和运算符的相关知识。 用户提到的->和->*运算符,通常用于指针访问对象的成员。比如,如果有一个指向结构体的指针ptr,那么ptr->member就是访问该指针所指向的结构体的成员。但用户的问题是,为什么这些运算符可以用于结构体类型本身,而不是指针类型。这似乎和常规用法相反,可能需要进一步分析。 根据引用[5],C++中的struct和class非常相似,成员默认是public的。可能结构体对象本身可以重载运算符?比如,如果结构体Book重载了operator->,那么当使用对象实例时,->操作符就会调用该重载的方法。这可能是一个方向。 另外,->*运算符用于指向成员的指针,比如有一个成员变量指针,可以通过对象指针->*来访问。但如果是结构体对象本身,可能需要看是否有相关的运算符重载。 我需要确认C++运算符重载的规则。例如,operator->在重载时,必须返回一个指针类型,或者另一个重载了operator->的对象,这样编译器会递归调用直到得到一个指针。例如,智能指针通常重载operator->来提供类似指针的行为。 假设用户定义了一个struct Book,并且该结构体重载了operator->,那么当使用Book对象时,obj->member实际上会调用obj.operator->(),然后获取一个指针,再访问member。这种情况下,即使obj不是指针,也能使用->运算符。 同样,->*运算符可以重载,用于处理成员指针。例如,如果有一个指向Book成员的指针,可以通过对象和->*来访问,但需要结构体支持这样的操作符重载。 不过,常规情况下,->是用于指针的,如果结构体没有重载这些运算符,直接对对象使用会导致编译错误。因此,用户的问题可能是在特定情况下,比如结构体内部有运算符重载,或者用户误解了某些代码。 需要检查用户提供的引用内容。在引用[2]中,提到了结构指针的例子,(*him).first等价于him->first,这说明->用于指针访问成员。引用[5]提到struct可以包含成员函数,所以可能用户遇到的结构体Book有重载operator->的情况。 总结:当结构体Book重载了operator->或operator->*时,即使对象不是指针,也可以使用这些运算符运算符重载使得对象表现得像指针一样,编译器会自动调用相应的重载方法。</think>在C++中,运算符`->`和`->*`通常用于指针类型访问成员或成员指针,但在某些情况下也可直接应用于`struct Book`类型的对象。其核心原理是**运算符重载**和**成员指针的访问规则**。以下是具体分析: --- ### 1. **运算符 `->` 的应用原理** - **常规用法**:`->`用于指针类型访问成员,例如: ```cpp struct Book { int pages; }; Book* ptr = new Book; ptr->pages = 100; // 通过指针访问成员 ``` - **应用于非指针类型**: 若`struct Book`重载了`operator->`,则对象可直接使用`->`: ```cpp struct Book { int pages; Book* operator->() { return this; // 返回指针,使对象支持->操作 } }; Book book; book->pages = 100; // 实际调用book.operator->()->pages ``` 编译器会将`book->pages`解析为`book.operator->()->pages`,最终通过返回的指针访问成员[^5]。 --- ### 2. **运算符 `->*` 的应用原理** - **常规用法**:`->*`用于指针类型结合成员指针访问数据: ```cpp struct Book { int pages; }; int Book::*ptr = &Book::pages; // 定义成员指针 Book* obj = new Book; obj->*ptr = 100; // 通过指针和成员指针赋值 ``` - **应用于非指针类型**: 若`struct Book`重载了`operator->*`,则对象可直接使用`->*`: ```cpp struct Book { int pages; int operator->*(int Book::*mp) { return this->*mp; // 返回成员指针指向的值 } }; Book book; int Book::*ptr = &Book::pages; book->*ptr = 100; // 实际调用book.operator->*(ptr) ``` 需注意,`->*`的重载需严格匹配成员指针类型。 --- ### 3. **关键区别:运算符重载 vs 默认行为** - **指针类型**:`->`和`->*`的默认行为是直接访问指针指向的成员。 - **非指针类型**:需通过重载运算符实现类似功能,本质上是对对象行为的扩展[^5]。 --- ### 代码示例 ```cpp #include <iostream> struct Book { int pages; // 重载 operator-> Book* operator->() { return this; } // 重载 operator->* int& operator->*(int Book::*mp) { return this->*mp; } }; int main() { Book book; book->pages = 200; // 调用 operator->() std::cout << book.pages << std::endl; // 输出 200 int Book::*ptr = &Book::pages; book->*ptr = 300; // 调用 operator->*() std::cout << book.pages << std::endl; // 输出 300 return 0; } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值