广告位联系
返回顶部
分享到

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

C语言 来源:互联网 作者:佚名 发布时间:2024-12-19 22:18:24 人浏览
摘要

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

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

一、. 与 -> 的基本概念

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

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

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

二、. 的用法

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

示例代码

1

2

3

4

5

6

7

8

9

10

11

12

13

#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) 通过点号直接调用对象 s 的 enstack 函数。

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

三、-> 的用法

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

示例代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#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 的简写。这一点可以通过以下代码理解:

示例代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#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) 是完全等价的。

为什么有 ->?

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

1

(*pointer).memberFunction();

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

1

pointer->memberFunction();

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

检查变量类型:

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

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

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

以下是常见错误示例:

1

2

3

4

5

Stack *s = new Stack();

// 错误:指针不能直接用点号访问

s.enstack(1);

// 正确:使用箭头操作符

s->enstack(1);

六、实战对比示例

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

示例代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#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_ptr 或 std::unique_ptr)来管理指针,减少手动管理内存的风险。

八、总结

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

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • C++指针和对象成员访问的区别:`.` 与 `->` 的使
    在学习 C++ 时,常常会遇到访问对象成员的两种符号:.和-。这两个符号看似简单,但它们的正确使用却需要理解指针和对象的本质差异。对
  • C++中std::thread{}和std::thread()用法
    std::thread{}和std::thread()用法 在C++中,std::thread是用于处理线程的类。 关于std::thread{}和std::thread()的区别,主要涉及到C++11引入的统一初始化(
  • Qt实现日志文件的滚动写入
    Qt 日志文件的滚动写入 flyfish 日志文件的滚动写入功能。在日志文件达到10MB时创建新的日志文件,并且在总日志文件大小达到10GB时开始覆盖
  • Java打印星号图案和数字图案的代码
    使用循环和控制语句打印图案 在 Java 中,使用循环和控制语句是打印图案的最佳方法。循环可以帮助你重复执行一段代码,直到满足某个条
  • 解读构造函数的调用规则、深拷贝与浅拷贝

    解读构造函数的调用规则、深拷贝与浅拷贝
    1.调用规则 默认情况下,C++至少会给一个类添加三个函数: 默认构造函数(无参,函数体为空) 默认析构函数(无参,函数体为空) 默认
  • Qt音视频功能实现方法

    Qt音视频功能实现方法
    Qt 音视频 在 Qt 中,音频主要是通过QSound类来实现。但是需要注意的是QSound类只支持播放wav格式的音频文件。也就是说如果想要添加音频效果
  • C++的dynamic代码介绍
    在C++编程中,dynamic_cast是处理多态类型转换的关键工具,允许在复杂继承结构中安全地将基类指针或引用转换为派生类指针或引用。通过利
  • C++中使用不同平台的时间函数及对比介绍
    在 C++ 编程中,时间函数的选择对于性能测量、任务调度和时间戳记录至关重要。不同的操作系统提供了不同的时间函数,同时在同一个平台
  • C++中VTK9.3.0刻度标签重叠的问题记录

    C++中VTK9.3.0刻度标签重叠的问题记录
    本文采用VTK9.3.0版本,其他版本如VKT8.0亦有同样的问题 VTK显示文本时,Z轴刻度标签出现了重叠,如下图: 寻找好久,没有找到设置标签间距
  • C++拷贝构造函数和赋值运算符重载介绍

    C++拷贝构造函数和赋值运算符重载介绍
    一,拷贝构造函数 1. 什么是拷贝构造函数 拷贝构造函数是特殊的构造函数。是用一个已经存在的对象,赋值拷贝给另一个新创建的已经存在
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计