目录
💕1.C++中main函数内部———变量的访问顺序
💕2.命名空间域namespace
💕3.命名空间域(代码示例)(不要跳)
💕4.多个命名空间域的内部重名
💕5.命名空间域的展开
💕6.展开的本质
💕7.输入输出流(IO)
💕8.缺省函数
(最新更新时间——2025.1.9)
魔不魔 正不正 天地自有风九歌
走不走 留不留 死生皆在我心头
💕1.C++中main函数内部———变量的访问顺序
在C++中,main函数内部的变量的访问是有顺序存在的,其顺序分别为(从高到低):->
局部变量——全局变量——命名空间域
具体是什么意思?请看代码:
在局部变量与全局变量都存在时,main函数会优先访问局部变量,这也叫做局部优先原则
但如果不存在局部变量a=10呢?
当局部变量被去除后,main函数内部还是会遵循访问顺序来访问,但是它访问不到局部变量a,所以它就会去访问全局变量a
但这又是什么原因呢?有的人肯定会认为,这是因为rand是一个随机函数,创建rand变量就会与函数重名,但是这种原因是半对的,接着请看下图:->:
我把rand放在这里又可以打印出来了,这是为什么?
其实真正的原因是,在全局变量的rand与头文件#include<stdlib.h>是在同一作用域下,(即全局作用域),在同一作用域下的rand函数与rand变量命名重复,所以才会出现第一种报错的情况
关于第二种情况,则是作用域不同导致的,因为rand函数作用在全局作用域,rand变量作用在局部作用域,所以,作用域不同,它们的效果也不同
那么,有没有一种方法,可以解除第一种情况呢?答案是有的,请看一下讲解:->:
💕2.命名空间域 namespace
什么是命名空间域?
在C++中,每一个命名空间域就相当于一个田地,在这个田地中可以有各种东西,如变量,结构体,函数等等,而你可以给这个田地命名,让它变为独一无二的田地(命名作用域),
命名空间域的书写:
namespace 专属名 {//任意 }
我们以第一大点中错误的rand命名为例
如图所见,我们创建了命名空间域abc,在执行printf时,会优先在局部变量中找,找不到,再去全局变量,又找不到,最后去命名作用域找
注意:->我们在调用命名作用域时,运用到了 abc:: ,这表示访问命名作用域中的abc,当我们访问除了局部变量时的作用域,都可以这么表示,全局变量同理,如下图:
如图,在我们想用 ::访问全局变量时,需要注意的是::前面是有一位空格的
💕3.命名空间域(代码示例)(不要跳)
接下来是命名空间域的实际代码举例,包括(函数,结构体),以及命名作用域的嵌套
1.首先是 函数以及结构体 的调用方法
2.命名空间域的嵌套
💕4.多个命名空间域的内部重名
多个命名空间域可以在各自的内部重名吗?答案是可以的,因为每一个命名空间域都相当于一个菜园子,你的菜园子有变量A,我的菜园子就不能有了吗?那么代码举例如下:
如图可见,不同命名空间域的内部是可以重名的,但是每一个命名空间域是不可以重名的,除非使用命名空间域嵌套-给重名的命名空间域分开
💕5.命名空间域的展开
在我们写main函数时,每使用一次命名空间域都要写一次a::,是不是很麻烦,如图:
有没有一种方法,可以不这么麻烦呢?答案是有的兄弟,有的,像这么强的操作还有9....,
1种方法
那就是展开命名空间域
我们使用
using namespace 空间域名
来进行展开
如图,我们就不要再使用a::来访问了
但如果我们只想展开其中的一个呢?
代码如下:
using 空间域名::空间域变量
这里就单独展开了空间作用域a中的b,再举一个例子,单独展开空间作用域里的函数或者结构体,先是展开函数,后是展开结构体
💕6.展开的本质
在C++中,使用using展开的本质是将命名空间域展开到全局作用域中,举例如下:
这是不展开的情况:可以看到没有报错,逻辑也符合我们所讲的,作用于全局作用域
但如果我们展开了呢?
如图,就会发生错误,因为展开后的空间作用域相当于变为了全局作用域,而变量的访问顺序是局部,全局,空间作用域,展开后的全局作用域中有两个相同名称的函数,那么main函数内部就会不知道调用哪个add函数
💕7.输入输出流(IO)
在C++中,创建了新的输入和输出,它们的书写方式是:->
#include<iostream>
using namespace std;
int main()
{ int i = 0;int j = 0;cout << 20 << '\n' << 30 << '\n' << endl;//输出20,30 '\n'是换行cin >> i >> j;//输入 i jcout << i << " " << j << endl;//输出 i 空格 j
}
效果如下:
接下来是逐步讲解:
1.为什么要用using space std;
答案:->:因为#include<iostream>是一个标准头文件,而这个头文件,其实是一个巨大的空间域 ,因此在使用时,我们需要先展开空间域std,否则就需要写成:
#include<iostream> int main() { int i = 0;int j = 0;std::cout << 20 << '\n' << 30 << '\n' << std::endl;//输出20,30 '\n'是换行std::cin >> i >> j;//输入 i jstd::cout << i << " " << j << std::endl;//输出 i 空格 j }
2.cout是什么,cin是什么?
cout与cin都是空间域std里面的函数,cout表示输出除去,cin表示输入进来,当然如果各位不想用,printf与scanf也是可以正常使用在C++中的
3.endl是什么?
这里的endl,(注意不是end1,是英文L),endl在C++中表示的就是换行的意思
💕8.缺省函数
什么是缺省函数?
缺省函数是C++中的一种函数,它支持了你在给函数传参时不需要将所有参数都传过去,代码如下->:
我们发现,即使什么都没传过去,也依旧输出了200,而且我们在创建函数时,将形参初始化了
而这种每个函数在接收处都初始化的函数,叫做全省函数
有部分初始化的叫做半缺省函数,如下:
半缺省函数,需要从右往左缺省,不可以从左往右缺省,因为没有初始化的形参是必须传入值的,如果从左往右缺参,那就意味着我们不得不全部传参一遍
所以半缺省函数是要从右往左缺省的
那有的人问了,诶?那我跳着传不就可以了,但其实这是不可以的,代码如下:
答案显而易见,必须顺序传,不能跳跃着传