#include <iostream>
#include <string>
using namespace std;
class Plane
{
private:
// data member
string name;
public:
// constructor
Plane();
// destructor
~Plane();
// member function
void setName(string na);
};
int main()
{
int num_plane;
cout << "How many planes do you have? ";
cin >> num_plane;
Plane *p_to_plane = new Plane[num_plane];
string name;
for (int i = 0; i < num_plane; ++i)
{
cout << "The No. " << (i + 1) << " plane's name: ";
cin >> name;
(p_to_plane + i)->setName(name);
}
delete [] p_to_plane;
system("Pause");
return 0;
}
我有一个问题:
在主函数中,有一个for
循环可为每个平面添加名称。
但是,如果我写p_to_plane[i]->setName(name)
,则会发生错误。
编译器要我写p_to_plane[i].setName(name)
。
我不明白为什么。如果它是p_to_plane[i].setName(name)
,则p_to_plane[i]
应该是一个类对象。但是,不是应该指向类对象的指针吗?
此外,我无法分辨p_to_plane[i]
和p_to_plane + i
之间的区别。他们是一样的吗?
答案 0 :(得分:4)
a[b]
的意思是*(a + b)
。这是一个取消引用操作。
类似地,a->b
的意思是(*a).b
。
如果p
是指向对象数组第一个元素的指针,则可以使用以下任一方法访问它们的方法
(*(p + i)).foo()
(p + i)->foo()
p[i].foo()
在变体2中,->
运算符正在进行取消引用;在变体#3中,[]
运算符正在进行解除引用。
(如果您真的想将它们结合起来,则需要(&p[i])->foo()
之类的东西,但这很愚蠢。)
答案 1 :(得分:1)
p_to_plane
是Plane*
(指针)。
*p_to_plane
取消引用该指针,为您提供一个Plane
(数组中的第一个)。
p_to_plane+i
递增该指针,使您可以调整指向数组其他位置的指针。
*(p_to_plane+i)
遵循调整后的指针,为您提供Plane
(数组中的第i个字符)。
p_to_plane[i]
与*(p_to_plane+i)
相同。
因此,编译器是正确的: []
已经为您完成了取消引用。