我在C ++编程语言书中看到了以下示例
class Ptr {
X* operator->( );
};
voide f(Ptr p)
{
p->m=7;
X* q1 = p->;
X* q2 = p.operator->();
}
这本书声称 1)类Ptr的对象可以用于以与指针使用方式非常类似的方式访问类X的成员。 2)将对象p转换为指针p.operator->()不依赖于指向的成员m。这就是operator->()是一元后缀运算符的意义。
首先,我不明白为什么我们需要这种设计,或者在哪种情况下应该使用这种设计。 对于第二点,我对作者想要传达的信息感到困惑。
感谢。
答案 0 :(得分:5)
当实现行为类似于(伪装成)指针的对象时,此运算符会过载。
一个很好的例子是boost::shared_ptr
,它是一个经典的引用计数指针,当所有指针都被销毁时它会自动删除指向的对象。由于种种原因,人们已经实施了无数其他类似的“智能指针”对象。
(并且,正如所指出的那样,stl迭代器也使用它来表现得像指针一样,允许像it->method();
或it->data;
这样的语法
答案 1 :(得分:3)
当我们想要创建一个行为像指针的类时,这个设计非常有用;这是smart pointers的情况(具有类似指针的接口但提供额外“服务”的对象,例如销毁时的自动释放,所有权转移,引用计数......)。
请注意,通常这种对象也会重载*
(取消引用)运算符,以更接近地模仿指针。
作者想说,当您在->
上使用Ptr
运算符时,它与您之后的内容无关(就operator->
而言):在任何情况下,都会调用operator->
方法,它将返回一个指向对象的指针,该对象将被考虑用于表达式的其余部分。
为了更清楚地说明:直接引用标准:
13.5.6班级成员访问
实现类成员访问
operator->
应该是不带参数的非静态成员函数。它使用->
postfix-expression -> id-expression
如果
x->m
存在并且运算符被选为最佳运算符,则表达式(x.operator->())->m
将被解释为x
类T
类对象T::operator->()
通过重载解析机制匹配函数(13.3)。
换句话说:
operator->()
(OP代码中的第二个和第三个示例),您将获得operator->
方法返回的指针,就像任何方法一样; ->
运算符之后(例如x->m
,就像OP代码中的第一个例子一样),将调用重载的operator->
,返回的指针将会被用作好像->m
被用在它上面。答案 2 :(得分:2)
迭代器 ...... C++ standard library
的基本部分。
std::list<std::string> list_of_string
std::list<std::string>::iterator i;
for(i = list_of_string.begin(); i != list_of_string.end(); ++i)
{
//WHERE -> IS OVERLOADED...
printf("%s\n", i->c_str()); //print to the screen, printf() is C and requires a C-string.
}
通常,i
应被视为std::list<>
对象,而不是std::string
。通常c_str()
也无法访问,没有 - &gt;超载。
答案 3 :(得分:1)
它允许创建智能指针。 (与正常指针一样的小物体)
主要原因是自动内存管理。但也可用于代理
之类的东西