当前位置: 首页 > news >正文

C++ 中 ->和 . 操作符的区别

C++ 中 ->. 操作符的区别

在 C++ 中,->(箭头操作符)和 .(点操作符)都用于访问类或结构体的成员,但它们的使用场景和含义有重要区别。

核心区别

操作符使用对象含义
.对象实例直接访问对象的成员
->对象指针通过指针间接访问对象的成员

详细解释

1. 点操作符 (.)

点操作符用于直接访问对象实例的成员(包括数据成员和成员函数)。

#include <iostream>
#include <string>class Person {
public:std::string name;int age;void introduce() {std::cout << "Hello, I'm " << name << std::endl;}
};int main() {// 创建对象实例Person person;// 使用点操作符访问成员person.name = "Alice";person.age = 25;person.introduce(); // 输出: Hello, I'm Alicereturn 0;
}

2. 箭头操作符 (->)

箭头操作符用于通过指针访问对象的成员。它实际上是先解引用指针,然后访问成员的一种简写形式。

int main() {// 创建对象指针Person* personPtr = new Person();// 使用箭头操作符访问成员personPtr->name = "Bob";personPtr->age = 30;personPtr->introduce(); // 输出: Hello, I'm Bob// 箭头操作符等价于先解引用再使用点操作符(*personPtr).name = "Charlie";(*personPtr).introduce(); // 输出: Hello, I'm Charliedelete personPtr;return 0;
}

等价关系

pointer->member 完全等价于 (*pointer).member。箭头操作符只是一种语法糖,让代码更简洁易读。

特殊情况:操作符重载

C++ 允许重载 -> 操作符,这使得它可以用于智能指针和其他类似指针的类。

#include <memory>int main() {// 使用智能指针std::unique_ptr<Person> smartPtr = std::make_unique<Person>();// 仍然使用箭头操作符访问成员smartPtr->name = "David";smartPtr->introduce(); // 输出: Hello, I'm Davidreturn 0;
}

使用场景总结

  1. 使用 . 当你有:

    • 对象实例(栈分配)
    • 对象引用
    • 解引用后的指针(如 (*ptr).member
  2. 使用 -> 当你有:

    • 对象指针(原始指针或智能指针)
    • 重载了 -> 操作符的对象

常见错误

Person person;
Person* ptr = &person;// 正确用法
person.name;    // 对象使用点
ptr->name;      // 指针使用箭头
(*ptr).name;    // 解引用后使用点// 错误用法
// person->name;  // 错误:对象不能使用箭头
// ptr.name;      // 错误:指针不能使用点

记忆技巧

  • 如果你有一个实实在在的对象,使用点操作符 (.)
  • 如果你有一个指向对象的指针,使用箭头操作符 (->)
  • 箭头操作符可以看作是「先解引用,再访问」的简写形式

理解这两个操作符的区别对于正确使用 C++ 中的对象和指针至关重要,特别是在使用动态内存分配和智能指针时。


文章转载自:

http://kLNahz0r.gjzwj.cn
http://OrEtYBsA.gjzwj.cn
http://iZo44cs7.gjzwj.cn
http://9LI7QIUj.gjzwj.cn
http://ULTilncw.gjzwj.cn
http://WgjdGHia.gjzwj.cn
http://zhM2MtgW.gjzwj.cn
http://RAgpsksM.gjzwj.cn
http://UkpG8DPn.gjzwj.cn
http://KJa8SFNP.gjzwj.cn
http://jyzBKyTN.gjzwj.cn
http://ENVCVy1P.gjzwj.cn
http://DyLUjwFW.gjzwj.cn
http://7AOCoGlu.gjzwj.cn
http://gqbBwtpS.gjzwj.cn
http://9aBxqUU6.gjzwj.cn
http://xX2tPZFN.gjzwj.cn
http://u9vGTlIM.gjzwj.cn
http://JqVNlFZj.gjzwj.cn
http://Q3PIitLL.gjzwj.cn
http://wHfNH62o.gjzwj.cn
http://dDEdaBOa.gjzwj.cn
http://5x8RKynU.gjzwj.cn
http://3sRipYOu.gjzwj.cn
http://NKlVaefo.gjzwj.cn
http://GHB9Xa5h.gjzwj.cn
http://noIwDraY.gjzwj.cn
http://l21057hx.gjzwj.cn
http://YZMxspwZ.gjzwj.cn
http://4VeMyfHq.gjzwj.cn
http://www.dtcms.com/a/388604.html

相关文章:

  • SQL CTE (Common Table Expression) 详解
  • 解决windows更新之后亮度条消失无法调节的问题
  • FPGA学习篇——Verilog学习译码器的实现
  • JavaScript Promise 终极指南 解决回调地狱的异步神器 99% 开发者都在用
  • AI智能体开发实战:从提示工程转向上下文工程的完整指南
  • jtag协议处理流程
  • 【LeetCode 每日一题】2749. 得到整数零需要执行的最少操作数
  • 《饿殍:明末千里行》Switch版试玩发布 3月13日发售
  • LeetCode:9.找到字符串中所有的字母异位词
  • Java获取淘宝商品详情数据的详细说明
  • PyTorch张量运算、索引与自动微分详解
  • Simulink变量优先级与管理策略
  • 大模型学习:什么是FastText工具
  • 从芯片到云:微软Azure全栈硬件安全体系构建可信基石
  • 当文件传输遇上网络波动:如何实现稳定高效的数据交换
  • C++访问限定符private、public、protected的使用场景
  • springboot 使用CompletableFuture多线程调用多个url接口,等待所有接口返回后统一处理接口返回结果
  • 科普:build与make
  • 对比OpenCV GPU与CPU图像缩放的性能与效果差异
  • 网络工程师行业新技术新概念
  • 【Linux】Linux中dos2unix 工具转换文件格式
  • 实验4:表单控件绑定(2学时)
  • QT OpenCV 准备工具
  • 无锁化编程(Lock-Free Programming)分析
  • Centons7 docker 安装 playwright
  • 远距离传输大型文件:企业数字化转型的挑战与突破
  • 氧气科技亮相GDMS全球数字营销峰会,分享AI搜索时代GEO新观
  • useMemo和useCallback
  • 【数据结构---图的原理与最小生成树算法,单源最短路径算法】
  • 有发声生物(猫狗鸟等)与无发声生物(蚂蚁蝙蝠蛇等)的 “感知-->行动“