新手c++入门之命名空间

首先先附上一则比较有趣的漫画

首先关于创建c++项目 基本上是与c语言时相同的 不同的是项目的源文件之后的后缀要是从cpp

我们的c与c++是不分家的 也就是说在c++上我们也可以使用c语言 而c# 是与Java对抗的语言 与c无关

c语言有不方便之一就是会产生命名冲突 

通过两张图我们可以发现在添加了stdlib.h的头文件之后 我们创建rand这个变量与头文件中包含的rand函数发生了命名冲突 无法正常使用的

而如何改进这个问题 c++便有了命名空间 

通过命名空间namespace的定义便可以正常使用同名的变量 其中通过namespace定义 使用通过 对应名字::加变量名使用 如上图的bit::rand 

而命名空间也可以是嵌套定义的  

我们的查找访问顺序是 1.局部域 2. 全局域

在命名空间域未展开的情况下是不会去访问我们的命名空间的 这就想一个比较的有趣的例子   我们需要去摘一些菜 我们首先是从自家菜地中找 若是自家菜地没有 就取外面的野地里查看有没有 若是野地也没有那就是找不到了 而这是未展开的命名空间就相当于别人家的菜地 虽然里面有菜 但是我们没有主人的允许无法采摘

命名空间中我们可以定义很多东西 有变量 函数 结构体 都可以放在命名空间中

在使用时 结构体的使用是有略微不同的 

在使用命名空间中的结构体时 我们格式应该是 struct bit::p vv;  而不是 bit::struct p vv ;

 假设我们在与别人合作项目时 我们的命名空间 与别人的命名空间的名字一致时会不会发生错误呢? 答案是不会的 应该相同的命名空间会默认自动发生合并 

例子 如张大爷家有两块菜地 虽然两块菜地 种这不同的蔬菜 但是都是张大爷家的 而我们在自家地和野外菜地都找不到菜 在没有张大爷的允许下依旧是不能访问张大爷的两片菜地

但是如果两个同名的命名空间中存在同名的内容 如同名的变量 函数 结构体 这是就会发生错误 是无法正常合并使用的

命名空间的使用  在多次重复使用命名空间中的内容时 每次都要访问bit:: 这样感到很烦 那么有没有便利的方法使我们不通过bit::访问也可以使用 命名空间中的内容呢?

第一种方法就是展开命名空间 格式是:using namespace 空间名;

 

这是我们不去bit::访问也可以正常使用了 

但是这种全部展开命名空间在之后的工作和项目中时很麻烦的 会遇到风险 (当然我们在自己写的一些练习中展开式没事的)

因此还有第二种方法

通过using bit::ran;指定展开一个内容 这样就可以减少出现错误的风险了

在通过展开的命名空间后 

我们的编译在查找一个内容的默认顺序 是1.局部域 2.全局域 3.展开的命名空间域

也就是说我们得到了张大爷的允许 我们可以进入张大爷的菜地中摘菜了 而全部展开就相当于我们可以摘张大爷家的所有种类的菜 而指定展开就相当于我们只能摘张大爷家的指定展开的菜 而菜地中的其他菜我们依旧是不能采摘的 

那么我们在展开空间时 与外界的同名的变量 函数等可能会产生冲突吗  答案是不怕的 我们会按照默认的顺序去寻找 而且同名的变量在是局部域使用的会在使用其功能时也会智能使用局部域中的功能 使用命名空间域中的定义时也会智能的从命名空间域中去使用操作其功能

但是当我们两个命名空间都展开 若命名空间有同名内容 就会发生报错 这也是说我们在使用命名空间是尽可能不要随意全部展开

这也就是大家可能在初学c++会发现样例代码中通常第一行时#include<iostream>

第二行是using namespace std;  0

而std就是我们的c++定义的标志的命名空间 ;

在我们的c++中 输出和输入也是发生了变化不再是printf和scanf 而是 cout和cin 

cin的输入格式是 cin >>  ;  而cout的输出格式是 cout << ; 而且相较于printf和scanf我们不需要再去%d来确定变量的类型 cin 和cout 会自动判断要处理的内容类型 也是比较方便

而在我们自己的源文件练习过程中 我们的cout cin 以及printf 和scanf是可以混合使用的 但在正式的项目和比赛还是不要混合使用 而且cout 和cin 的运行速度是要比 printf和scanf运行速度慢的

在头文件中 我们也可以使用#include<bits/stdc++.h>这个是万能头文件 是将大部分的c++的头文件全部展开的 这个头文件也是应用于一些自己的练习和比赛中的  在工作中时不要用万能头文件的 听老师说会被骂死的 !

接下来 我们在介绍一个缺省参数 这是也是c++中比较便利的地方

我们在定义函数是是由实参和形参的 我们可以给我们的形参定义对应的默认值 如果我们的实参传过来是 就使用实参 而我们的实参没有传入是 这是我们的缺省参数就会代替形参去使用

缺省参数可以有多个 也可以只传一个 也可以都不传实参

 但是我们传实参必须是顺序传 不能跳跃传 这样会产生歧义 

全缺省就是给每个形参都加入默认值  而半缺省则是只有部分形参加入默认值 而且半缺省加入默认值时必须是从右向左缺省 

从左向右缺省可能会产生歧义

这是一个半缺省参数使用 

这次的内容就到这里 若有不足还望指正

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值