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

news2024/11/16 18:30:17

一,命名空间(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.coloradmin.cn/o/1972085.html

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

相关文章

内网横向——常见系统传递攻击(1)

文章目录 一、哈希传递1.1 利用Mimikatz进行PTH1.2 利用Impacket进行PTH1.3 使用crackmapexec进行PTH1.4 使用PowerShell1.5 使用MSF进行哈希传递1.6 利用哈希传递登录远程桌面 二、票据传递2.1 MS14-068漏洞2.2 使用kekeo进行票据传递 网络拓扑&#xff1a; 攻击机kali IP&…

windows内存泄漏检查汇总

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

重装系统之前,如何保护自己的微信聊天记录?

前言 有个小伙伴想要重装系统&#xff0c;但又怕自己的电脑微信聊天记录全没了。于是就一直拖着不重装系统&#xff0c;直到有一天系统崩溃之后…… 今天咱们要讲讲&#xff1a;重装系统之前&#xff0c;如何保护自己的社交软件聊天记录。这个话题其实不仅仅是微信聊天记录&am…

喜讯|华院计算Uni-law法律大模型成功入选《2024中国数据智能产业AI大模型先锋企业》

7月24日&#xff0c;“2024企业数智化转型升级发展论坛——暨AI大模型趋势论坛”在北京圆满落幕。此次论坛由数据猿主办&#xff0c;IDC协办&#xff0c;新华社中国经济信息社、上海大数据联盟、上海市数商协会及上海超级计算中心作为支持单位。大会以“数智新质力拓未来”为主…

Springboot学习-day17

Springboot学习-day17 1. AOP AOP &#xff08;Aspect Orient Programming&#xff09;,直译过来就是 面向切面编程,AOP 是一种编程思想&#xff0c;是面向对象编程&#xff08;OOP&#xff09;的一种补充。 面向切面编程&#xff0c;实现在不修改源代码的情况下给程序动态统…

大模型学习路线图:从入门到精通,我说这是全网详细的,谁赞成谁反对?

随着人工智能技术的飞速发展&#xff0c;大模型&#xff08;Large-Scale Models&#xff09;已经成为推动自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#xff08;CV&#xff09;等领域进步的关键因素。本文将为您详细介绍从零开始学习大模型直至成为专家的全过程&am…

吴恩达机器学习WEEK1

COURSE 1 WEEK 1 机器学习的应用 当我们有一个目标&#xff0c;不知道如何显示地写出来一个程序时&#xff0c;例如自动驾驶等&#xff0c;这时候就需要制定某些规则&#xff0c;让计算机自己去学习&#xff0c;即机器学习 机器学习就是沿用人脑学习的过程&#xff0c;逐步对…

目录文件;链接文件;函数stat/lstat

1.目录文件的操作&#xff1a; 1. mkdir int mkdir(const char *pathname, mode_t mode); 功能: 创建目录 参数&#xff1a; pathname:目录文件的路径 mode:目录文件的权限 返回值&#xff1a; …

6581 Number Triangle

这个问题可以通过动态规划来解决。我们可以从三角形的顶部开始&#xff0c;然后逐行向下计算每个位置的最大和。对于三角形中的每个位置&#xff0c;我们可以选择从其上方或左上方的位置移动到该位置&#xff0c;所以该位置的最大和就是其上方或左上方位置的最大和加上该位置的…

动态规划---观察优化枚举(股票系列问题)

121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; public class Code01_Stock1 {public static int maxProfit(int[] prices) {int ans 0;for (int i 1, min prices[0]; i < prices.length; i) {// min : 0...i范围上的最小值min Math.min(min, prices…

Android图像显示SurfaceFlinger总结

1 介绍 1.1 框架中位置 ​​ 上图为Android的图形显示系统框架图。 首先上层应用通过ViewRoot的scheduleTraversals函数发起绘制任务&#xff0c;并通过HWUI调用OpenGL接口将绘制数据传递给GPU处理&#xff1b;SF会接收所有应用更新的绘制数据&#xff0c;并根据Z-Order、透明…

实现一个自定义前端脚手架

一、背景 什么前端脚手架&#xff1f; 前端脚手架是一种工具&#xff0c;用于快速搭建前端项目的基础结构&#xff0c;提供了一套约定和标准&#xff0c;帮助开发人员快速启动项目开发。常见的前端脚手架包括Create React App、Vue CLI、Angular CLI、nestjs/cli等。 我为什么…

C语言——二维数组和字符数组

二维数组 二维数组本质上是一个行列式的组合&#xff0c;也就是二维数组是有行和列两部分构成。二维数组数据是通过行列进行解读。 定义形式&#xff1a; 类型&#xff08;说明符&#xff09; 数组名[行数&#xff08;常量表达式1&#xff09;][列数&#xff08;常量表达式…

nginx负载均衡、java、tomcat装包

一、nginx 七层负载均衡 1、七层负载均衡基础配置 2、负载均衡状态 [rootserver]# vim /usr/local/nginx/conf/nginx.confworker_processes 1;event {worker_connections 1024&#xff1b;}http { # 七层负载均衡支持http、ftp协议include mime.types;default_type app…

T3学员领取资料通知0803

T3学员领取资料通知0803 各位学员∶本周MF系列VBA技术资料增加671-680讲&#xff0c;T3学员看到通知后请免费领取,领取时间8月2日晚上19:00-8月3日12:00。本次增加内容&#xff1a; MF671:Shell命令输出计算机的详细信息 MF672:Shell命令输出网络配置信息 MF673:解锁和启用…

QtQuick Text-文本省略

效果 import QtQuickColumn{spacing: 20Text{width: 200text: qsTr("1使文本在单行中对于超出部分不要进行省略")font.pointSize: 20}Text{width: 200elide: Text.ElideLefttext: qsTr("2使文本在单行中对于超出部分从左边进行省略")font.pointSize: 20}Te…

【协作提效 Go - gin ! swagger】

什么是swagger Swagger 是一个用于设计、构建、记录和使用 RESTful Web 服务的工具集。它的主要作用包括&#xff1a; API 文档生成&#xff1a;Swagger 可以自动生成详细的 API 文档&#xff0c;包括每个端点的请求和响应格式、参数、状态码等。这使得开发者和用户可以轻松理…

【香橙派系列教程】(五)Linux的热拔插UDEV机制

【五】Linux的热拔插UDEV机制 在上一篇中我们发现&#xff0c;当手机接入开发板时&#xff0c;系统并不认识&#xff0c;当我们在/etc/udev目录下创建一个规则后&#xff0c;就可以通过adb访问到手机了&#xff0c;这里到底是怎么回事&#xff1f; 文章目录 【五】Linux的热拔插…

【Python】数据类型(上)

本篇文章将讲解&#xff1a; &#xff08;1&#xff09;整型 &#xff08;2&#xff09;布尔类型 一&#xff1a;整型 整型其实就是十进制整数的统称&#xff0c;例如&#xff1a;1 666 都属于整型。 &#xff08;1&#xff09;定义 num11 age45 &#xff08…

【网络】网络入门(第一篇)

网络入门可以从多个方面开始&#xff0c;以下是一个基本的网络入门指南&#xff0c;涵盖了网络的基本概念、网络类型、网络协议、网络拓扑、网络设备以及网络地址等方面。 一、网络基本概念 计算机网络&#xff1a;将多个计算机系统和设备连接在一起&#xff0c;以实现资源共…