 入门核心语法详解:命名空间、IO、缺省参数、函数重载与引用)
一、命名空间namespace1.1 为什么需要命名空间在 C 语言中所有全局变量、函数都处于同一个全局作用域当项目规模较大、引入多个库时很容易出现命名冲突。比如两个库都定义了名为add的函数同时使用就会报错。C 的命名空间就是为了解决这个问题而生的它将全局作用域划分为不同的区域每个区域有自己的名字不同命名空间中的同名实体互不干扰。1.2 命名空间的定义使用namespace关键字定义命名空间大括号内可以包含变量、函数、结构体、类甚至嵌套的命名空间。注意命名空间的大括号后不需要加分号且同一个命名空间允许多次定义编译器会自动合并。1.3 命名空间的三种使用方式方式 1作用域解析符::最安全、最推荐的方式直接指定所属的命名空间。方式 2using 声明将命名空间中某个成员引入到当前作用域。日常练习中常用using namespace std;展开标准库命名空间但大型项目中不建议滥用可能重新引发命名冲突。1.4 匿名命名空间没有名字的命名空间其中的内容只能在当前文件中访问效果类似 C 语言的static用于限制全局实体的作用域。二、C 的输入与输出2.1 iostream 标准库C 不再使用printf/scanf作为首选输入输出而是提供了iostream库包含两个核心全局对象cin标准输入流对象对应键盘cout标准输出流对象对应屏幕同时配合两个运算符流提取运算符用于从输入流中读取数据流插入运算符用于向输出流中写入数据2.2 基本使用示例2.3 与 C 语言 IO 的对比特性C 语言 printf/scanfC cin/cout类型安全需要手动指定 % d、% lf 等写错易出问题自动推导类型类型安全扩展性只能输出内置类型可重载 / 支持自定义类写法格式控制繁琐链式调用写法简洁性能默认效率较高默认效率略低可通过关闭同步优化2.4 补充endl 与 \n• endl输出换行的同时刷新缓冲区频繁使用会影响性能• \n仅输出换行不会强制刷新性能更好日常开发中优先使用\n需要立即刷新输出时再用endl。小技巧如果觉得 cin/cout 慢可以在 main 开头加上这两行关闭同步三、缺省参数默认参数3.1 概念缺省参数就是在声明函数时给形参指定一个默认值。调用该函数时如果没有传入对应实参就自动使用这个默认值。3.2 全缺省与半缺省• 全缺省所有参数都给默认值调用时可以传 0~3 个参数从左到右依次匹配。• 半缺省部分参数给默认值规则缺省参数必须从右往左连续给出不能间隔跳跃3.3 注意事项声明与定义分离时缺省参数只能写在声明里定义中不能重复给默认值2.缺省值必须是常量、全局变量或常量表达式3.缺省参数可能和函数重载产生歧义使用时需注意四、函数重载4.1 概念C 允许在同一作用域内定义多个同名函数只要这些函数的参数列表不同包括参数个数、类型或类型的顺序不同这一特性被称为函数重载。函数重载大大提升了代码的可读性比如实现不同类型的加法不需要起add_int、add_double这样的名字。4.2 重载的判定规则• 函数名必须相同• 参数列表必须不同满足任意一条即可1. 参数个数不同2. 参数类型不同3. 参数类型的顺序不同• 返回值类型不同不构成重载4.3 底层原理名字修饰Name Mangling为什么 C 语言不支持函数重载C 却支持核心原因在于编译阶段的函数命名规则不同• C 语言编译后函数名就是原函数名链接时通过名字找函数同名函数无法区分• C 会根据参数列表对函数名进行重新修饰不同参数的同名函数编译后名字不同链接时可以准确区分例如上面的add函数在 g 下编译后大致会变成_Z3addii、_Z3adddd、_Z3addiii参数信息被编码进了函数名中。4.4 重载与缺省参数的歧义当函数重载遇上缺省参数可能出现二义性实际开发中要避免这种写法。五、引用Reference5.1 概念引用可以理解为给已存在的变量起一个别名它不是新定义一个变量而是和原变量共用同一块内存空间。语法类型 引用名 原变量;5.2 引用的三大特性1. 引用必须初始化2.一个变量可以有多个引用3.引用一旦绑定一个实体就不能再绑定其他实体这是引用和指针最核心的区别之一引用没有 “改指向” 的能力。5.3 常引用const 引用用const修饰的引用不能通过引用修改原变量的值。核心原则引用只能做权限的平移和缩小不能做权限的放大。普通变量可以给 const 引用权限缩小但 const 变量不能给普通引用权限放大。5.4 引用的使用场景场景 1引用做函数参数这是引用最常用的场景用来代替指针实现 “形参改变实参”写法更简洁也更安全。对于大对象结构体、类传引用还可以避免拷贝提升效率。场景 2引用做函数返回值函数可以返回引用直接返回变量本身而不是拷贝。⚠️ 重要警告不要返回局部变量的引用局部变量在函数结束后会被销毁返回它的引用会变成野引用行为未定义。5.5 引用与指针的区别引用和指针底层实现上引用本质是用指针实现的但语法层面有本质区别对比维度引用指针定义变量的别名不单独占空间语法上存储地址的变量占 4/8 字节初始化必须初始化且绑定后不可更改可以不初始化可以随时改指向空值不存在空引用存在空指针NULL/nullptr多级没有多级引用有多级指针int**自增原变量值 1指针向后偏移一个类型大小使用方式直接用无需解引用需要解引用 * 才能访问内容安全性更安全不会出现空、野的问题更灵活但容易出现野指针、越界结语以上五个特性是 C 区别于 C 语言最基础的语法特征也是后续学习类、对象、STL 等内容的前置基础。命名空间解决了命名冲突IO 提供了更安全的输入输出缺省参数和函数重载提升了函数的灵活性而引用则为高效传参、修改实参提供了更优雅的方案。掌握这些基础语法后就可以正式进入 C 面向对象的学习了。