【C++】命名空间、缺省参数、函数重载、引用

文章目录

  • 1.认识命名空间
  • 2.命名空间的使用
  • 3.C++的输入和输出
  • 4.缺省参数
    • 4.1缺省参数的概念
    • 4.2缺省参数的分类
  • 5.函数重载
  • 6.引用
    • 6.1引用的概念
    • 6.2引用的特性
    • 6.3常引用(重点题目)
    • 6.4引用和指针的区别

1.认识命名空间

C++总计63个关键字,C语言32个关键字在这里插入图片描述

下面让我们学习一下第一个关键字namespace

首先,我们来看下面的代码
在这里插入图片描述
我们定义了一个名为 rand 的全局变量,此时可以正确的打印出来。

当我们引用了<stdlib.h>这个头文件时,我们发现此时代码就会报错,如下图。
在这里插入图片描述
在这里插入图片描述
我们都知道,rand是一个产生随机数的函数名,此时该名称与我们定义的全局变量命名发生了冲突,编译器就不知道选哪个了。
然而,C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决

使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字然后接一对{}即可,{}中即为命名空间的成员。

命名空间有几种使用方式:

  1. 正常的命名空间定义
//aim 是命名空间的名字,实际中一般以项目名称命名
namespace aim1
{int rand = 10;
}
  1. 嵌套定义
namespace aim1 //命名空间1
{int rand = 10;namespace aim2//命名空间2{int rand = 20;}
}
  1. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中

两个文件中的同名命名空间最后会进行合并,因此会出现重定义问题。
在这里插入图片描述

注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

2.命名空间的使用

使用命名空间解决访问冲突的问题后,我们发现仍然访问不到它,此时rand使用的依然是rand函数,打印出来函数的地址。
在这里插入图片描述

下面就来介绍一下命名空间是如何访问的,有3种方式:

  1. 命名空间名称作用域限定符

作用域限制符就是两个冒号,此时我们就可以访问到定义的变量了
在这里插入图片描述

  1. 使用using将命名空间中某个成员引入

using是我们学习的第二个关键字
在这里插入图片描述

我们发现,只有被引入的成员才可以被访问,其它成员依旧不可以。若想访问其它成员,也需要将其引入

  1. 使用using namespace 命名空间名称引入

在这里插入图片描述
此时我们发现,a变量可以访问了,然而rand又出现了问题。什么原因呢?

我们知道,编译器的默认查找是:
a. 当前局部域
b. 全局域
b. 到展开的命名空间中查找

此时我们的全局域中和命名空间中都有rand,显然不知道选哪一个,此时我们就需要指定了。因此使用第三种方式时要慎重,不然就是自找麻烦
/
此时我们就可以发现,若某一成员需要经常使用,可以将其引入;对于不常使用的成员,可以使用命名空间加作用域限定符
在这里插入图片描述
很显然,引入了成员后使用更加方便。

自己在学习中遇到的问题:为什么使用命名空间中的宏时不需要指定?
在这里插入图片描述
宏定义是在编译时预处理阶段完成的,而命名空间是在编译时进行名称空间分配和解析的在预处理阶段,编译器并不知道命名空间的存在,所以它无法对命名空间进行解析,因此也就无法指定命名空间。
当使用命名空间内的宏时,编译器会在预处理阶段将宏展开成相应的代码,而展开后的代码中不包含命名空间,因此不需要指定命名空间

3.C++的输入和输出

  • 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std

在这里插入图片描述

  • cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
  • <<流插入运算符,>>流提取运算符。
  • 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型
    浮点数输出时,也不会像scanf 那样默认小数点后6位;它是原样输出。

在这里插入图片描述

  • 输入时,也不需要取地址了

在这里插入图片描述

std命名空间的使用惯例:
std是C++标准库的命名空间,如何展开std使用更合理呢?

  1. 日常练习中,建议直接using namespace std即可,这样就很方便
  2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以在项目开发中建议使用像 std::cout这样使用时指定命名空间 或 using std::cout展开常用的库对象/类型等方式

4.缺省参数

4.1缺省参数的概念

缺省参数是声明定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
在这里插入图片描述

4.2缺省参数的分类

  1. 全缺省参数

在这里插入图片描述
2. 半缺省参数

在这里插入图片描述

注意:

  • 半缺省参数必须从右往左依次来给出,不能间隔着给。

在这里插入图片描述

  • 缺省参数不能在函数声明和定义中同时出现

如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值
在这里插入图片描述

在这里插入图片描述

  • 缺省值必须是常量或者全局变量

5.函数重载

C语言是不支持同名函数存在的,C++支持。

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数的个数类型类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

  1. 参数类型不同

在这里插入图片描述

  1. 参数类型的顺序不同

在这里插入图片描述

  1. 参数的个数不同

在这里插入图片描述

注意:

  • 同一作用域中,同名函数要想同时存在,必须满足重载的规则。
  • 不同作用域,可以有同名函数
  • 返回值是不构成重载的(返回值不像参数,编译器对它是无法区分的,它也不是必须的)
  • 重载的规则是针对于参数的类型和个数,与参数的名称无关、参数缺省无关

为什么C++支持重载,C语言不支持?

  • 因为在程序进行链接的时候,是使用函数名去找地址的,如果声明和定义分离,C语言是直接使用函数名去找,区分不开。
  • C++使用函数名修饰规则,可以区分。

6.引用

6.1引用的概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间,它们的地址是一样的

定义方式:类型& 引用变量名(对象名) = 引用实体;

在这里插入图片描述

注意:引用类型必须和引用实体是同种类型的

在这里插入图片描述
引用就是祖师爷本贾尼觉得C语言指针不好才搞得,下面的代码就比指针方便的多。

在这里插入图片描述

6.2引用的特性

  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 引用一旦引用一个实体,再不能引用其他实体
  1. 引用在定义时必须初始化

在这里插入图片描述

  1. 一个变量可以有多个引用
int main()
{int x = 10;//一个变量多个引用int& a = x;int& b = x;int& c = x;int& d = x;return 0;
}
  1. 引用一旦引用一个实体,再不能引用其他实体

下面的代码中是将a变成y的别名?还是将y赋值给a呢?
在这里插入图片描述
很显然,它是将y赋值给了a

6.3常引用(重点题目)

void TestConstRef()
{const int a = 10;//int& ra = a;   // 该语句编译时会出错,a为常量const int& ra = a;// int& b = 10;  // 该语句编译时会出错,b为常量const int& b = 10;double d = 12.34;//int& rd = d;  // 该语句编译时会出错,类型不同,d为常量const int& rd = d;
}
  1. 权限的平移
int main()
{const int m = 0;//权限的放大//int& n = m; //error  m的权限是可读,n的权限是可读可写的//权限的平移const int& n = m;//可以//可以,不是权限的放大//只是将m的值拷贝给x,x的修改不影响pint x = m;return 0;
}
  1. 权限的缩小

在这里插入图片描述

  1. 权限的放大(错误、易错
int main()
{const int m = 0;//cosnt修饰指针,左定值,右定向//p1可以修改,*p1不可以,const修饰的是*p1const int* p1 = &m;p1++;//权限的放大,不可以//int* p2 = p1;  //易错//权限平移,可以const int* p2 = p1;return 0;
}

总结:值之间没有权限的放大和缩小的概念,只是一个拷贝;指针与引用有权限放大与缩小的概念,权限只可以缩小,不可以放大

6.4引用和指针的区别

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
在这里插入图片描述

在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

int main()
{int x = 0;int& y = x;y = 10;int n = 10;int* p = &n;*p = 20;return 0;
}

我们来看引用和指针的反汇编对比
在这里插入图片描述

引用和指针的不同

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全

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

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

相关文章

周进院长受邀出席2024第四届屈光手术国际论坛获多项荣誉称号!

周进院长受邀出席2024第四届屈光手术国际论坛获“全国首批EVOICL&#xff08;V5&#xff09;新技术临床应用专家”等多项荣誉称号&#xff01; 5月10-12日&#xff0c;由爱尔眼科医院集团主办、长沙爱尔眼科医院协办的2024第四届屈光手术国际论坛&#xff08;IRSS 2024&#x…

618洗地机怎么选?热门洗地机选购指南,拒绝踩雷

洗地机是一种智能化的清洁工具&#xff0c;具有超强的清洁能力&#xff0c;能轻松应对各种地面污渍&#xff0c;无论是干污还是湿污。其一键操作设计简便易上手&#xff0c;省去了传统清洁方式的繁琐步骤&#xff0c;节省了时间和精力。高端型号更配备智能感应功能&#xff0c;…

2024/5/13 SpringBoot配置多个RabbitMQ

目录 一、单个RabbitMQ配置 1.1、导入Maven坐标 1.2、yaml配置 1.3、java配置类 1.3.1、交换机配置 1.3.2、队列配置 1.3.3、绑定配置 1.3.4、连接配置 1.4、生产者与消费者操作配置 1.4.1、生产者操作配置 1.4.2、消费者操作配置 二、多个RabbitMQ配置 2.1、yaml配置 2.2、j…

【漏洞复现】瑞友天翼应用虚拟化系统 appsave SQL注入漏洞

0x01 产品简介 N/A 0x02 漏洞概述 瑞友天翼应用虚拟化系统 appsave接口存在SQL注入漏洞,未授权的攻击者可以通过该漏洞执行任意sql语句。 0x03 测绘语句 fofa: body="瑞友天翼 - 应用虚拟化系统" 0x04 漏洞复现 1、执行sql语句:http://xxxx/hmrao.php?s=/Ad…

ARP中间人

文章目录 ARP中间人ARP协议介绍使用kali进行ARP毒化使用kali进行ARP中间人使用kali进行ARP钓鱼ARP攻击防御ARP总结 ARP中间人 ARP协议介绍 维基百科ARP介绍 ARP&#xff08;地址解析协议&#xff09;在网络通信中扮演着至关重要的角色&#xff0c;它通过将网络层地址&#x…

吴恩达机器学习笔记:第 10 周-17大规模机器学习(Large Scale Machine Learning)17.1-17.2

目录 第 10 周 17、 大规模机器学习(Large Scale Machine Learning)17.1 大型数据集的学习17.2 随机梯度下降法 第 10 周 17、 大规模机器学习(Large Scale Machine Learning) 17.1 大型数据集的学习 如果我们有一个低方差的模型&#xff0c;增加数据集的规模可以帮助你获得更…

大模型LLM 结合联网搜索增强isou

参考&#xff1a; https://isou.chat/ https://github.com/yokingma/search_with_ai 安装github下载&#xff0c;运行docker compose 如果一直报下面错误&#xff1a; 解决方法https://github.com/yokingma/search_with_ai/pull/7 默认打开&#xff1a; http://192.16***…

系统网络基础知识介绍

1.路由 路由是指从原地址到目的地时&#xff0c;决定端到端路径的网络范围的进程&#xff0c;是工程术语。路由工作在OSI参考模型的第三层&#xff08;网络层&#xff09;&#xff0c;是数据包转发设备。12 路由是把数据从一个网络转发到另一个网络的过程&#xff0c;这个…

教练预约管理小程序开发源码现成案例(小程序、APP、H5圆源码搭建)

随着人们对身体健康越来越重视&#xff0c;对强身健体、健康个性化生活的需求日益增加&#xff0c;健身已成为时尚生活的标志。 然而&#xff0c;没有时间去健身房却成了很多上班族的痛点。健身房作为一项既能缓解工作压力又能缓解学业压力的运动&#xff0c;正好满足了当代人…

每日OJ题_贪心算法四⑦_力扣1054. 距离相等的条形码

目录 力扣1054. 距离相等的条形码 解析代码 力扣1054. 距离相等的条形码 1054. 距离相等的条形码 难度 中等 在一个仓库里&#xff0c;有一排条形码&#xff0c;其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码&#xff0c;使其中任意两个相邻的条形码不能相等…

绝地求生PUBG初版艾伦格回归 初版艾伦格和新版有什么区别

PUBG终于迎来了经典的旧版艾伦格地图的回归&#xff01;我们希望通过本次经典艾伦格的回归为大家带回记忆中那一幕幕熟悉的场景&#xff0c;并让大家好好回味一番当年与好友们共同冒险的峥嵘岁月&#xff01;还怀念从前为了抢到自己最爱的武器而飞奔的日日夜夜吗&#xff1f;那…

如何对公司的重要文件进行保护以防止被误删或恶意删除呢?

企业数据是宝贵的资产&#xff0c;尤其是那些涉及核心竞争力和客户隐私的重要文件&#xff0c;一旦丢失或被恶意删除&#xff0c;可能会给企业带来不可估量的损失。 因此&#xff0c;如何对公司的重要文件进行保护以防止被误删或恶意删除&#xff0c;是每个企业都需要认真考虑的…

Java 常见的垃圾回收算法以及它们的优缺点(总结版)

在Java中&#xff0c;常见的垃圾回收&#xff08;Garbage Collection, GC&#xff09;算法主要有以下几种&#xff0c;每种都有其独特的优缺点&#xff1a; 引用计数算法&#xff08;Reference Counting&#xff09; 优点&#xff1a;实现简单&#xff0c;执行效率高&#xff0…

使用非官网购买Chatgpt的api调用

测试代码 from openai import OpenAI client OpenAI(api_key用户密钥) import json import os import timeclass ChatGPT:def __init__(self, user):self.user userself.messages [{"role": "system", "content": "Agent"}]def as…

【算法基础】简单的动态规划!你没见过的全新视角!

文章目录 动态规划导论使用动态规划加速斐波那契数列&#xff08;记忆化&#xff09;自底向上的动态规划经典的动态规划问题 动态规划导论 动态规划的关键是避免重复的计算。通常情况下&#xff0c;动态规划算法解决的问题可以用递归的方法解决。可以先尝试将问题写出最朴素的…

js图片回显的方法

直接上代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body>// HTML部分<input type"file" id"fileInput"><button onclick"show…

SSH常用功能介绍-高级功能

一、介绍 SSH&#xff08;Secure Shell&#xff09;是一种用于远程登录和执行命令的网络协议&#xff0c;它提供了加密的连接&#xff0c;保证了数据的安全性。除了基本的远程登录功能外&#xff0c;SSH还提供了许多高级功能&#xff0c;以下是一些常用的高级功能介绍&#xf…

神经网络笔记:感知机+激活函数+全连接神经网络简介

神经网络 单层神经网络 感知机模型 激活函数输出 感知机 MP模型 激活函数 把神经网络模型线性输出变为非线性输出 常用激活函数 sigmoid sigmoid(x) 1 / (1 exp(-x))适用于预测概率作为输出的模型优点 把输入值压缩到0-1之间物理意义上最接近生物神经元 缺点 存在梯…

OpenBayes 一周速览|SegmentAnything 分割万物教程上新、MiniGemini 多模态模型天花板一键 input

公共资源速递 This Weekly Snapshots &#xff01; 5 个数据集&#xff1a; * SAOKE 人工标注数据集 * AG News 新闻文章数据集 * VQA-HAT 智能问答数据集 * EQA 问答数据集 * HotpotQA 问答数据集 1 个模型&#xff1a; * MiniGemini-34B-HD 2 个教程&#xff1a; …

什么是 RAG,大模型微调,向量数据库的应用场景

原来向量数据库的应用场景是这样的&#xff01;按照我的理解&#xff0c;大模型其实是没有学习能力的&#xff0c;它就相当于一个真值表或者矩阵&#xff0c;给它输入&#xff0c;它就输出&#xff0c;在使用它的过程中它不会自己训练自己&#xff0c;改变既有的参数&#xff0…