我很擅长使用C ++。我以前处理过Java和ActionScript,但现在我想学习这种强大的语言。由于C ++授予程序员显式使用指针的能力,因此我对使用箭头成员运算符感到困惑。这是我尝试编写的示例代码。
main.cpp中:
#include <iostream>
#include "Arrow.h"
using namespace std;
int main()
{
Arrow object;
Arrow *pter = &object;
object.printCrap(); //Using Dot Access
pter->printCrap(); //Using Arrow Member Operator
return 0;
}
Arrow.cpp
#include <iostream>
#include "Arrow.h"
using namespace std;
Arrow::Arrow()
{
}
void Arrow::printCrap(){
cout << "Steak!" << endl;
}
在上面的代码中,它所做的只是使用两种方法(点和箭头)打印牛排。
简而言之,在使用C ++编写实际应用程序时,何时使用箭头符号?由于我以前的编程经验,我习惯使用点符号,但箭头对我来说是全新的。
答案 0 :(得分:5)
在C中,a->b
恰好等同于(*a).b
。引入“箭头”符号是为了方便;通过指针访问结构的成员是相当常见的,箭头表示法更容易编写/输入,通常也被认为更具可读性。
C ++也增加了另一个皱纹:operator->
/ struct
可以重载class
。虽然相当不寻常,但这样做对于智能指针类来说很常见(几乎是必需的)。
这本身并不常见:C ++允许绝大多数运算符被重载(尽管有些应该,例如operator&&
,operator||
和{ {1}})。
不寻常的是如何解释重载的operator,
。首先,虽然operator->
看起来像a->b
是二元运算符,但当你在C ++中重载它时,它被视为一元运算符,因此正确的签名是->
,而不是T::operator()
或者那个订单上的东西。
结果也有些异常。假设T::operator(U)
是某种类型的对象,其重载foo
,operator->
被解释为foo->bar
。反过来,这会限制重载(f.operator->())->bar
的返回类型。具体来说,它必须返回另一个类的实例,它也会重载operator->
(或对这样一个对象的引用),否则它必须返回一个指针。
在前一种情况下,一个看起来很简单的operator->
实际上可能意味着“追逐”整个(任意长的)对象实例链,每个对象重载foo->bar
,直到最后一个到达时可以引用名为operator->
的成员。对于一个(不可否认的极端)例子,考虑一下:
bar
即使#include <iostream>
class int_proxy {
int val;
public:
int_proxy(): val(0) {}
int_proxy &operator=(int n) {
std::cout<<"int_proxy::operator= called\n";
val=n;
return *this;
}
};
struct fubar {
int_proxy bar;
} instance;
struct h {
fubar *operator->() {
std::cout<<"used h::operator->\n";
return &instance;
}
};
struct g {
h operator->() {
std::cout<<"used g::operator->\n";
return h();
}
};
struct f {
g operator->() {
std::cout<<"Used f::operator->\n";
return g();
}
};
int main() {
f foo;
foo->bar=1;
}
看起来像是通过指针对成员的简单赋值,该程序实际上会产生以下输出:
foo->bar=1;
显然,在这种情况下,Used f::operator->
used g::operator->
used h::operator->
int_proxy::operator= called
不(甚至接近)等同于简单的foo->bar
。从输出中可以明显看出,编译器生成“隐藏”代码,以遍历各种类中的整个重载(*foo).bar
运算符系列,以便从->
获取(指向)具有成员的内容名为foo
(在这种情况下也是一个重载bar
的类型,因此我们也可以看到赋值的输出。)
答案 1 :(得分:3)
好问题,
点(。)此运算符用于访问成员函数或 有时使用实例的类或结构的数据成员 该类/结构的变量。
object.function();
object.dataMember; //not a standard for class.
arrow( - &gt;)此运算符用于访问成员函数或 有时是类或结构的数据成员但使用指针 类/结构。
ptr->function();
ptr->datamember; //not a standard for class.
答案 2 :(得分:2)
- &gt; operator是一种调用被解除引用的指针的成员函数的方法。它也可以写成(* pter).printCap()。没有课程或书籍,C ++很难学习,所以我建议学习一门,这将是一次很棒的投资!