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

个人主页:点我进入主页

专栏分类: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.rhkb.cn/news/249405.html

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

相关文章

MyBatis概述与MyBatis入门程序

MyBatis概述与MyBatis入门程序 一、MyBatis概述二、入门程序1.准备开发环境&#xff08;1&#xff09;准备数据库&#xff08;2&#xff09;创建一个maven项目 2.编写代码&#xff08;1&#xff09;打包方式和引入依赖&#xff08;2&#xff09;新建mybatis-config.xml配置⽂件…

node.js(nest.js控制器)学习笔记

nest.js控制器&#xff1a; 控制器负责处理传入请求并向客户端返回响应。 为了创建基本控制器&#xff0c;我们使用类和装饰器。装饰器将类与所需的元数据相关联&#xff0c;并使 Nest 能够创建路由映射&#xff08;将请求绑定到相应的控制器&#xff09;。 1.获取get请求传参…

祖传代码里的神逻辑

昨天做权限限制的需求&#xff0c;给自己配置了两个新的分组&#xff0c;然后就发现登录不了项目了&#xff0c;sql报错ORA-01795: maximum number of expressions in a list is 1000&#xff0c;一路debugger找到了元凶&#xff0c;看逻辑是想把两个不同表里的分组去重然后合并…

【CMU-自主导航与规划】M-TARE planner 配置与运行

M-TARE docker M-TARE 源码 一、依赖 Docker, Docker Compose, NVIDIA Container Toolkit, Nvidia GPU Driver&#xff08;需要至少2个&#xff0c;带Nvidia GPU&#xff09; 1.1 Docker docker -v #查询版本1.2 Docker Compose docker compose version1.3 …

分布式搜索引擎_学习笔记_3

分布式搜索引擎03 0.学习目标 1.数据聚合 **聚合&#xff08;aggregations&#xff09;**可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 什么品牌的手机最受欢迎&#xff1f;这些手机的平均价格、最高价格、最低价格&#xff1f;这些手机每月的销售…

Here Document免交互和Expect

文章目录 Here Document免交互和Expect自动化交互一、Here Document—免交互1、Here Document 免交互概述2、语法格式3、免交互的用法3.1 cat命令3.2 tee命令3.3 wc命令3.4 read命令3.5 passwd命令 4、Here Document 变量设定 二、Expect自动化交互1、expect基本使用1.1 脚本解…

【Linux】Linux基本指令

目录 1.ls指令 2.cd指令 3.touch指令 4.mkdir指令 5.rmdir指令和rm指令 5.1rmdir指令 5.2rm指令 6.man指令 7.cp指令 8.mv指令 9.cat指令 10.more指令 && less指令 10.1more指令 10.2less指令 11.head指令 && tail指令 11.1head指令 11.2tai…

【数学】【记忆化搜索 】【动态规划】964. 表示数字的最少运算符

作者推荐 【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数 本文涉及知识点 动态规划汇总 数学 记忆化搜索 LeetCoce964表示数字的最少运算符 给定一个正整数 x&#xff0c;我们将会写出一个形如 x (op1) x (op2) x (op3) x … 的表达式&#xff0c;其中每…

自动保存知乎上点赞的内容至本地

背景&#xff1a;知乎上常有非常精彩的回答/文章&#xff0c;必须要点赞收藏&#xff0c;日后回想起该回答/文章时翻看自己的动态和收藏夹却怎么也找不到&#xff0c;即使之前保存了链接网络不好也打不开了&#xff08;。所以我一般碰到好的回答/文章都会想办法保存它的离线版本…

mac安装mysql的8.0设置面板启动不了

1、前言 记得之前安装mysql5.7的时候&#xff0c;是可以直接从设置里面的mysql面板启动的&#xff0c;但是到了mysql8.0之后就启动不了了&#xff0c;这个问题不知道是版本问题还是我换了m系列芯片的mysql导致的&#xff0c;之前很多次都启动不了&#xff0c;这次搞了下&#x…

2024年1月份实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先&#xff0c;来看下效果图 在线体验地址&#xff1a;https://geojson.hxkj.vip&#xff0c;并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

字觅网“正式上线登陆中国大陆,助力全球用户畅享正版字体服务

在中国上海,专注于提供正版字体授权服务的平台"字觅网"正式宣布在中国大陆上线,为全球用户提供更广泛、更便捷的正版字体选择。 "字觅网"以致力于推动正版字体服务为核心,通过深度合作,汇聚了众多国内知名字库,包括汉标字库、上首字库、汉呈字库、名家字库…

防火墙详解

一、基本定义 所谓“防火墙”是指一种将内部网和公众访问网&#xff08;如Internet&#xff09;分开的方法&#xff0c;它实际上是一种建立在现代通信网络技术和信息安全技术基础上的应用性安全技术&#xff0c;隔离技术。越来越多地应用于专用网络与公用网络的互联环境之中&a…

BGP同步规则

BGP同步规则&#xff1a;开启同步下&#xff0c;从IBGP收到一条路由不会传给任何EBGP邻居(实验效果IBGP邻居和EBGP邻居都不传)&#xff0c;除非从自身的IGP中也学到这条路由。目的是防止AS内部出现路由黑洞&#xff0c;向外部通告了一个本AS不可达的虚假的路由。 同步规则只影响…

win11设置mysql开机自启

目录 命令式 1、打开命令提示符或 PowerShell&#xff1a; 2、使用管理员权限运行命令行工具&#xff1a; 3、设置 MySQL 服务为开机自启动&#xff1a; 4、启动 MySQL 服务&#xff1a; 5、 验证设置是否生效&#xff1a; 操作视图式 1、右击任务栏 ---> 选择任务管…

安卓网格布局GridLayout

<?xml version"1.0" encoding"utf-8"?> <GridLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:la…

【C++】类和对象(1)

上节我们学习了C入门的一些语法知识&#xff0c;这篇博客来学习类和this指针。 目录 面向过程和面向对象的初步认识 类的引入 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 类对象大小 this指针 this指针特性 面向过程和面向对象的初步认识…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之DatePicker组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之DatePicker组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、DatePicker组件 日期选择器组件&#xff0c;用于根据指定日期范围创建日期滑…

vue3开发,axios发送请求是携带params参数的避坑

vue3开发,axios发送请求是携带params参数的避坑&#xff01;今天一直报错&#xff0c;点击新增购物车&#xff0c;报错&#xff0c; 【Uncaught (in promise) TypeError: target must be an object】。查询了网上的资料说的都不对。都没有解决。最终还是被我整明白了。 网上网…

Oracle 集群】RAC知识图文详细教程(四)--缓存融合技术和主要后台进程

Cache Fusion 原理 前面已经介绍了 RAC 的后台进程&#xff0c;为了更深入的了解这些后台进程的工作原理&#xff0c;先了解一下 RAC 中多节点对共享数据文件访问的管理是如何进行的。要了解 RAC 工作原理的中心&#xff0c;需要知道 Cache Fusion 这个重要的概念&#xff0c;要…