C++ : namespace,输入与输出,函数重载,缺省参数

一,命名空间(namespace)

1.1命名空间的作用与定义

        我们在学习c的过程中,经常会碰到命名冲突的情况。就拿我们在c语言中的一个string函数来说吧:

int strncat = 0;
int main()
{printf("%d", strncat);return 0;
}

 当我们运行之后,毫无疑问的会报错:

        有人可能会说,这是库函数,我不用这定义不久行了吗?但我们日后的工作之中,经常会有好几个人来共同完成一个项目,所以难免有人写的函数名称会与他人相冲突,这时后就需要使用我们的namespace来解决。

在介绍namespace的用法前,我们先来了解下它的定义:

1.定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。

2.namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。

3.C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。

Tips:namespace只能定义在全局,当然他还可以嵌套定义。项目工程中多文件中定义的同名namespace会认为是⼀个namespace,不会冲突。

1.2命名空间的使用 

1.2.1命名空间的使用方法

        由于命名空间的本质是一个作用域,所以我们通常以->命名空间名称:: 所需使用对象的方式来使用命名空间中的内容,::为域作用限定符,比如我们以上面的例子为例:

namespace ikun
{int strncat = 0;
}
int main()
{printf("%d", ikun::strncat);return 0;
}

        这时再运行程序就不会报错, 但需要注意的是命名空间可以被视为全局作用域的扩展,它们为标识符引入了一个新的层次结构。这意味着在全局命名空间之外,你可以有多个命名空间,每个命名空间都有自己的标识符集。

Tips:C++的标准库都放在一个叫std(standard)的命名空间中。

1.2.2常见的几种使用情况

1.不同文件中的相同名称命名空间,在运行时会被看作一个空间进行使用,也就是说二者之间的内容会进行合并。 

2.如果在使用时对空间中的部分或全部内容频繁使用而又不想麻烦,可以使用:

using ikun::strncat;//部分成员的展开
using namespace ikun;//空间所有成员的展开

3.如果不想麻烦的去定义多个命名空间,则可以嵌套定义:

namespace ikun
{namespace A {void func() {// }}namespace B {void func() {//}}
}

此时对单个成员的使用方式即为ikun::A::func()。多次嵌套使用方式一致。 

二,C++的输入输出 

        在C语言中,我们使用的输入函数为scanf,输出函数为printf。而在C++中,我们使用的则是C++标准库中的std::cin,std::cout来进行输入输出。

我们来用下面这个例子来区别二者的输入输出方式:

#include <iostream>//这⾥我们没有包含<stdio.h>,也可以使⽤printf和scanf,在包含<iostream>间接含 //vs系列编译器是这样的,其他编译器可能会报错。
int main()
{int a = 0;std::cin >> a ;//>>符号为流插入符号,<<为流输出符号printf("%d\n", a);scanf("%d", &a);std::cout << a << std::endl;//std::endl为C++中的换行方式return 0;
}

输入与输出结果如下 

        可见C与C++之间并不冲突的同时,我们也发现了C++不需要指定输入或输出的数据类型(本质是通过函数的重载实现的),但这里我们不详细介绍IO流,因为IO流涉及类和对象,运算符重载、继承等很多面向对象的知识,这些知识我们还没有讲解,所以这里我们只能简单认识⼀下C++ IO流的用法,后面我们会有专门的一篇文章来介绍IO流库。

三,缺省参数 

缺省函数,通俗的来讲就好像一个备胎,我们先以一个例子来引出: 

int add(int a = 10, int b = 0)
{return a + b;
}int main()
{int a = add();std::cout << a << std::endl;
}

        当我们一个参数都不给时,他的输出结果就是10,下面我们来详细介绍缺省函数的概念与使用方法:

3.1全缺省 

全缺省就是全部形参给缺省值,与我们上面的缺省方式一样,这即为全缺省。

3.2半缺省 

        半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。

int add(int a,int b = 0);//半缺省的正确写法
int add(int a = 0,int b);//错误写法

3.3 给实参的方式

       正如我们上面缺省的方式一样,我们在调用函数给实参时应该从左向右给实参,而不能跳着给,也不能从左往右给。

int add(int a, int b = 0,int c = 10)
{return a + b + c;
}int main()
{int b = add(1);//正确方式int c = add(, , 10);//错误方式int a = add(1,,10);//错误方式std::cout << a << std::endl;std::cout << b << std::endl;std::cout << c << std::endl;
}

3.4声明与定义的缺参方式

        当我们的函数在只有定义但没有函数的声明时,可以直接在函数的定义部分缺省。但如果我们的函数在头文件中有声明时,则只能在声明部分缺省:

int add(int a, int b = 0, int c = 10);int add(int a, int b,int c)
{return a + b + c;
}//正确方式
int add(int a, int b, int c);int add(int a, int b = 0, int c = 10)
{return a + b + c;
}
//编译报错

四,函数重载

        C++支持在同⼀作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调⽤就表现出了多态行为,使用更灵活。C语言是不支持同⼀作用域中出现同名函数的。比如如下例子:

void swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}void swap(double* a, double* b)
{double tmp = *a;*a = *b;*b = tmp;
}

再比如这样:

void swap(int* a, double* b)
{int tmp = *a;*a = *b;*b = tmp;
}void swap(double* a, int* b)
{double tmp = *a;*a = *b;*b = tmp;
}

或者是这样:

void swap(int* a)
{//
}void swap(int* a, double* b)
{//
}

        也就是说,对于函数的参数位置的参数个数,参数位置,参数类型不同,但名称相同,它们则都是重载函数。但需要注意,返回值不能作为是否为重载函数的条件,因为调用时也无法区分它们:

int swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;return tmp;
}void swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}

        还有当出现如下的类似情况时,虽然二者符合函数重载的定义,但当我们使用f()进行调用时,会产生歧义,导致编译报错:

void f1()
{cout << "f()" << endl;
} void f1(int a = 10)
{cout << "f(int a)" << endl;
}

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

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

相关文章

大型赛事5G室内无线网络保障方案

大型活动往往才是国家综合实力的重要体现&#xff0c;其无线网络通信保障工作需融合各类新兴的5G业务应用&#xff0c;是一项技术难度高、方案复杂度高的系统工程。尤其在活动人员复杂、现场突发情况多、网络不稳定等情况下&#xff0c;如何形成一套高效、稳定的应急通信解决方…

C++入门级文章

一、一个用于查询C标准库内函数、操作符等的链接 https://legacy.cplusplus.com/reference/ 声明&#xff1a;该文档并非官方文档&#xff0c;但其具有易于查询和使用的优势&#xff0c;足够日常使用。 二、C的第一个程序 1、C语言中的语法在C中仍旧适用&#xff0c;首先我们来…

无人机无刷电机技术详解及选型

1. 技术原理 无人机无刷电机&#xff08;Brushless DC Motor, BLDC&#xff09;是现代无人机动力系统的核心部件&#xff0c;其工作原理基于电磁感应和换向技术&#xff0c;实现了无需物理接触即可持续旋转的高效率动力输出。与传统有刷电机相比&#xff0c;无刷电机通过电子换…

Java入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享

场景 作为一名Java开发者&#xff0c;势必经历过从入门到自学、从基础到进阶、从学习到强化的过程。 当经历过几年企业级开发的磨炼&#xff0c;再回头看之前的开发过程、成长阶段发现确实是走了好多的弯路。 作为一名终身学习的信奉者&#xff0c;秉承Java体系需持续学习、…

【C++高阶】:C++11的深度解析上

✨ 心似白云常自在&#xff0c;意如流水任东西 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f4…

Spring Cache框架(AOP思想)+ Redis实现数据缓存

文章目录 1 简介1.1 基本介绍1.2 为什么要用 Spring Cache&#xff1f; 2 使用方法2.1 依赖导入&#xff08;Maven&#xff09;2.2 常用注解2.3 使用步骤2.4 常用注解说明1&#xff09;EnableCaching2&#xff09;CachePut3&#xff09;Cacheable4&#xff09;CacheEvict 3 注意…

数据库相关概念大全!

一、什么是数据库&#xff1f; 1.数据库 数据库是一种更易于访问、更高效且更有条理的长期存储和处理信息的方式。 2. 优点&#xff0c;作用 数据库存储数据的规范性和系统性以及其检索数据的便捷性使其成为基于 Web 的应用程序中重要的部分。 数据库几乎可以用于所有应用程…

java中InputStream, OutputStream 的用法

java针对文件的操作有两种1.文件系统操作 File类指定的路径可以使一个不存在的路径。2&#xff0c;文件内容操作&#xff0c;流对象。 流也分为两种1)字节流&#xff08;二进制文件&#xff09;&#xff1a;以字节为基本单位读写的使用InputStream&#xff08;&#xff09;和Ou…

FFmpeg源码:av_gcd函数分析

一、引言 公约数&#xff0c;是一个能同时整除几个整数的数。如果一个整数同时是几个整数的约数&#xff0c;称这个整数为它们的“公约数”&#xff1b;公约数中最大的称为最大公约数。对任意的若干个正整数&#xff0c;1总是它们的公约数。 公约数与公倍数相反&#xff0c;就…

DB-Engines Ranking 2024年8月数据库排行

DB-Engines Ranking 2024年8月数据库排行 DB-Engines排名根据数据库管理系统的受欢迎程度进行排名。排名每月更新一次。 2024年8月&#xff0c;共有423个数据库进入排行。 排行榜 前15名趋势图 关系型数据库前 10 名 键值数据库前 10 名 文档数据库前 10 名 时序数据库前 10 …

Google引领LLM竞赛:Gemini 1.5 Pro的创新与突破

在科技领域&#xff0c;语言模型&#xff08;LLM, Large Language Model&#xff09;的发展总是备受瞩目。多年来&#xff0c;Google在这场竞赛中一直处于追赶的状态&#xff0c;但这一次&#xff0c;他们终于站在了领先的位置。Google近日发布了Gemini 1.5 Pro实验版本&#x…

Nginx进阶-常见配置

一、nginx Proxy 反向代理 1、代理原理 反向代理产生的背景&#xff1a; 在计算机世界里&#xff0c;由于单个服务器的处理客户端&#xff08;用户&#xff09;请求能力有一个极限&#xff0c;当用户的接入请求蜂拥而入时&#xff0c;会造成服务器忙不过来的局面&#xff0c…

Unity后处理(Post-processing)

Unity post-processing 就像是对图片采用滤镜一样&#xff08;如下图对比&#xff09;对当前场景显示做一定的显示处理&#xff0c;使得场景更漂亮、有趣或者有型。 视觉风格与视觉保真 游戏场景后处理能够达到所需的视觉风格&#xff08;visual style&#xff09;同时也保证视…

文件解析漏洞

IIS解析漏洞 在windows Server 2003安装iis 1.IIS6.X 1.1 目录解析 在网站下建立文件夹的名字为 .asp/.asa 的文件夹&#xff0c;其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。 先创建一个1.asp文件夹 再创建一个1.txt 里面写 <%now()%> 2.1 畸形文件…

DTU、RTU和边缘计算网关的联系与区别

在工业4.0发展浪潮中&#xff0c;物联网助力工业逐渐向智能化发展&#xff0c;各种工业设备相互连接起来形成物联网。而传输层作为物联网体系中十分重要的一环&#xff0c;它是连接物理世界与数字世界的桥梁&#xff0c;是数据的第一入口。 其中&#xff0c;我们经常会使用到三…

jQuery入门(五)Ajax和json

一、Ajax 简介 AJAX(Asynchronous JavaScript And XML)&#xff1a;异步的 JavaScript 和 XML。 本身不是一种新技术&#xff0c;而是多个技术综合。用于快速创建动态网页的技术。 一般的网页如果需要更新内容&#xff0c;必需重新加载个页面。 而 AJAX 通过浏览器与服务器进行…

windows内存泄漏检查汇总

VLD(Visual Leak Detector) 下载 官方下载地址2.5 另一分支2.7 安装 点击运行安装

苹果手机升级iOS18测试版本后使用体验不好?怎么降级?

近期苹果发布了诸多的iOS18版本给用户提前尝鲜测试&#xff0c;许多果粉们都迫不及待的选择了升级&#xff0c;但是有不少的果粉升级时没有考虑到设备适配性问题&#xff0c;导致升级之后手机变得有些卡顿&#xff0c;使用体验不好时&#xff0c;想要降级回到正式的版本&#x…

ubuntu安装nginx以及php的部署

1.安装依赖包 apt-get install gcc apt-get install libpcre3 libpcre3-dev apt-get install zlib1g zlib1g-dev sudo apt-get install openssl sudo apt-get install libssl-dev 2.安装nginx cd /usr/local mkdir nginx cd nginx tar -xvf nginx-1.21.6.tar.gz 3.编译…