一文搞懂 C++ 调用符号:.、->、:: 到底有什么区别?

发布时间:2026/6/18 12:49:53

一文搞懂 C++ 调用符号:.、->、:: 到底有什么区别? 目录一、为什么你会搞混这三个符号本质原因是二、三大符号一览表先记住一句话口诀三、. —— 对象访问成员示例本质四、- —— 指针访问成员示例本质所以五、. 和 - 的本质关系重点对比示例一句话总结六、:: —— 作用域解析符本质1️⃣ 访问静态成员2️⃣ 调用静态函数3️⃣ 类外实现函数4️⃣ 命名空间本质总结七、三者核心区别总结八、结合多态理解调用方式重要注意九、常见错误踩坑❌ 错误1❌ 错误2❌ 错误3十、面试怎么答Q. 和 - 有什么区别Q:: 是什么十一、总结一句话总结三个核心记忆点工程经验一、为什么你会搞混这三个符号很多人刚学 C 时都会懵d.run(); p-run(); A::run(); 看起来都在“调用函数”但符号完全不同。本质原因是你没有区分“对象、指针、作用域”三种场景二、三大符号一览表先记住符号含义使用场景.对象访问成员对象本身-指针访问成员指针::作用域解析类 / 命名空间 / 静态成员一句话口诀对象用.指针用-作用域用::三、.—— 对象访问成员示例class Dog { public: void run() { cout Dog run; } }; int main() { Dog d; d.run(); // ✅ 使用 . }本质d 是一个对象 → 用 . 你可以理解为⭐“直接在对象上调用”四、-—— 指针访问成员示例Dog* p new Dog(); p-run(); // ✅ 使用 -本质p 是一个指针 → 用 - 等价写法非常重要(*p).run();所以- 本质 解引用 .五、.和-的本质关系重点对比示例Dog d; d.run(); // 对象 Dog* p d; p-run(); // 指针 如果你写(*p).run(); 就和p-run();完全一样。一句话总结*“- 是为了省去 (p) 这一步”六、::—— 作用域解析符 这个和前两个完全不是一类东西。本质“指定从哪个作用域查找”1️⃣ 访问静态成员class A { public: static int x; }; int A::x 10; int main() { cout A::x; }2️⃣ 调用静态函数class A { public: static void test() { cout test; } }; A::test();3️⃣ 类外实现函数class A { public: void run(); }; void A::run() { cout run; }4️⃣ 命名空间std::cout Hello;本质总结:: 我明确告诉编译器从哪里找七、三者核心区别总结. → 对象- → 指针:: → 类/命名空间八、结合多态理解调用方式重要Animal* a new Dog(); a-run(); 为什么用-a 是指针 为什么不能用a.run(); ❌ 因为a 不是对象注意多态 - 是 C 最常见组合九、常见错误踩坑❌ 错误1Dog* p; p.run(); // ❌ 原因p 是指针必须用 -❌ 错误2Dog d; d-run(); // ❌ 原因d 是对象必须用 .❌ 错误3A.run(); // ❌ 应该A::run();十、面试怎么答Q.和-有什么区别 标准答.用于对象访问成员-用于指针访问成员-本质上等价于对指针解引用后再使用.。Q::是什么 答::是作用域解析符用于指定访问某个类、命名空间或静态成员。十一、总结一句话总结⭐对象用.指针用-作用域用::三个核心记忆点.—— 直接操作对象-—— 指针访问本质是(*p).::—— 指定作用域工程经验 看到代码先问自己这个变量是对象还是指针 再决定用. 还是 -

相关新闻