为什么struct数组不需要成员运算符?

时间:2014-12-04 03:25:48

标签: c++ arrays struct

我正在学习C ++中的指针,我注意到如果我声明一个结构指针,我必须使用箭头成员运算符( - >)来访问这些值。这是一个例子。

client * cp = new client;

cp->age = 30;

如果我声明一个动态结构数组,我可以使用点运算符而不是成员运算符,如下所示:

client * cp = new client[10];

cp[1].age = 30;

如果我声明一个动态结构数组,为什么我可以使用点运算符而不是成员运算符?

3 个答案:

答案 0 :(得分:3)

因为它们的类型不同。在您的第一个示例中cpclient*,因此您使用operator->()。在第二个示例中,cp[1]client&,因此您使用operator.()

如果你有:

client** cp;

然后你会使用:

cp[1]->age = 30;

答案 1 :(得分:0)

[n]使用指针数学来获取数组中元素n的实例。

换句话说:

    client * cp = new client[10];
    cp[1].age = 30;

相当于:

    client * cp = new client[10];
    *(cp+1).age = 30;

现在,如果你愿意,你也可以这样做:

    client * cp = new client[10];
    (cp+1)->age = 30;

所有这三个都是相同的,它们只是不同的写作方式。

答案 2 :(得分:0)

如果foo的类型为*STRUCTSTRUCT[]STRUCT[SOME_SIZE],则访问成员时需要使用一个间接(带前缀的星号)运算符。但是,有两种简写符号隐含地包含星号。符号foo->bar将等同于(*foo).bar;概念foo[bar]将等同于*(foo+bar)。因此,foo[bar].boz(foo+bar)->boz都相当于*((foo+bar)).boz。概念foo[bar]->boz等同于(**(foo+bar)).boz,但仅当foo类型为**STRUCT*STRUCT[]或{{1}时才适用这需要两个间接运算符。