C++初阶入门之命名空间和缺省参数的详细解析

news2024/9/27 2:55:28

个人主页:点我进入主页

专栏分类:C语言初阶  C语言进阶  数据结构初阶    Linux    C++初阶    

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂

目录

一.前言

二.命名空间 

2.1命名冲突的例子

2.2解决方案

2.3命名空间的使用

2.3.1命名空间嵌套使用

2.3.2命名空间在结构体中的使用

2.3.3命名空间中函数的引用

2.3.4命名空间的展开

三.缺省参数

3.1缺省参数是什么

3.2缺省参数应用场景

四.总结


一.前言

        在前面我们学过C语言,在这里我们就要进入我们的C+ +环节,说到C++我们不得不说说的我们的C++祖师爷Bjarne Stroustrup,当我们学完C++后你不得不感叹祖师爷真的是祖师爷,他的思想是真的牛。在这篇文章中我们将涉及到命名空间,缺省参数,半缺省参数,其中的内容真的是非常的good。

二.命名空间 

2.1命名冲突的例子

        在一个很大的工程中,我们的代码是非常非常的多,甚至能达到几百万行,由于代码是很多人进行编写,就会造成我们的命名冲突,还记得c语言中我们有一个代码是

#include<stdio.h>

int x=1;

int main()
{
    int x=0;
    printf("%d\n",x);
    return 0;
}

我们可以看到我们的变量x即是全局变量又是局部变量,我们的输出结果是0,说明程序是先检测局部变量,再检测全局变量,在我们的程序编写中命名冲突会带来很严重的影响,我们看下面代码:

#include<stdio.h>
#include<stdlib.h>

int rand = 1;
int main()
{

	return 0;
}

我们可以看到出现了报错

在我们的stdlib.h的文件中有一个函数的名字是rand,我们定义了一个全局变量是rand,因此发生了重定义的现象,还有一种我们的一个程序

一个人写的是

struct SNode {
	int*a;
	int size;
	int capacity;
};
void Init(struct SNode*s)
{
	//..
}
void Push(struct SNode* s)
{

}

另一个人写的是

struct QNode {
	int val;
	struct QNode* next;
};
void Init(struct QNode* q)
{

}
void Push(struct QNode* q)
{

}

我们可以看到他们的函数名字相同,从而引发了错误。

2.2解决方案

        在以上的集中问题中,祖师爷在设计c++中给出了完美的结局方案,那就是我们的命名空间,这个需要我们的关键字namespace,命名空间相当于一个带有门锁的房子,当这个门锁打开时它就是全局变量。例如下面的代码:

#include<iostream>
namespace bite1 {
	int x = 1;
}
namespace bite2
{
	int x = 2;
}
int main()
{
	std::cout << bite2::x << std::endl;
	std::cout << bite1::x << std::endl;
	return 0;
}

我们的运行结果为

命名空间完美解决了命名冲突的问题。

2.3命名空间的使用

2.3.1命名空间嵌套使用

        在上面我们就是一个命名空间的使用,命名空间可还可以嵌套使用,例如下面:

#include<iostream>
namespace bite1 {
	int x = 1;
	namespace bite2
	{
		int x = 2;
	}
}

int main()
{
	std::cout << bite1::bite2::x << std::endl;
	return 0;
}

我们的运行结果为2.

2.3.2命名空间在结构体中的使用

#include<iostream>
namespace bite1 {
	struct SNode {
		int data;
	};
}

int main()
{
	struct bite1::SNode s;
	s.data = 1;
	std::cout << s.data << std::endl;
	return 0;
}

        我们的结构体在一个命名空间中,我们想定义一个接着结构体的变量,我们的定义方式不是先写命名空间的名字,需要我们先写struct,当然我们也可以写成bite1::SNode s,这是因为struct是类,至于类是什么可以看我后面的文章,我将会给大家进行详细解析。

2.3.3命名空间中函数的引用

namespace bite {
	int Add(int x, int y)
	{
		return x + y;
	}
 }

int main()
{
	int ret = bite::Add(1, 2);
	std::cout << ret << std::endl;
	return 0;
}

在使用函数时我们需要加上我们的命名空间域,当然我们的声明和定义分离时我们需要在命名空间的函数声明,在外面进行定义。

2.3.4命名空间的展开

        命名空间能全部展开,也能部分展开,在全部展开时我们们需要我们的using namespace 名字,对其进行展开,我们知道在寻找变量时是先找局部再找全局,由于namspace定义的既不是局部又不是全局,他是一个单独的,当我们加入这句话后就可以进行访问,它也就变成了全局,例如我们经常使用的using namespace std;就是将iostream文件中的std中的函数(cout,endl等)变更成全局的。例如下面的代码就是我们进行展开。

#include"test.h"
using namespace std;
using namespace bite;
int main()
{
	int ret = Add(1, 2);
	cout << ret << endl;
	return 0;
}

我们知道如果将这些全部展开相当于namespace就白白出现了,所以在我们的工作中我们通常是不会使用using namespace 名字的,但是我们有时候会经常使用一些,例如我们经常使用bite中的Add函数,但是我们却不想将bite中其他的进行放开,所以就出现了我们部分放开,

#include"test.h"
using bite::Add;
int main()
{
	int ret = Add(1, 2);
	std::cout << ret << std::endl;
	return 0;
}

三.缺省参数

3.1缺省参数是什么

        缺省参数是C++一种特有的参数形式,遵循从右到左进行给值,声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。(也就是说我们在定义函数时我们没有进行传参,这个函数也能正常编译,它的值是我们写函数是预设的值)。例如下面的代码:

#include<iostream>
int Add(int x = 1, int y = 2)
{
	return x + y;
}

int main()
{
	std::cout << Add(3, 3) << std::endl;
	std::cout << Add(3) << std::endl;
	std::cout << Add() << std::endl;
	return 0;
}

我们运行后可以看到

所以我们知道了缺省参数当我们给值是,它正常运行,当我们不给值时它按照预定的值进行给值,我们需要注意我们打缺省参数定义的函数需要从右向左进行设定值,我们传参时需要从左向右进行传参,否则会出现错误。

3.2缺省参数应用场景

        在我们顺序表中,我们需要进行初始化和扩容,在那我们初始化为4,这是一个固定的数据,假如我们初始的数据为300,1000等这就会造成扩容多次,所以在那里我们就需要我们的半缺省参数,代码如下:

#include<iostream>
struct SNode {
	int* a;
	int size;
	int capacity;
};

void Init(SNode* s1, int x = 4)
{
	s1->a  = (int*)malloc (sizeof(int) * x);
	s1->size = 0;
	s1->capacity = x;
}

int main()
{
	SNode s;
	Init(&s, 10);
}

        我们通过修改我们的初始值的大小来改变我们初始的空间的大小,在这里缺省参数有很重要的作用,半层参数就是没有全部对参数进行赋值,上面这段代码就是半缺省参数,我们的s1没有进行赋值,半缺省参数我们一定要遵行从右向左进行赋值,从左向右给值。

四.总结

        我们需要知道命名空就相当于一个房子,只有这块房子才有访问的权限,我们只有通过using进行权限的打开就像Linux中的chmod进行权限的修改一样,命名空间在我们的以后工作中有非常重要的作用,其能极大程度上避免命名冲突的问题,我们的缺省参数也有非常重要的作用,希望大家可以认真学习一下,最后希望大家可以一键三连一下。

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

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

相关文章

机器学习---无偏估计

1. 如何理解无偏估计 无偏估计&#xff1a;就是我认为所有样本出现的概率⼀样。 假如有N种样本我们认为所有样本出现概率都是 1/N。然后根据这个来计算数学期望。此时的数学期望就是我们平常讲 的平均值。数学期望本质就 是平均值。 2. 无偏估计为何叫做“无偏”&#xff1…

设计模式-生成器设计模式

什么是生成器设计模式 众所周知我们设计代码的时候要将代码设计出模块化的&#xff0c;一个功能是一个模块&#xff0c;那么生成器设计模式&#xff0c;是将一个类再度进行了一个拆分&#xff0c;让一个类的内部进行了单一职责化&#xff0c;其实我们在平时开发的时候就会不经…

【QT+QGIS跨平台编译】之七:【libjpeg+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、libjpeg介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libjpeg介绍 libjpeg是一个广泛使用的jpeg图像压缩和解压的函数库,采用 C 语言开发。 2013年1月,Independent JPEG Group发布了版本9,对新引入的无损编码模式进行了改进。2022年1月,发布了版…

Python可执行文件的转换

当开发者向普通用户分享程序时&#xff0c;为了方便用户在未安装Python环境的情况 下能够正常运行&#xff0c;需要将开发好的程序进行打包&#xff0c;转换成用户可运行的文件类 型。本节将介绍在Windows和Linux两种系统下&#xff0c;将Python类型的文件转换成可执 行文件的方…

搞定JACOCO企业实战!实现测试左移!

如何将JACOCO应用到企业实战中&#xff1f; 前言 1、下载 jacoco 官网&#xff1a;https://www.jacoco.org/jacoco/index.html 2、拷贝 jar 包 3、启动 jacocoagent&#xff0c;监控被测项目 java -javaagent:jacocoagent.jarincludes*,outputtcpserver,port6300,addressloca…

Open CASCADE学习|长方体的Brep数据

pload ALL box thebox 1 2 3 dump thebox *********** Dump of thebox ************* Shape : 34, FORWARD Dump of 34 TShapes 一共34个Tshapes&#xff0c;存储如下图所述的拓扑数据 ----------------- Flags : Free, Modified, Checked, Orientable, Closed, Infinit…

PyTorch初探:基本函数与案例实践

正文&#xff1a; 在熟悉了PyTorch的安装和环境配置后&#xff0c;接下来让我们深入了解PyTorch的基本函数&#xff0c;并通过一个简单的案例来实践这些知识。 1. 基本函数 PyTorch的核心是张量&#xff08;Tensor&#xff09;&#xff0c;它类似于多维数组&#xff0c;但可以…

野火霸道V2学习笔记

野火霸道V2学习笔记 STM32F103学习笔记说明基础配置配置KeilMDK配置串口下载程序美化Keil界面配置VScode 理论知识STM32命名方式例子 置位与清零GPIOGPIO简介GPIO和引脚的区别引脚的分类 GPIO 框图讲解保护二极管推挽输出开漏输出补充: 高阻态与悬空复用功能输出输入模式GPIO框…

SkiaSharp:.NET强大而灵活的跨平台图形库

在.Net 6之前&#xff0c;我们一般是使用System.Drawing.Common来生成图像。 但在.Net 6平台需要配置&#xff0c;才能在非Windows平台使用System.Drawing.Common。而从.Net 7开始&#xff0c;非Windows不再允许使用&#xff0c;官方也给我们推荐了几个替代库。 今天我们一起来…

兄弟HL-1208黑白激光打印机清零方法

兄弟HL-1208黑白激光打印机基本参数&#xff1a; 产品类型&#xff1a;黑白激光打印机&#xff08;定位类型家用&#xff09; 最大打印幅面&#xff1a;A4 最高分辨率&#xff1a;600600dpi 黑白打印速度&#xff1a;20ppm 内存标配&#xff1a;1MB&#xff0c;最大&#…

代码随想录算法训练营29期|day31 任务以及具体安排

理论基础 关于贪心算法&#xff0c;你该了解这些&#xff01; 题目分类大纲如下&#xff1a; #算法公开课 《代码随想录》算法视频公开课 (opens new window)&#xff1a;贪心算法理论基础&#xff01; (opens new window),相信结合视频再看本篇题解&#xff0c;更有助于大家…

廖雪峰Python教程实战Day 2 - 编写Web App骨架,运行后不显示网页如何解决

教程代码如下&#xff1a; import logging; logging.basicConfig(levellogging.INFO)import asyncio, os, json, time from datetime import datetimefrom aiohttp import webdef index(request):return web.Response(bodyb<h1>Awesome</h1>)asyncio.coroutine de…

快速幂算法详解

目录 介绍 原理1 实现过程 原理2 取余运算 介绍 快速幂算法的目的就是让计算机很快地求出&#xff0c;暴力相乘的话&#xff0c;电脑要计算b次。用快速幂&#xff0c;计算次数在级别&#xff0c;很实用。 原理1 (1)如果将a自乘一次&#xff0c;就会变成。再把自乘一次就…

VR拍摄+制作

1.VR制作需要的图片宽高是2:1&#xff0c;需要360✖️180的图片&#xff0c;拍摄设备主要有两种&#xff1a; 1&#xff09;通过鱼眼相机拍摄&#xff0c;拍摄一组图片&#xff0c;然后通过PTGui来合成(拍摄复杂) 2&#xff09;全景相机&#xff0c;一键拍摄直接就能合成需要的…

【智能家居】6、语音控制及网络控制代码实现

一、语音控制 1、指令结构体编写 这个结构体定义了一个命令输入的模型。在这个模型中,包含以下几个部分: cmdName:一个长度为128的字符串,用于存储命令名称。dvicesName:一个长度为128的字符串,用于存储设备名称。cmd:一个长度为32的字符串,用于存储具体的命令。Init:…

南卡Neo2评测:实力诠释骨传导耳机全能旗舰,细节展现匠心之作

前段时间朋友让我帮他寻找一款佩戴舒适、音质体验好的蓝牙耳机&#xff0c;因为比较忙所以一直把这件事搁置了&#xff0c;刚好这两天比较闲&#xff0c;所以也是在综合个人的经验和目前较为热门的一些品牌款式&#xff0c;决定帮他寻找一款骨传导耳机&#xff0c;因为骨传导耳…

手机视频压缩怎么压缩?一键瘦身~

现在手机已经成为我们日常生活中必不可少的工具&#xff0c;而在手机的应用领域中&#xff0c;文件的传输和存储是一个非常重要的问题。很多用户都会遇到这样一个问题&#xff0c;那就是在手机上存储的文件太多太大&#xff0c;导致手机存储空间不足&#xff0c;那么怎么在手机…

docker-compose Install influxdb1+influxdb2+telegraf

influxd2前言 influxd2 是 InfluxDB 2.x 版本的后台进程,是一个开源的时序数据库平台,用于存储、查询和可视化时间序列数据。它提供了一个强大的查询语言和 API,可以快速而轻松地处理大量的高性能时序数据。 telegraf 是一个开源的代理程序,它可以收集、处理和传输各种不…

[Python] 如何在Windows下安装图形可视化工具graphviz

什么是graphviz? Graphviz是一款开源的图形可视化工具&#xff0c;用于生成各种结构化数据的图形表示。它支持多种图形排列算法&#xff0c;可以将复杂的数据关系用图形的方式直观地展示出来。Graphviz广泛应用于软件工程、数据可视化、计算机网络以及其他领域的可视化分析中…

SpringBoot之时间数据前端显示格式化

背景 在实际我们通常需要在前端显示对数据操作的时间或者最近的更新时间&#xff0c;如果我们只是简单的使用 LocalDateTime.now()来传入数据不进行任何处理那么我们就会得到非常难看的数据 解决方式&#xff1a; 1). 方式一 在属性上加上注解&#xff0c;对日期进行格式…