C++语法(1)

发布于:2022-12-03 ⋅ 阅读:(131) ⋅ 点赞:(0)

1.命名空间

对比c语言,c++拥有一个更强大的域。c语言中,在哪个作用域中定义变量,那么这个变量的周期仅仅存在于相应的作用域中。

情况1

如图,该主函数打印的是在main()中的a,意味着,编译器优先看作用域中是否有这个变量,再往全局变量里面找,这是我们就有疑惑?那我们不就取不到全局变量的a了吗?这种情况下,a确实取不到。

情况2

 c++不同,c++用了一个 “ :: ” 符号就能完成对全局变量的实现。这个符号是域作用限定符,它的前面写作用域范围,而现在前面为空,说明作用域在全局。

命名空间

1.定义

作用域跟域作用限定符的作用是怎么样的呢?试想这样一个情景,a员工和b员工写了两个不一样的交换函数(Swap),当项目要合并时,发现他们两个的函数名字定义重了。好尴尬,这个时候谁改呢?c语言去解决无非就是改名字,这种情况过于繁琐。

 这时,C++有一个命名空间的定义,它是用来存放变量的。它是对标识符的名称进行本地化, 以避免命名冲突或名字污染的。

第一个rand是c库里展开后的全局rand函数,输出的是函数的地址。

第二个rand是c++定义的命名空间bit,这个rand通过域作用限定符把bit的域中rand变量取出。

定义命名空间中的变量的作用域是全局,临时变量的作用域存在于非全局的域中定义,因为命名空间不在非全局里,所以是全局变量。但是为什么不能直接访问也算全局呢?其实是这样的,命名空间的变量确实是全局变量,不然不能完成在不同的函数中调用,如果是临时就说不通了,它之所以不能直接访问其实就是设计为了避免由于命名重复导致的冲突。

2.使用

命名空间可以定义变量,可以定义函数,更可以嵌套命名空间。

ps:这样也完美解决了之前swap函数功能一样,但是写的不一样的尴尬情况。

相同命名空间的在同一文件时会合并,并且在同一个工程,相同名字的多命名空间会C++会合并命名空间的内容。

特殊的,名称访问这些函数前面都要加一个namespace::会不会一些时候特别麻烦,此时可以用using来打破限制,这里会结合输入输出来具体讲解。

输入和输出

输入:

在c++中,c++的函数名都被装在std这个命名空间中。

打印某个东西到屏幕上便是:std::cout << "XXX" << std::endl;可喜的是,这个输出函数可以自动识别不同类型的类型。其中“ :: ”是解除限制得到命名空间的对应的函数,cout指的是控制台输出,它意味着输入的数据在屏幕上输出显示,而“<<”是流插入运算符 。

 输入:

想要手动获取某个数,只要输入std::cin >> a;当然输入的值跟定义的变量匹配。等价于c中scanf函数。

如果要打很多行“std::cout << "XXX" << std::endl”,光是std::就打了很多次,所以我们可以用using来打破限制。如下,此时我们直接cout便可。

 using namespace XXX:该代码作用是将原本命名空间解除限制,不过如果std全部解除限制,可能会发生想前面讲过命名重复的危险,所以我们还可以部分解除限制,即using N::b;演示如下。

2.缺省参数

缺省参数:是声明或定义函数时为函数的参数指定一个缺省值。

 缺省可以传或者不参数,不传则,未默认的数据;反之,则是自己传入的参数进入函数。

优点示范:Stack数据结构本来通过动态开辟,其实限制很多,如果我们知道数据有多少个要存放的,那我们在c中只能通过宏来开辟,但是缺省可以完美解决问题:它通过缺省默认开辟4个空间,如果有确定的,只要传入参数即可。 

1.缺省函数如果需要传入参数会根据从左到右向缺省函数中代入,不可以跳跃。

2.缺省可以部分缺省,不过顺序遵循从右到左。

3.缺省不能在函数声明和定义中同时出现

如图,不能在申明与定义同时存在缺省。这是为什么?主要是编译器怕我们在声明处变量定义a,定义处变量定义b,此时编译器也分不清楚执行哪个。所以编译器统一认为,在申明处使用缺省其他处不使用。

3.函数重载

简单讲,就是,同名的函数,但是由于参数个数,参数类型,参数的顺序不同便能够同时存在。

1.类型不同

其实,仔细向cout可以自动识别类型也跟函数重载有关系。

2.个数不同

3.顺序不同

这里的顺序不同不是指,把a和b两个参数的名字换一下。而是讲不同类型的顺序换一下,其实本质就是相同位置把不同类型导致的重载。

4.函数重载和缺省的连用导致的二义性

对于编译而言,二者的确由于参数的数目不同构成函数重载。但是从最后调用fun()函数时,别说编译器了,我们也有一个问题,我们到底用的是哪个函数,没有传入参数说明二者其实都可以用。所以使用这两个函数前,存在二义性,导致编译通过但是最后运行过不了。

所以,在使用缺省参数和函数重载时需要考虑考虑是否会函数重载。

原理和引入:

那么,重载是怎么实现的?编译器怎么确认自己使用的是哪个重载函数?

首先要明白,编译器是怎么找到函数的,当编译器运行到指定的函数时,它会去找内存对于的函数地址。那是在哪找函数名的呢?c中,编译器在代码汇编阶段生成符号表,而函数则是被记录了函数名和函数所在地址,所有编译器找函数是先在符号表里确认位置再调用对于地址的函数。c++为了实现函数的重载,它需要对函数中的参数也进行记录,假设编译器这样的:它读到fun(),前面不加东西;碰到fun(int a),它在前面加了个i符号进行跟fun()区分,这样,监测到函数和对应的参数时,编译器调用指定的重载函数。(所以,这时我们还能解决一个问题,c++能区分返回参数不同的同名函数吗?答案是不能,因为传入的代表没有包括对于返回参数描述,那编译器不能确定返回类型返回什么,仍然存在二义性。) 


网站公告

今日签到

点亮在社区的每一天
去签到