C++中的操作符

C++中的操作符

::

在C++中,双冒号::被称为作用域解析操作符(Scope Resolution Operator)。它用于指定一个标识符(如变量名、函数名、类型名)的作用域。这个操作符主要用于以下几个方面:

1. 访问全局变量

当局部变量的名称遮蔽了全局变量时,可以使用作用域解析操作符来访问全局变量。

int value = 5; // 全局变量void function() {int value = 10; // 局部变量,遮蔽了全局变量std::cout << ::value << std::endl; // 使用::来访问全局变量,打印5
}

2. 定义类的成员函数

当在类定义外部定义成员函数时,作用域解析操作符用于指明该函数属于哪个类。

class MyClass {
public:void myFunction();
};void MyClass::myFunction() {// 函数定义
}

3. 访问类的静态成员

静态成员属于类本身而不是类的任何特定对象。可以使用作用域解析操作符直接通过类名访问静态成员。

class MyClass {
public:static int staticValue;
};int MyClass::staticValue = 42;int main() {std::cout << MyClass::staticValue << std::endl; // 访问静态成员变量
}

4. 指定命名空间中的标识符

C++支持命名空间(Namespace),以避免名称冲突。作用域解析操作符用于指定一个特定命名空间中的标识符。

namespace MyNamespace {int value = 5;
}int main() {std::cout << MyNamespace::value << std::endl; // 指定命名空间中的变量
}

5. 访问枚举类的枚举值

对于枚举类(C++11引入的强类型枚举),使用作用域解析操作符来访问其枚举值。

enum class Colors { Red, Green, Blue };Colors color = Colors::Red; // 使用作用域解析操作符访问枚举值

总结

作用域解析操作符::在C++中是一个非常重要的特性,它提供了一种明确指定标识符作用域的方法,无论是访问隐藏的全局变量、定义类外的成员函数、访问类的静态成员、指定命名空间中的标识符,还是访问枚举类的枚举值,都能派上用场,增强了代码的可读性和维护性。

.和->

在C++中,.(点操作符)和->(箭头操作符)是用于访问对象成员的两个基本操作符。它们的使用取决于你是直接操作对象还是通过指针操作对象。

点操作符(.

点操作符用于访问对象的成员(数据成员和成员函数)。使用这个操作符的前提是你拥有一个对象实例,而不是对象的指针。

语法
对象名.成员名
示例
class Person {
public:string name;Person(string n) : name(n) {}void printName() {cout << "Name: " << name << endl;}
};int main() {Person alice("Alice");alice.printName(); // 使用点操作符访问成员函数cout << alice.name; // 使用点操作符访问数据成员
}

在这个示例中,alicePerson类的一个对象。使用点操作符来访问alice的成员函数printName()和数据成员name

箭头操作符(->

箭头操作符用于通过指针访问对象的成员。当你拥有一个指向对象的指针而不是对象本身时,你需要使用箭头操作符来访问该对象的成员。

语法
指针名->成员名
示例
int main() {Person* alicePtr = new Person("Alice");alicePtr->printName(); // 使用箭头操作符访问成员函数cout << alicePtr->name; // 使用箭头操作符访问数据成员delete alicePtr; // 释放内存
}

在这个示例中,alicePtr是指向Person对象的指针。使用箭头操作符来访问通过alicePtr指针指向的对象的成员。

点操作符与箭头操作符的比较

  • 使用点操作符(.)访问对象成员时,操作的左侧必须是一个对象实例。
  • 使用箭头操作符(->)访问对象成员时,操作的左侧必须是一个指向对象的指针。

这两个操作符是C++面向对象编程中非常基本且常用的工具,它们提供了一种直接和简洁的方式来访问对象的成员。

&

在C++中,符号&有几种不同的用途,具体取决于其出现的上下文。它可以表示地址运算符、引用声明符,或者作为按位与(bitwise AND)运算符。下面详细解释这些不同的用法:

1. 地址运算符

&用于一个变量前面时,它作为地址运算符,用来获取该变量在内存中的地址。

int var = 5;
int* ptr = &var; // &var获取变量var的内存地址,并将其赋值给指针ptr

在这个例子中,&var得到变量var的地址,并将这个地址赋给指针变量ptr。这是在处理指针时常用的一种方式,用于指向变量的内存位置。

2. 引用声明符

在变量类型声明时,&紧跟在类型之后,表示声明的是一个引用而不是一个普通变量。

int original = 10;
int& ref = original; // 声明ref为original的引用

这里,ref是对original的引用,意味着reforiginal指向同一块内存地址。通过ref对该内存地址的任何操作都会影响original的值,反之亦然。引用在函数参数传递、返回值和类成员变量中尤其有用,它们提供了一种不通过复制就能访问变量的方式。

3. 按位与(Bitwise AND)运算符

作为按位与运算符时,&用于两个整数类型的操作数之间,对它们的二进制表示进行按位与操作。

int result = 5 & 3; // 二进制的101 AND 011 = 001,结果为1

在这个例子中,5 & 3计算的是5(二进制101)和3(二进制011)的按位与结果,即001,其十进制表示为1。按位与操作在位掩码、位字段访问等低级编程任务中非常有用。

4. 逻辑与(Logical AND)运算符

虽然逻辑与通常用双符号&&表示,但理解&在逻辑上的意义也是有帮助的。&&用于两个布尔表达式之间,当且仅当两个表达式都为true时,整个表达式的结果才为true。尽管&本身主要用于按位与操作,但在某些特定上下文中,它也可以用于布尔值的逻辑与操作,尽管这不是推荐的做法。

总结

&符号在C++中是多用途的,可以表示地址运算符、引用声明符和按位与运算符。在不同的上下文中,&有着不同的含义和用途。理解这些用法对于编写正确和高效的C++代码是非常重要的。

>>和<<

在C++中,<<>>运算符最初被设计为位操作运算符,用于执行位移操作。然而,在C++的标准库中,这两个运算符被重载以提供对输入/输出流(I/O流)的操作。这种重载使得<<成为插入(输出)运算符,而>>成为提取(输入)运算符,它们是C++ I/O系统的基础。

位操作

左移位操作符(<<)

左移位操作符<<将其左侧操作数的位向左移动指定的次数。例如,a << b将整数a的所有位向左移动b位。在左移过程中,最左边的位被丢弃,而最右边新增的位填充0。

unsigned int a = 5; // 二进制表示为 101
unsigned int b = a << 2; // 结果为 20,二进制表示为 10100
右移位操作符(>>)

右移位操作符>>将其左侧操作数的位向右移动指定的次数。例如,a >> b将整数a的所有位向右移动b位。在右移过程中,对于无符号类型,最右边的位被丢弃,而最左边新增的位填充0;对于有符号类型,行为取决于实现(通常是填充符号位,即算术右移)。

unsigned int c = 20; // 二进制表示为 10100
unsigned int d = c >> 2; // 结果为 5,二进制表示为 101

流插入和提取操作

在C++中,<<>>运算符的重载为I/O操作提供了便捷的方式,这在std::iostream库中实现。

流插入操作符(<<)

流插入操作符<<用于向输出流插入数据,常见的输出流包括std::cout(标准输出),std::ofstream(文件输出流)。这个运算符可以被连续使用,从而在单个语句中向流中插入多个数据项。

std::cout << "Hello, " << "world!" << std::endl;

在这个例子中,字符串"Hello, ""world!"被插入到标准输出流std::cout中,std::endl是一个操纵符,用于插入换行符并刷新输出缓冲区。

流提取操作符(>>)

流提取操作符>>用于从输入流中提取数据,常见的输入流包括std::cin(标准输入),std::ifstream(文件输入流)。这个运算符也可以连续使用,允许在单个语句中从流中提取多个数据项。

int x;
std::cin >> x;

在这个例子中,从标准输入流std::cin中提取一个整数值并存储到变量x中。

总结

<<>>运算符在C++中具有双重用途:作为位操作运算符执行位移操作,以及作为流操作运算符执行I/O操作。通过运算符重载,C++标准库为这些运算符提供了在I/O上下文中使用的新含义,极大地简化了对输入输出流的操作。这种设计是C++强大功能和灵活性的一个例证。

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

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

相关文章

STM32点亮LED灯与蜂鸣器发声

STM32之GPIO GPIO在输出模式时可以控制端口输出高低电平&#xff0c;用以驱动Led蜂鸣器等外设&#xff0c;以及模拟通信协议输出时序等。 输入模式时可以读取端口的高低电平或电压&#xff0c;用于读取按键输入&#xff0c;外接模块电平信号输入&#xff0c;ADC电压采集灯 GP…

论坛管理系统|基于Spring Boot+ Mysql+Java+B/S架构的论坛管理系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能模块 系统功能设计 数据库E-R图设计 l…

【WEEK2】学习目标及总结【SpringMVC】【中文版】

学习目标&#xff1a; 三周完成SpringMVC入门——第二周 学习内容&#xff1a; 参考视频教程【狂神说Java】SpringMVC最新教程IDEA版通俗易懂使用注释完成MVC程序Controller控制器RestFul风格结果跳转方式数据处理 学习时间及产出&#xff1a; 第二周 MON~FRI 2024.3.4 【W…

OxyPlot图表曲线图学习笔记(winform)

一、学习OxyPlot 开源地址&#xff1a;https://github.com/oxyplot/oxyplot 最新版&#xff1a;v2.1.2 新建winform&#xff0c;nuget中添加依赖包 二、写代码 2.1 BarSeries 2.2 ScatterSeries 2.3 LineSeries (带指向箭头&#xff09; int pointCount 50; double[] xs …

知识图谱详细建立过程

开始建立知识图谱&#xff1a; 确定知识图谱的范围&#xff1a; 首先&#xff0c;确定你的知识图谱将涵盖的主题范围。樱桃种植涉及到哪些方面&#xff1f;可能包括樱桃的生长周期、品种、栽培技术、土壤和气候要求、病虫害防治、收获和加工等方面。 收集樱桃种植相关的数据&a…

Xilinx 7系列FPGA的配置流程

目录 1.4配置流程 1.4.1 设备上电 ​编辑1.4.2 清除配置寄存器 1.4.3 采样模式引脚 1.4.4 同步 ​编辑1.4.5 检测设备ID ​编辑1.4.6 加载配置数据 1.4.7 CRC校验 1.4.8 启动序列 1.4配置流程 对于所有配置模式&#xff0c;7系列的基本配置流程都是相同的&…

C语言sizeof操作符与strlen函数

1.sizeof与strlen的介绍 (1).sizeof 计算变量的内存空间大小。底层实际上是对变量类型的计算。是一个单目操作符&#xff0c;不是函数&#xff0c;后面的括号可以省略 (2).strlen 函数原型 strlen是一个函数&#xff0c;返回的size_t类型的数据,头文件为string.h计算字符串…

Python爬虫:requests模块的基本使用

学习目标&#xff1a; 了解 requests模块的介绍掌握 requests的基本使用掌握 response常见的属性掌握 requests.text和content的区别掌握 解决网页的解码问题掌握 requests模块发送带headers的请求掌握 requests模块发送带参数的get请求 1 为什么要重点学习requests模块&…

关于k8s中 storageclass 的 is-default-sc 默认存储设置

为什么要改变默认存储类&#xff1f; 取决于安装模式&#xff0c;你的 Kubernetes 集群可能和一个被标记为默认的已有 StorageClass 一起部署。 这个默认的 StorageClass 以后将被用于动态的为没有特定存储类需求的 PersistentVolumeClaims 配置存储。更多细节请查看 Persiste…

MySQL—InnoDB在RC隔离级别下如何处理事务读取操作

本文将探讨InnoDB在读已提交&#xff08;Read Committed&#xff09;隔离级别下如何处理事务读取操作的原理。这个过程是InnoDB多版本并发控制&#xff08;MVCC&#xff09;机制的一个关键组成部分&#xff0c;旨在提供高效的事务隔离&#xff0c;同时减少锁的需求&#xff0c;…

如何在安卓端的SAP里配置打印机

1、转到 SPAD 事务&#xff08;“假脱机管理”屏幕&#xff09;。单击“设备/服务器”选项卡&#xff0c;输入输出设备的名称&#xff0c;然后点击显示按钮。 2、如果打印机已配置&#xff0c;它将显示设备属性、输出设备属性和纸盒信息的所有详细信息。如果输入新的打印机名称…

AndroidStudio设计登录页源码(音悦app)

目录 一、代码 二、效果 一、代码 1.在activity_main.xml里的代码 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent&quo…

import gdal 报错

1.下载gdal https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal 2.安装正确版本 &#xff08;1&#xff09;查看python版本 python -v我的版本Python 3.7.9 建议下载 GDAL-3.4.2-cp37-cp37m-win_amd64.whl &#xff08;2&#xff09;放到Scripts文件夹下 执行 pip install GD…

js手写Promise.prototype.finally

实现 Promise.prototype.finally 前面的promise不管成功还是失败&#xff0c;都会走到finally中&#xff0c;并且finally之后&#xff0c;还可以继续then&#xff08;说明它还是一个then方法是关键&#xff09;&#xff0c;并且会将初始的promise值原封不动的传递给后面的then.…

mysql启动报错:ERROR! The server quit without updating PID file

mysql 重启或者启动时报错&#xff1a;ERROR! The server quit without updating PID file (/home/data/mysql/e787y33206.novalocal.pid).如下图: 重启报错&#xff1a; 启动也报错 这个错误是因为有mysql启动没有完全结束&#xff0c;如果是重启mysql服务&#xff0c;则在…

L2-035 完全二叉树的层序遍历(Python)

L2-035 完全二叉树的层序遍历 分数 25 全屏浏览 切换布局 作者 陈越 单位 浙江大学 一个二叉树&#xff0c;如果每一个层的结点数都达到最大值&#xff0c;则这个二叉树就是完美二叉树。对于深度为 D 的&#xff0c;有 N 个结点的二叉树&#xff0c;若其结点对应于相同深度…

超详细——VsCode连接远程主机/虚拟机并设置免密登录

超详细——VsCode连接远程主机/虚拟机并设置免密登录 文章目录 超详细——VsCode连接远程主机/虚拟机并设置免密登录[toc]连接到远程主机/虚拟机步骤1、打开vscode拓展 搜索 remote-ssh并安装步骤2、打开远程主机/虚拟机的ssh服务步骤3、设置连接远程主机的配置文件 设置免密登…

机械女生,双非本985硕,目前学了C 基础知识,转嵌入式还是java更好?

作为单片机项目开发的卖课佬&#xff0c;个人建议&#xff0c;先转嵌入式单片机开发方向&#xff0c;哈哈。 java我也学过&#xff0c;还学过oracle、mysql数据库&#xff0c;只是当时没做笔记&#xff0c;找不好充分的装逼证据了。 从实习通过业余时间&#xff0c;学到快正式毕…

【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?

在Java中&#xff0c;如果你的集合属性是String类型&#xff0c;并且你想要使用Lambda表达式对这些字符串进行BigDecimal计算&#xff0c;首先你需要将字符串转换为BigDecimal对象。 使用map(BigDecimal::new)将每个字符串转换为BigDecimal对象。最后&#xff0c;我们使用redu…

可以用SEO进行市场分析吗?(川圣SEO)蜘蛛池

baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; SEO如何去进行关键词市场占比分析呢&#xff1f;可以进行市场分析吗&#xff1f; SEO&#xff0c;即搜索引…