C++中->与.的区别

在类中 

        在 C++ 中,-> 和 . 都可以用于访问类的成员变量和成员函数。但它们在使用上有一些区别:

1. 对于指针类型的对象,必须使用 -> 来访问其成员;而对于非指针类型的对象,则需要使用 .

2. -> 运算符在实际使用时会先对指针进行解引用操作 (*p),然后再访问指针所指向对象的成员;而点运算符则是直接访问对象的成员。

        例如,假设有一个名为 p 的指向某个对象的指针,该对象拥有一个名为 memVar 的成员变量和一个名为 memFunc 的成员函数,那么访问这些成员的方式如下:

p->memVar;  // 访问 p 所指向对象的 memVar 成员变量
p->memFunc(); // 访问 p 所指向对象的 memFunc 成员函数(*p).memVar;  // 与上面等效
(*p).memFunc(); // 与上面等效obj.memVar; // obj 是某个类的对象,访问该对象的 memVar 成员变量
obj.memFunc(); // 访问 obj 对象的 memFunc 成员函数

        需要注意的是,在使用 -> 访问成员时,其左侧应当是一个指向对象的指针。否则会导致编译错误。

示例

#include<iostream>
class Myclass {
public:int number = 2;
};int main() {Myclass a;std::cout << "a.number = " << a.number << std::endl;Myclass* b = &a;std::cout << "(*b).number = " << (*b).number << std::endl;std::cout << "b->number = " << b->number << std::endl;
}

输出结果: 

a.number = 2
(*b).number = 2
b->number = 2

分析:

        这段代码创建了一个名为 Myclass 的类,其中包含一个公有成员变量 number,number 成员变量的值设置为 2。在 main 函数中,首先创建了一个 Myclass 类的实例 a,通过a.number访问number成员变量。然后,创建了一个指向 a 的指针 b,使用 (*b).numberb->number 分别访问了 number 成员变量,并进行打印输出。

在结构体中

        在 C++ 中,结构体和类的使用方式是相似的。对于结构体,也可以使用 -> 和 . 来访问其成员变量和成员函数,但它们的区别与前面提到的指针和非指针类型的对象的区别是一样的。

        当使用指向结构体的指针时,需要使用 -> 运算符来访问成员;而对于结构体的实例(非指针类型),则需要使用 . 运算符。

        例如,假设有一个名为 p 的指向结构体的指针,该结构体拥有一个成员变量 memVar 和一个成员函数 memFunc,那么访问这些成员的方式如下:

p->memVar;  // 访问 p 所指向结构体的 memVar 成员变量
p->memFunc(); // 访问 p 所指向结构体的 memFunc 成员函数(*p).memVar;  // 与上面等效
(*p).memFunc(); // 与上面等效obj.memVar; // obj 是某个结构体的实例,访问该实例的 memVar 成员变量
obj.memFunc(); // 访问 obj 实例的 memFunc 成员函数

        需要注意的是,使用 -> 访问结构体成员时,左侧需要是一个指向结构体的指针。如果左侧不是指针类型或者是空指针,将导致编译错误。而使用 . 访问结构体成员时,左侧应当是一个结构体的实例。

示例

#include<iostream>
struct people{int number = 10;char str = 'h';
};int main() {people a; // 创建结构体实例std::cout << "a.number = " << a.number << std::endl;std::cout << "a.str = " << a.str << std::endl;people* b = &a; // 创建指向该实例的指针,该指针指向结构体实例a// std::cout <<  b.number << std::endl; // 编译报错// std::cout <<  b.str << std::endl; // 编译报错std::cout << "b->number = " << b->number << std::endl;std::cout << "b->str = " << b->str << std::endl;std::cout << "(*b).number = " << (*b).number << std::endl;std::cout << "(*b).str = " << (*b).str << std::endl;}

输出结果: 

        在上面的代码中,a是一个结构体实例,通过a.number、a.str,我们可以访问结构体实例a中的number、str成员变量。                                                              
        b 是一个指向 people 类型的指针,它指向名为 的结构体实例。通过 (*b).number、b->number; (*b).str、b->str,我们可以访问结构体实例中名为 number、str的成员变量。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/145181.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE4/5 批量进行贴图Texture压缩、修改饱和度

该插件下载地址&#xff1a; &#x1f35e;正在为您运送作品详情https://mbd.pub/o/bread/ZZWYmpxw 适用于 UE4 4.25/4.26/4.27 UE5 以上版本 在Edit - Plugins中分别开启 插件 Python Editor Script Plugin 插件 Editor Scripting Utilites 如果会python代码&#xff0c;…

Django实现音乐网站 (22)

使用Python Django框架做一个音乐网站&#xff0c; 本篇音乐播放器功能完善&#xff1a;顺序播放、设置播放数、歌词滚动等功能。 目录 顺序播放 设置顺序播放 单曲播放数 添加路由 视图处理 模板处理 歌词滚动 视图内容返回修改 样式设置 模板内容 歌词滚动脚本 歌…

SystemVerilog Assertions应用指南 Chapter1.38在序列匹配时调用子程序

SVA可以在序列每次成功匹配时调用子程序。同一序列中定义的局部变量可以作为参数传给这些子程序。对于序列的每次匹配,子程序调用的执行与它们在序列定义中的顺序相同。 module sub;logic a, b, clk;initial $vcdpluson();initial begin clk 1b0; a1b0; b1b0; repeat(2) (pos…

CPU和GPU有什么区别?

CPU&#xff1a;叫做中央处理器&#xff08;central processing unit&#xff09;作为计算机系统的运算和控制核心&#xff0c;是信息处理、程序运行的最终执行单元。 GPU&#xff1a;叫做图形处理器。图形处理器&#xff08;英语&#xff1a;Graphics Processing Unit&#x…

Ethernet Protocol

以太网协议说明 1 以太网子层架构 1)MAC and MAC CONTROL Sublayer MAC 负责以太网数据格式中所述的以太网成帧协议以及这些帧的错误检测。MAC 独立于并可以连接到任何类型的物理层设备。这提供了 MAC 子层的实时流控制操作。 MAC CONTROL 和 MAC 子层均由内核在所有操作模式…

机器学习终极指南:统计和统计建模03/3 — 第 -3 部分

系列上文&#xff1a;机器学习终极指南&#xff1a;特征工程&#xff08;02/2&#xff09; — 第 -2 部分 一、说明 在终极机器学习指南的第三部分中&#xff0c;我们将了解统计建模的基础知识以及如何在 Python 中实现它们&#xff0c;Python 是一种广泛用于数据分析和科学计…

iPhone怎么导出微信聊天记录?3个值得收藏的方法

随着时间的推移&#xff0c;微信占用的内存空间会“膨胀”得越来越大。当手机内存不足时&#xff0c;清理微信中的聊天记录是一个可行的方法。但是很多小伙伴觉得有些重要的聊天记录还有用&#xff0c;可能以后需要进行查看。 因此&#xff0c;他们想将一些聊天记录进行导出或…

嵌入式学习笔记(61)位操作寄存器时的特殊作用

2.2.1寄存器操作的要求&#xff08;特定位改变而不影响其他位&#xff09; (1)ARM是内存与IO统一编址的&#xff0c;ARM中有很多内部外设&#xff0c;SoC中CPU通过向这些内部外设的寄存器写入一些特定的值来操控这个内部外设&#xff0c;进而操控硬件动作。所以可以说&#xf…

基于springboot实现车辆充电桩平台管理系统项目【项目源码+论文说明】

基于sprinboot实现车辆充电桩管理平台系统演示 摘要 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;车辆充电桩管理系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#…

Cesium Vue(九)— 模拟飞机飞行

1. CZML CZML是一种用来描述动态场景的JSON架构的语言&#xff0c;主要用于Cesium在浏览器中的展示。它可以用来描述点、线、布告板、模型以及其他的图元&#xff0c;同时定义他们是怎样随时间变化的。 CZML 是基于JSON的。CZML可以准确的描述值随时间变化的属性。CZML通过增…

linux性能分析(四)性能优化导轮

一 别再让Linux性能问题成为你的绊脚石 ① 学习历程 备注&#xff1a; 跟我的学习经历很相像刚工作时遇到的场景跟我现在一样,深深的无力感驱使我继续前行目标: 性能优化成为我的肌肉记忆,写代码的潜意识 ... ② 常见的问题 ③ 性能问题为什么这么难呢 思考&#xff1a…

LinkedList与链表

目录 1、链表 1.1 链表的概念及结构 1.2 链表的实现 2、LinkedList的模拟实现 3、LinkedList的使用 3.1 什么是LinkedList 3.2 LinkedList的使用 3.3 LinkedList的遍历 4、ArrayList和LinkedList的区别 在上一篇文章中&#xff0c;我们介绍了ArrayList与…