You need to enable JavaScript to run this app. C++中指针与对象调用类成员时.和->运算符的区别疑问
优惠活动
大模型
产品
解决方案
定价
更多

C++中指针与对象调用类成员时.和->运算符的区别疑问

两种写法的本质差异是mylist的类型完全不同

你遇到的差异核心是两段代码中mylist的声明类型不一样,导致mylist[0]的类型完全不同:

  • 第一段代码中mylist的类型是person*,是指向person对象的单个指针
  • 第二段代码中mylist的类型是person* [100],是元素为person*指针的数组

第一段代码的逻辑拆解

你给person*类型的mylist赋值了new person[100],也就是把动态分配的100个person对象组成的数组的首地址,存到了这个指针里。
C++中数组下标操作ptr[N]的本质是*(ptr + N),也就是对指针做偏移后解引用,因此mylist[0]等价于*(mylist + 0),拿到的是**person类型的对象本身**,不是指针,所以调用类成员方法用.运算符。
你也可以写成等价的指针写法:(*mylist).set_name("John"),和你原代码的效果完全一致。


第二段代码的逻辑拆解

person* mylist[100]声明的是一个长度为100的数组,数组的每一个元素都是person*类型的指针。
此时mylist[0]取的是数组的第一个元素,本身就是person*类型的指针,没有经过解引用,所以调用类成员方法需要用专门给指针用的->运算符。
你也可以写成等价的解引用写法:(*mylist[0]).set_name("John"),和你原代码的效果完全一致。


补充说明

你第二个项目用指针数组的写法是正确的多态实现方式:如果直接用基类对象数组存储派生类对象,会发生对象切片,丢失派生类的虚函数表信息,无法触发多态;只有用基类指针/引用存储派生类对象地址,才能正常调用重写后的虚函数实现薪资的差异化计算。

内容的提问来源于stack exchange,提问作者madac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 08:06:07