作为C++的初学者,本文仅用作于作者的备忘录,若有写错的地方望诸位大佬指出,小弟感激不尽,稍微会写的比较细,接下来直接进入正题。
(本篇所有代码展示均是使用的coldblocks编译器)
1.命名空间
作为C++与C语言的重要区别之一,命名空间(namespace) 是C++中用于管理变量名、函数名等标识符的一种机制。顾名思义,命名空间为这些标识符提供了一个独立的存储区域,类似于全局与局部作用域。通过将变量、函数,结构体或类封装在特定的命名空间内,就像是给这片空间上了一把锁,没有指定的钥匙也就是域作用符就无法访问,可以有效的避免了变量名的冲突。
在C语言中,全局与局部的变量名相同时,在进行输出时,编译器会进行局部变量优先的原则来输出打印,在不改变变量名的情况下,我们可以通过域作用符也就是::,在该变量名前加入作用符后便可以实现了。
接下来展示代码图。
在该图中,我分别定义了一个名为 bit 的命名空间域,并通过域作用符 :: 来访问其中的变量。值得注意的是,命名空间域只能在全局作用域中定义,并且支持嵌套。
当我们在命名空间中定义了多个变量时,如果频繁使用某个变量,反复使用 bit:: 会显得繁琐。这时,可以通过 展开命名空间 来简化代码。例如,使用 using bit::c;,其中 using 表示展开,bit 是命名空间域,c 是你想要直接使用的变量。
std 是C++的标准库,using namespace std;则是我们日常练习中常见的代码,表示展开标准库中的所有内容。这与 using bit::c; 的原理一致,只不过 std 是标准库的命名空间,而 bit 是自定义的命名空间。
对于函数和结构体的使用,方法也是类似的。
如何使用嵌套定义命名空间呢?
说起这个,我就想起了C语言中的一级指针,二级指针等,本质上都是套娃使用,简单的讲就是在命名空间内再次定义一个命名空间,如图所示:
2.cin和cout
C++中,cin与cout相较于C语言中的scanf与printf基于流(stream)可以自动识别数据类型,从缓冲区内前者读取数据,后者写入。当然前者处理效率也还是比不上后者的,并且默认最多只能保留六位小数,只要要加入这串代码后可以大大提高其的io效率。
ios base::sync with stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
3.引用
在C++中引用是为已有变量创建的别名,必须在定义时初始化且不可为空。
通过直接绑定原数据,可以避免指针的复杂语法和潜在空指针风险,能高效传递参数(避免拷贝开销)、支持函数返回左值以实现链式操作,并在代码中提供更安全、简洁的变量操作方式。
4.缺省参数
在函数声明中为参数设置的默认值,调用时未传递的参数将使用默认值。它分为全缺省(所有参数为默认值)和半缺省(部分参数有默认值)。设置时需要从右往左依次并且连续,即默认值参数右侧的所有参数也必须提供默认值。
例如:
5.函数重载
C++中在同一个作用域下,函数名可以相同但是参数,个数,顺序,类型可以不同,编译器会根据调用时传递的参数自动匹配相适应的函数版本。是其通过 参数列表 的差异来实现同名函数的多态性的。
如图: