( - >)箭头操作符和(.)点操作符,类指针

luk*_*kai 10 c++ pointers class

在c ++中我们知道对于类的指针,我们使用( - >)箭头操作符来访问该类的成员,如下所示:

#include <iostream>
using namespace std;

class myclass{
    private:
        int a,b;
    public:
        void setdata(int i,int j){
            a=i;
            b=j;
        }
};

int main() {
    myclass *p;
    p = new myclass;
    p->setdata(5,6);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个"myclass"数组.

p=new myclass[10];
Run Code Online (Sandbox Code Playgroud)

但是,当我myclass通过( - >)箭头操作符访问成员时,我得到以下错误

base operand of '->' has non-pointer type 'myclass'
Run Code Online (Sandbox Code Playgroud)

但是当我通过(.)运算符访问类成员时,它可以工作.这些事让我感到困惑.为什么类I的数组必须使用(.)运算符.

Ops*_*nas 15

你应该阅读指针和参考之间的区别,这可能有助于你理解你的问题.

简而言之,不同之处在于:
当你创建myclass *p它时,它是一个指针,你可以访问它的成员->,因为它p指向内存位置.

但是一旦你打电话p=new myclass[10]; p开始指向数组,当你打电话给p[n]你时,你会得到一个参考,必须使用哪些成员来访问..
但是如果你使用p->member = smth它就像你调用的那样p[0].member = smth,因为number in []是从p搜索下一个数组成员的位置的偏移量,例如(p + 5)->member = smth将与p[5].member = smth

  • "(p +(sizeof(myclass)*5).member = smth与p [5]相同.member = smth" - 实际上不是,因为编译器在添加一个指针时会自动以指针对象的大小为单位进行操作整数到指针,所以简单地说"*(p + 5)"已经与"p [5]"相同. (2认同)
  • @aaroh tbh 我迷路了,是的,你是对的,已修复 (2认同)

Tob*_*obi 7

注意,对于指针变量x

myclass *x;
Run Code Online (Sandbox Code Playgroud)
  • *x 意思是"获取x指向的对象"
  • x->setdata(1, 2)(*x).setdata(1, 2)最后一样的
  • x[n] 意思是"获取数组中的第n个对象".

所以例如x->setdata(1, 2)是相同的x[0].setdata(1, 2).


SGr*_*kin 6

因为通过使用像 p[3] 这样的 [],你已经取消了对数组 + 索引移位的指针的引用。之后你必须使用“.”,因为 p[3] 是一个对象,而不是指针。