c++入门-------命名空间、缺省参数、函数重载

C++系列


文章目录

  • C++系列
  • 前言
  • 一、命名空间
  • 二、缺省参数
    • 2.1、缺省参数概念
    • 2.2、 缺省参数分类
      • 2.2.1、全缺省参数
      • 2.2.2、半缺省参数
    • 2.3、缺省参数的特点
  • 三、函数重载
    • 3.1、函数重载概念
    • 3.2、构成函数重载的条件
      • 3.2.1、参数类型不同
      • 3.2.2、参数个数不同
      • 3.2.3、参数类型顺序不同


前言

在学习C++之前,首先我们要知道—C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。这篇文章可以帮助我们了解c++是如何:

  1. 补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的。
  2. 为后续类和对象学习打基础。

一、命名空间

随着c语言的不断发展和完善,C语言库函数和关键字的定义,越来越多,这些变量、函数和类的名称将都存在于全局作用域中,而在我们编写程序时定义的函数、变量有时就会和库中所定义的发生冲突,如:

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{printf("%d\n", rand);return 0;
}

在这里插入图片描述
注:这里的报错就是因为在库中有一个rand()函数,与我们定义的rand变量名字冲突了。
C语言没有办法很好的解决这类问题,c++便提供了命名空间的方法,命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
命名空间定义:
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员,如:

namespace ltn
{// 命名空间中可以定义变量/函数/类型int rand = 10;int Add(int left, int right){return left + right;}
}
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

现在命名冲突的问题我们解决了,但是当你尝试对类中的函数进行调用时又会出现问题,如:

namespace ltn
{int rand = 10;int Add(int left, int right){return left+right;}
}
int main()
{Add(1, 1);return 0;
}

在这里插入图片描述

这是因为对于这个命名空间中所定义函数、变量等,我们是不可以直接访问的,需要配合“::”域作用符,指定域来进行访问,如:

namespace ltn
{int rand = 10;int Add(int left, int right){return left+right;}
}
int main()
{printf("%d\n", ltn::rand);ltn::Add(1, 1);return 0;
}

如果我们不指定域,编译器首先会去局部查找,其次会去全局域查找,并不会去我们所定义的命名空间中查找,这一点会在后面验证。
在我们编写c++代码时,往往会在代码中,编写这样一段代码“using namespace std;”这里的std就是我们标准库所在的域,而这句代码的意思就是,将这个命名空间展开(权限放开),使我们在使用库中定义的函数、关键字时,不在受域限制,我们可以通过自己定义的命名空间来验证这里的问题,如:
在这里插入图片描述
在不指定命名空间时程序是无法编译的,接下来我们展开ltn这个命名空间:
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
namespace ltn
{int rand = 0;int Add(int left, int right){return left + right;}
}
int main()
{Add(1, 1);return 0;
}

对上面个这中情况,我们如果展开命名空间,rand变量就会和库中的rand()函数冲突,如果不展开每次都要指定域访问,又有点麻烦,这时我们就可以将
命名空间中我们经常使用的函数、变量具体引,如:
在这里插入图片描述

还以一点,当我们在两个不同的文件中,定义了相同的命名空间他们是会自动合并的,例:

namespace ltn
{int add(int x,int y){printf("add\n");return 0}
}

在这里插入图片描述

在test.h文件中定义一个和test.c相同的命名空间,这是我们只需要将test.c中的命名空间展开test.h命名空间中的add函数一样可以使用。
在这里插入图片描述

二、缺省参数

2.1、缺省参数概念

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参,则采用该形参的缺省值,否则使用指定的实参。

void Func(int a = 0)
{cout<<a<<endl;
}
int main()
{Func();     // 没有传参时,使用参数的默认值Func(10);   // 传参时,使用指定的实参
return 0;
}

在这里插入图片描述

2.2、 缺省参数分类

2.2.1、全缺省参数

void Func(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}
int main()
{Func();cout <<"-----------------" << endl;Func(1);cout << "-----------------" << endl;Func(1,2);cout << "-----------------" << endl;Func(1,2,3);return 0;
}

在这里插入图片描述
但我们使用全缺省时,我们可以选择性给函数传递数据。

2.2.2、半缺省参数

void Func(int a, int b = 10, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}
int main()
{Func(1);cout << "-----------------" << endl;Func(1,2);cout << "-----------------" << endl;Func(1,2,3);return 0;
}

半缺省函数需要注意的是:

  1. 半缺省参数必须从右往左依次缺省,不能间隔着给
  2. 半缺省参数在调用是,我们传递的参数是从左到右依次匹配的

2.3、缺省参数的特点

1、缺省参数不能在函数声明和定义中同时出现:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
语法规定,当我们对函数进项声明和定义分离时,缺省参数不可同时存在,如果同时存在,而两个位置提供的值不同,那编译器就无法确定到底该用哪个缺省值。
2、 缺省值必须是常量或者全局变量
这个大家自己验证吧。

三、函数重载

3.1、函数重载概念

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

3.2、构成函数重载的条件

构成重载的函数在调用时编译器会根据我们传递的参数,匹配调用合适的函数。

3.2.1、参数类型不同

int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}
double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}
int main()
{Add(1,1);Add(1.1, 1.2);return 0;
}

在这里插入图片描述
程序执行时,编译器自动匹配合适的函数进行调用。

3.2.2、参数个数不同

void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}
int main()
{f();f(1);return 0;
}

在这里插入图片描述
这里要注意的是,我们上面提到的缺省参数如果像下面这样使用,会造成二义性的问题:
在这里插入图片描述

3.2.3、参数类型顺序不同

需要注意的是,这里说的参数类型顺序不同指的是不同类型的参数。

void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}
int main()
{f(10, 'a');f('a', 10);return 0;
}

至于c++是如何支持函数重载的,大家感兴趣可以搜一下c++中函数名命名规则。

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

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

相关文章

Linux提权之计划任务反弹shell提权(十一)

实验环境还是一样的 当获取一个linux普通用户的时&#xff0c;查看计划任务 首先我们退出root用户 cat /etc/crontab crontab -l 查看当前用户命令 /var/spool/cron/crontabs/root 这个目录是root任务文件 默认是不是root权限是 看不到 tail -f /var/log/syslog 咋们切换用…

论文解读 | AAAI'25 Cobra:多模态扩展的大型语言模型,以实现高效推理

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 个人信息 作者&#xff1a;赵晗&#xff0c;浙江大学-西湖大学联合培养博士生 内容简介 近年来&#xff0c;在各个领域应用多模态大语言模型&#xff08;MLLMs&…

ai-financial-agent - 为金融投资打造的AI代理

探索人工智能在投资研究中的应用。本项目仅用于**教育**目的&#xff0c;不用于真实交易或投资。 作者声明&#xff1a; 本项目仅用于教育和研究目的。 不用于真实交易或投资不提供任何保证或担保过去的表现并不代表未来的结果Creator 对经济损失不承担任何责任咨询财务顾问…

Open WebUI选择模型为空,解决办法(for DeepSeek)

标签&#xff1a; DeepSeek&#xff1b; Open WebUI&#xff1b; 问题&#xff1a;Open WebUI选择模型为空&#xff0c;解决办法 &#xff08;for DeepSeek&#xff09; 操作系统&#xff1a;Ubuntu 22 硬件&#xff1a;台式电脑 Ubuntu 22系统&#xff0c;DeepSeek安装成功&…

欧几里得算法第二弹---计算多个数的最大公约数

如果要求多个数的 GCD&#xff0c;可以先求前两个数的 GCD&#xff0c;然后用这个结果与下一个数求 GCD&#xff0c;依次类推。 为什么可以用前两个数的 GCD 与下一个数继续求 GCD&#xff0c;从而得到所有数的 GCD 呢&#xff1f;&#xff08;之前我不知道&#xff0c;自己也没…

掌握 ElasticSearch 组合查询:Bool Query 详解与实践

掌握 ElasticSearch 组合查询&#xff1a;Bool Query 详解与实践 一、引言 (Introduction)二、Bool 查询基础2.1 什么是 Bool 查询&#xff1f;2.2 Bool 查询的四种子句2.3 语法结构 三、Bool 查询的四种子句详解与示例3.1 must 子句3.2 filter 子句3.3 should 子句3.4 must_no…

【练习】【类似于子集问题】力扣491. 非递减子序列/递增子序列

题目 非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一种特殊情况…

本地部署AI模型 --- DeepSeek(二)---更新中

目录 FAQ 1.Failed to load the model Exit code: 18446744072635812000 FAQ 1.Failed to load the model Exit code: 18446744072635812000 问题描述&#xff1a; &#x1f972; Failed to load the model Error loading model. (Exit code: 18446744072635812000). Unkn…

开源嵌入式实时操作系统uC/OS-II介绍

一、uC/OS-II的诞生&#xff1a;从开源实验到行业标杆 背景与起源 uC/OS-II&#xff08;Micro-Controller Operating System Version II&#xff09;诞生于1992年&#xff0c;由嵌入式系统先驱Jean J. Labrosse开发。其前身uC/OS&#xff08;1991年&#xff09;最初作为教学工…

Starlink卫星动力学系统仿真建模第七讲-卫星姿轨控系统(Attitude and Orbit Control System, AOCS)设计规范

以下是一份卫星姿轨控系统&#xff08;Attitude and Orbit Control System, AOCS&#xff09;设计规范的框架和核心内容示例&#xff0c;供参考&#xff1a; 卫星姿轨控系统&#xff08;AOCS&#xff09;设计规范 1. 总则 1.1 目的 本规范旨在规定卫星姿轨控系统的设计要求、…

C++之旅-C++11的深度剖析(1)

目录 前言/背景 1.C11的发展历史 2.列表初始化 2.1 C98传统的{} 2.2 C11中的{} 2.3 C11中的std::initializer_list 3.右值引用 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延长生命周期 3.4 左值和右值的参数匹配 结束语 前言/背景 随着现代软件开发的快速发展…

什么是手机9008模式?如何进入9008

之前给大家分享了一些有关手机刷机的知识&#xff0c;今天给大家讲一讲如果刷机过程中不慎变砖应该如何应对&#xff08;当然了&#xff0c;希望大家都不会遇到&#xff09;&#x1f602;&#x1f604; 在给手机 Root 或刷机时&#xff0c;线刷 9008 指的是利用 高通 9008 模式…

单机上使用docker搭建minio集群

单机上使用docker搭建minio集群 1.集群安装1.1前提条件1.2步骤指南1.2.1安装 Docker 和 Docker Compose&#xff08;如果尚未安装&#xff09;1.2.2编写docker-compose文件1.2.3启动1.2.4访问 2.使用2.1 mc客户端安装2.2创建一个连接2.3简单使用下 这里在ubuntu上单机安装一个m…

怎么在Github上readme文件里面怎么插入图片?

环境&#xff1a; Github 问题描述&#xff1a; 怎么在Github上readme文件里面怎么插入图片&#xff1f; https://github.com/latiaoge/AI-Sphere-Butler/tree/master 解决方案&#xff1a; 1.相对路径引用 上传图片到仓库 将图片文件&#xff08;如 .png/.jpg&#xff…

Elasticsearch除了用作查找以外,还能可以做什么?

前言 Elasticsearch用于实时数据分析、日志存储、业务智能等。还有日志与监控、多租户和安全性。以及应用场景包括日志分析、公共数据采集、全文搜索、事件数据、数据可视化。处理错误拼写和支持变体&#xff0c;不过这些可能还是属于搜索优化。企业搜索、日志管理、应用监控、…

AIGC(生成式AI)试用 22 -- 跟着清华教程学习 - DeepSeek:从入门到精通

目标&#xff1a; 跟着清华教程学习DeepSeek同样的问题分别尝试使用DeepSeek和文心一言进行提问尝试使用辅助工具完成学习中遇到的问题 个人理解&#xff1a; - AI&#xff0c;AI思维&#xff0c;像人一样思考&#xff0c;越来越像人&#xff1f;参考数据宏大&#xff0c;思考…

[Windows] 全国油价实时查询,可具体到城市

[Windows] 全国油价实时查询&#xff0c;可具体到城市 链接&#xff1a;https://pan.xunlei.com/s/VOJnS3aOPeBwGaSvS0O0E1hwA1?pwdx83j# 出于代码练习的目的&#xff0c;调用公共免费api做的py程序&#xff0c;已经一键打包&#xff0c;双击启动即可 使用&#xff1a;选择…

【并发编程】线程池任务抛异常会怎么样?

一、先说结论 得看线程池的实现&#xff0c;JUC 的线程池&#xff08;ThreadPoolExecutor&#xff09;的话 不会影响其他的线程若是 submit 方法&#xff0c;或者任务为 future 任务&#xff0c;异常只有在 get 的时候才会抛出若是 execute runnable 任务&#xff0c;异常就…

本地部署deepseek-r1 ollama+anythingllm

本期笔者带给大家部署一个本地私有化知识库&#xff0c;简单明了&#xff0c;直接步入主题&#xff0c;需要读者可以继续关注支持一下啊&#xff01; 目录 背景步骤 一、环境准备二、Ollama环境部署三、AnythingLLM安装 总结 开始下载应用&#xff1a; 操作系统&#xff1a…

JAVA-Exploit编写(13-15)--JAVAFX-GUI检测工具编写实现

目录 一,JAVAFX-GUI单个漏洞检测编写 1.1 绑定事件 1.2 Thinkphp5_Rce编写 1.3 编写利用类 1.4 Thinkphp2x_Rce编写 1.5 单个漏洞检测GUI工具完整代码 二,JAVAFX-GUI单个漏洞批量检测编写 2.1 编写利用反射类 2.2 批量检测漏洞完整GUI工具代码 三,JAVAFX-GUI…