C++ 指针和对象成员访问的区别:`.` 与 `->` 的使用小结

 更新时间:2024年12月18日 11:49:15   作者:XuanRanDev  
在学习 C++ 时,常常会遇到访问对象成员的两种符号:. 和 ->,这两个符号看似简单,但它们的正确使用却需要理解指针和对象的本质差异,本文介绍C++ 指针和对象成员访问的区别:`.` 与 `->` 的使用指南,感兴趣的朋友一起看看吧

在学习 C++ 时,常常会遇到访问对象成员的两种符号:.->。这两个符号看似简单,但它们的正确使用却需要理解指针和对象的本质差异。对于 C/C++ 小白来说,这篇文章将详细解释它们的区别,帮助你在编程时少踩坑。

一、.-> 的基本概念

在 C++ 中,.-> 是用来访问类(或结构体)成员的操作符。它们的使用场景有所不同:

  • . (点号操作符):用于访问非指针对象的成员。
  • -> (箭头操作符):用于访问指针对象所指向的成员。

这两个操作符的作用是类似的,但它们适用的对象类型不同。

二、. 的用法

点号操作符 . 是最简单的成员访问操作符,适用于普通对象。通过对象名和点号,我们可以直接访问该对象的成员函数或成员变量。

示例代码

#include <iostream>
using namespace std;
class Stack {
public:
    void enstack(int value) {
        cout << "Value enstacked: " << value << endl;
    }
};
int main() {
    Stack s;      // 创建一个普通对象
    s.enstack(1); // 通过 . 访问成员函数
    return 0;
}

输出结果

Value enstacked: 1

在这里,s 是一个普通对象,s.enstack(1) 通过点号直接调用对象 senstack 函数。

总结 如果你创建的变量是一个普通对象(栈分配或静态分配),就用 . 访问其成员。点号操作符只能用于非指针对象。

三、-> 的用法

箭头操作符 -> 用于指针对象。它的作用是隐式解引用指针,访问指针所指对象的成员。

示例代码

#include <iostream>
using namespace std;
class Stack {
public:
    void enstack(int value) {
        cout << "Value enstacked: " << value << endl;
    }
};
int main() {
    Stack *s = new Stack(); // 创建一个指针对象
    s->enstack(1);          // 通过 -> 访问成员函数
    delete s; // 释放动态分配的内存
    return 0;
}

输出结果

Value enstacked: 1

在这里,s 是一个指向 Stack 对象的指针,s->enstack(1) 隐式解引用该指针并访问其成员函数 enstack

总结

  • 如果你使用的是指针对象,用 -> 访问其成员。
  • 箭头操作符相当于 (*pointer).member 的简写。

四、. -> 的等价关系

-> 实际上是 (*pointer).member 的简写。这一点可以通过以下代码理解:

示例代码

#include <iostream>
using namespace std;
class Stack {
public:
    void enstack(int value) {
        cout << "Value enstacked: " << value << endl;
    }
};
int main() {
    Stack *s = new Stack();
    // 使用 -> 操作符
    s->enstack(1);
    // 等价于使用解引用和点号
    (*s).enstack(1);
    delete s; // 释放内存
    return 0;
}

输出结果

Value enstacked: 1
Value enstacked: 1

通过这段代码可以看出,s->enstack(1)(*s).enstack(1) 是完全等价的。

为什么有 ->

如果没有 ->,我们每次都需要先解引用指针再用点号访问成员,写起来会显得冗长。例如:

(*pointer).memberFunction();

-> 直接简化了这一过程,代码更简洁:

pointer->memberFunction();

五、如何判断用哪个操作符?

检查变量类型

  • 如果是普通对象,使用 .
  • 如果是指针对象,使用 ->

错误提示
如果你试图对指针对象使用 .,或者对普通对象使用 ->,编译器会报错:

  • type does not have member…”(类型错误)。
  • 或者“invalid use of member…” 示例代码

以下是常见错误示例:

Stack *s = new Stack();
// 错误:指针不能直接用点号访问
s.enstack(1);
// 正确:使用箭头操作符
s->enstack(1);

六、实战对比示例

以下是一个综合示例,展示如何在不同情况下使用 .->

示例代码

#include <iostream>
using namespace std;
class Stack {
public:
    void enstack(int value) {
        cout << "Value enstacked: " << value << endl;
    }
};
int main() {
    // 普通对象
    Stack obj;
    obj.enstack(10);
    // 指针对象
    Stack *ptr = new Stack();
    ptr->enstack(20);
    delete ptr; // 释放内存
    return 0;
}

输出结果

Value enstacked: 10
Value enstacked: 20

七、注意事项

指针初始化

  • 使用 -> 前,确保指针已初始化,并指向有效对象,否则会导致未定义行为。

内存管理

  • 对于动态分配的对象,记得使用 delete 释放内存,否则会造成内存泄漏。

智能指针

  • 在现代 C++ 中,推荐使用智能指针(如 std::shared_ptrstd::unique_ptr)来管理指针,减少手动管理内存的风险。

八、总结

  • 点号操作符 . 用于普通对象。
  • 箭头操作符 -> 用于指针对象,并隐式完成了解引用操作。
  • 它们之间有明确的使用场景,并可以通过解引用实现等价转换。

了解这些基本概念后,可以避免在访问对象成员时犯错。

到此这篇关于C++ 指针和对象成员访问的区别:`.` 与 `->` 的使用小结的文章就介绍到这了,更多相关C++ 指针和对象成员访问内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++中的过滤器模式详解

    C++中的过滤器模式详解

    这篇文章详细介绍了STL中各种算法的类型、功能和使用方法,涵盖了非修改序列算法、修改序列算法、排序和相关算法、堆算法、最小/最大值算法、数值算法以及其他实用算法,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • C++ 互斥锁原理以及实际使用介绍

    C++ 互斥锁原理以及实际使用介绍

    本文主要聊一聊如何使用互斥锁以及都有哪几种方式实现互斥锁。实现互斥,可以有以下几种方式:互斥量(Mutex)、递归互斥量(Recursive Mutex)、读写锁(Read-Write Lock)、条件变量(Condition Variable)。感兴趣的同学可以参考一下
    2023-04-04
  • C++中五种类型转换的深度对比与实践指南

    C++中五种类型转换的深度对比与实践指南

    本文档旨在系统梳理C++中的5种类型转换(C风格转换、static_cast、dynamic_cast、const_cast、reinterpret_cast),从语法、用途、安全性、适用场景等维度进行全面对比,帮助开发者理解各类转换的核心差异,规避使用风险,选择最优转换方案,需要的朋友可以参考下
    2025-11-11
  • vscode配置gitbash终端的方法步骤

    vscode配置gitbash终端的方法步骤

    本文主要介绍了vscode配置gitbash终端的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 二分法求多项式在-10 10间值的实现代码

    二分法求多项式在-10 10间值的实现代码

    以下实例是介绍了二分法求多项式在-10 10间值的实现代码。需要的朋友参考下
    2013-05-05
  • C语言编写Linux守护进程实例

    C语言编写Linux守护进程实例

    这篇文章主要介绍了C语言编写Linux守护进程实例,本文讲解了守护进程及其特性、守护进程的编程要点、守护进程代码实例等内容,需要的朋友可以参考下
    2015-02-02
  • 详解C++的String类的字符串分割实现

    详解C++的String类的字符串分割实现

    这篇文章主要介绍了详解C++的String类的字符串分割实现的相关资料,需要的朋友可以参考下
    2017-07-07
  • C语言实现获取内存信息并输出的实例

    C语言实现获取内存信息并输出的实例

    这篇文章主要介绍了C语言实现获取内存信息并输出的实例的相关资料,需要的朋友可以参考下
    2017-03-03
  • C++时区操作全版本指南(含C++03/C++11-17/C++20)

    C++时区操作全版本指南(含C++03/C++11-17/C++20)

    本文介绍了C++各版本对时区操作的支持,包括C++03/C++11-17/C++20,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01
  • C++封装远程注入类CreateRemoteThreadEx实例

    C++封装远程注入类CreateRemoteThreadEx实例

    这篇文章主要介绍了C++封装远程注入类CreateRemoteThreadEx实例,详细讲述了注入DLL到指定的地址空间以及从指定的地址空间卸载DLL的方法,需要的朋友可以参考下
    2014-10-10

最新评论