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.rhkb.cn/news/23256.html

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

相关文章

tortoiseGit的使用和上传拉取

tortoiseGit的使用和上传拉取 下载TortoiseGit 通过网盘分享的文件&#xff1a;tortoiseGit.zip 链接: https://pan.baidu.com/s/1EOT_UsM9_OysRqXa8gES4A?pwd1234 提取码: 1234 在电脑桌面新建文件夹并进入 右击鼠标 将网址复制上去 用户名和密码是在git注册的用户名和…

Mybatis学习总结

官网 概念 用于简化JDBC的开发。 在配置mybatis的时候如果没有建立连接识别不了信息&#xff0c;我们需要在idea配置mysql的配置信息 JDBC是一套操作关系数据库的API&#xff0c;有效率&#xff0c;和mybatis比起来资源节约&#xff0c;性能高&#xff0c;不繁琐。 数据库连…

SQL笔记#数据更新

一、数据的插入(INSERT语句的使用方法) 1、什么是INSERT 首先通过CREATE TABLE语句创建表&#xff0c;但创建的表中没有数据&#xff1b;再通过INSERT语句向表中插入数据。 --创建表ProductIns CREATE TABLE ProductIns (product_id CHAR(4) NOT NULL,product_name …

dockerfile构建haproxy

1. 结构目录 [rootlocalhost ~]# tree haproxy/ haproxy/ ├── dockerfile └── files├── haproxy-2.5.0.tar.gz├── haproxy.cfg├── install.sh└── start.sh1 directory, 5 files [rootlocalhost ~]# [rootlocalhost ~]# cd haproxy/ [rootlocalhost haproxy]…

Docker(Nginx)部署Vue

简介&#xff1a;目标使用docker将vue生成的dist文件&#xff0c;结合nginx生成镜像&#xff0c;然后运行&#xff1b; 1、首选确保vue项目正确运行&#xff0c;并能正确打包dist文件&#xff1b; 2、查看已经生成的dist文件 3、将dist文件打包为rar文件或者zip文件&#xf…

C++——模版(二)

前言 我们前面讲过模版的一&#xff0c;不知道大家还有没有所印象&#xff0c;如果大家不太能回忆起来可以再去前面看一下&#xff0c;那通过我们讲解了几个容器之后&#xff0c;相信大家现在应该已经对模版很熟悉了&#xff0c;那模版还剩下一些其他的内容我们就在这里进行讲…

算法与数据结构(旋转链表)

题目 思路 每个节点向右移动k个位置&#xff0c;其实就是从头开始遍历&#xff0c;将n-k个节点顺序插入到链表的尾部。 如上图所示的示例1&#xff0c;先将1插入到5的后面&#xff0c;再将2插入到1的后面&#xff0c;最后将3插入到2的后面即可。 代码详解 定义一个cur变量用…

TOGAF之架构标准规范-信息系统架构 | 应用架构

TOGAF是工业级的企业架构标准规范&#xff0c;信息系统架构阶段是由数据架构阶段以及应用架构阶段构成&#xff0c;本文主要描述信息系统架构阶段中的应用架构阶段。 如上所示&#xff0c;信息系统架构&#xff08;Information Systems Architectures&#xff09;在TOGAF标准规…

智能优化算法:莲花算法(Lotus flower algorithm,LFA)介绍,提供MATLAB代码

一、 莲花算法 1.1 算法原理 莲花算法&#xff08;Lotus flower algorithm&#xff0c;LFA&#xff09;是一种受自然启发的优化算法&#xff0c;其灵感来源于莲花的自清洁特性和授粉过程。莲花的自清洁特性&#xff0c;即所谓的“莲花效应”&#xff0c;是由其叶片表面的微纳…

CSS 媒体查询:从入门到精通,打造跨设备完美体验

在当今移动互联网时代&#xff0c;用户访问网站的设备早已不再局限于桌面电脑&#xff0c;手机、平板等各种屏幕尺寸的设备层出不穷。为了确保用户在不同设备上都能获得良好的浏览体验&#xff0c;响应式网页设计应运而生。而 CSS 媒体查询&#xff0c;正是实现响应式设计的核心…

【Python LeetCode 专题】树

LeetCode 题目104. 二叉树的最大深度(gif 图解)方法一:后序遍历(DFS)方法二:层序遍历(BFS)872. 叶子相似的树(DFS 遍历)1448. 统计二叉树中好节点的数目(DFS 遍历)437. 路径总和 III(前缀和 + DFS 回溯)1372. 二叉树中的最长交错路径(DFS)236. 二叉树的最近公共…

Spring有哪些缺点?

大家好&#xff0c;我是锋哥。今天分享关于【Spring有哪些缺点?】面试题。希望对大家有帮助&#xff1b; Spring有哪些缺点? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring框架是一个广泛使用的企业级Java开发框架&#xff0c;提供了丰富的功能和强大的灵…

MySQL数据库——索引潜规则(回表查询、索引覆盖、索引下推)

大家好&#xff0c;这里是编程Cookbook。本文详细介绍MySQL索引的三个潜规则——回表查询、索引覆盖、索引下推&#xff0c;以提升数据库的性能。 文章目录 索引回顾聚集索引&#xff08;Clustered Index&#xff09;非聚集索引&#xff08;Secondary Index/辅助索引/二级索引&…

VScode运行后出现黑窗口

原文链接&#xff1a;VScode运行出黑窗口 1.安装插件&#xff1a;C/C Compile Run 2.快捷键【CtrlShiftp】,点击【首选项&#xff1a;打开用户设置】

使用大语言模型(Deepseek)构建一个基于 SQL 数据的问答系统

GitHub代码仓库 架构 从高层次来看&#xff0c;这些系统的步骤如下&#xff1a; 将问题转换为SQL查询&#xff1a;模型将用户输入转换为SQL查询。 执行SQL查询&#xff1a;执行查询。 回答问题&#xff1a;模型根据查询结果响应用户输入。 样本数据 下载样本数据&#xf…

【前端小点】vue3项目内根据主题读取不同文件夹下的图片资源(图片文件)

项目要求实现一键换肤的功能&#xff0c;不仅仅是主题颜色上的替换&#xff0c;还有图片素材的替换&#xff0c;主题颜色替换的方案大同小异&#xff0c;下面仅对图片素材的一件替换进行方法描述。 主要思路 使用本地仓库对当前主题进行存储&#xff0c;系统根据主题去加载不同…

vxe-table实现动态列

vxe-table实现动态列 1.动态列解释2.解决步骤2.1将后端返回的动态列表头&#xff0c;按照格式拼接在固定列表头上2.2将后端返回的列表数据按照键值对格式组装 1.动态列解释 正常列表是有固定的列&#xff1b;我的需求是&#xff0c;最初只知道表格的固定两列&#xff0c;查询数…

Windows 11 使用容器(Docker Podman)

文章目录 背景1、相关网站1.1、WSL1.2、Docker1.3、Podman 2、环境3、安装部署3.1、安装 WSL3.2、Docker3.2.1、Docker Desktop3.2.1.1、安装3.2.1.2、拉取镜像3.2.1.3、启动容器 3.3、Podman3.3.1、安装3.3.2、使用3.3.3、异常处理 总结 背景 Windows 系统中使用容器&#xf…

UE_C++ —— Gameplay Modules

目录 一&#xff0c;Module Creation INI File Setup 二&#xff0c;Multiple Gameplay Modules 三&#xff0c;Limitations 编译成 DLL 的游戏相关类的集合&#xff1b;正如引擎本身由一组模块构成一样&#xff0c;每个游戏也是由一个或多个游戏模块构成的&#xff1b;这些…

蓝桥杯定时器实现led闪烁

step1.配置定时器&#xff0c;TIM1时高级定时&#xff0c;TIM2是通用定时器&#xff0c;用TIM2就行&#xff0c;用内部时钟源&#xff0c;记住相关公式&#xff0c;定时器中断配置时要使能&#xff0c;且生成代码后也要在mian中写使能函数 step2.写代码 配置生成代码后多出的…