ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

C++ 入门核心语法详解:命名空间、输入输出、缺省参数、函数重载、引用、inline 与 nullptr

C++ 入门核心语法详解:命名空间、输入输出、缺省参数、函数重载、引用、inline 与 nullptr 目录一、命名空间 namespace二、C 输入与输出三、缺省参数默认参数四、函数重载五、引用六、inline 内联函数七、nullptr 空指针一、命名空间 namespace1. 作用防止命名冲突。当项目规模变大、多人协作或引入第三方库时不同模块中很容易出现同名变量、函数或类型命名空间通过域隔离来解决这一问题。2. 定义定义方式namespace 名称 {}。C 中的域有函数局部域、全局域、命名空间域和类域。域影响的是编译时语法查找一个变量、函数或类型出处声明或定义的逻辑有了域隔离名字冲突就解决了。局部域和全局域除了影响编译查找逻辑还会影响变量的生命周期命名空间域和类域不影响变量生命周期。命名空间只能定义在全局而且可以嵌套定义。不同文件中定义相同名字的命名空间会自动合并为一个。C 标准库都被放在一个名为std的命名空间中。3. 使用编译查找一个变量的声明或定义时默认只会在局部或全局查找不会到命名空间里面去查找所以直接使用命名空间中的变量或函数会编译报错。要使用命名空间中定义的变量或函数有三种方式指定命名空间访问例如my_namespace::a项目中推荐这种方式。using 将命名空间中某个成员展开例如using my_namespace::a项目中经常访问且不存在冲突的成员推荐这种方式。展开命名空间中全部成员例如using namespace std;项目不推荐冲突风险很大日常小练习程序为了方便推荐使用。二、C 输入与输出iostream是标准的输入、输出流库定义了标准的输入、输出对象。std::cin是istream类的对象主要面向窄字符的标准输入流。std::cout是ostream类的对象主要面向窄字符的标准输出流。std::endl是一个函数流插入输出时相当于插入一个换行字符并刷新缓冲区。是流插入运算符是流提取运算符。可以把cout ...记为把内容插入到控制台cout中把cin ...记为把控制台cin的内容提取到变量中。使用 C 输入输出更方便不需要像printf/scanf那样手动指定格式C 的输入输出可以自动识别变量类型本质是通过函数重载实现的。更重要的是C 的流能更好地支持自定义类型对象的输入输出。三、缺省参数默认参数1. 定义缺省参数是声明或定义函数时为函数的参数指定一个缺省值。调用该函数时如果没有指定实参则采用该形参的缺省值否则使用指定的实参。分为全缺省参数和半缺省参数。2. 全缺省全部形参都给出缺省值。3. 半缺省部分形参给出缺省值且规定必须从右往左依次连续缺省不能间隔跳跃给缺省值。4. 调用规则带缺省参数的函数调用规定必须从左到右依次给实参不能跳跃给实参。5. 声明与定义分离函数声明和定义分离时缺省参数不能在函数声明和定义中同时出现规定必须由函数声明给缺省值。四、函数重载C 支持在同一作用域出现同名函数但要求这些同名函数的形参不同可以是参数个数不同或参数类型不同。仅仅只有返回值类型不同不构成函数重载。五、引用1. 概念和定义引用不是新定义一个变量而是给已存在的变量取一个别名且引用与被引用的变量共同使用一块内存空间。2. 引用的特性引用在定义时必须初始化。一个变量可以有多个引用。引用一旦引用了一个实体就不能再引用其他实体。3. 引用的使用引用在实践中主要用于传参以及做返回值来使用。引用传参和指针传参的功能类似但引用传参更方便。4. const 引用可以引用一个const对象但必须用const引用。const引用也可以引用普通对象因为对象的访问权限在引用过程中可以缩小但不能放大。类似int rb a * 3;或double d 12.34; int rd d;的场景中a * 3保存在一个临时对象中int rd d在类型转换的过程中也会产生临时对象存储中间值。也就是说rb和rd引用的都是临时对象而 C 规定临时对象具有常性所以这两段代码触发了权限放大。应该改为const int rb a * 3;和double d 12.34; const int rd d;。临时对象编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象。5. 指针和引用的关系在语法概念上引用是一个变量的取别名不开空间指针是存储一个变量的地址要开空间。引用必须初始化指针建议初始化但不是必须的。引用在初始化时引用一个对象之后就不能再引用其他对象但指针可以不断改变指向对象。引用可以直接访问指向对象指针需要解引用才可以访问指向对象。sizeof含义不同引用的结果为引用类型的大小指针始终是地址空间占用的字节数32 位下 4 字节64 位下 8 字节。指针很容易出现空指针和野指针引用很少出现更安全。六、inline 内联函数用inline修饰的函数叫做内联函数。编译时 C 编译器会在调用的地方展开内联函数这样调用内联函数就不需要建立栈帧从而提高效率。inline对于编译器只是一个建议编译器会自行判断是否展开。设计inline是为了替代 C 语言的宏函数。VS 编译器 debug 版本下默认不展开inline这样方便调试。inline不建议声明和定义分离到两个文件分离会导致链接错误。因为inline被展开后没有函数地址链接时会出现报错建议直接放在.h文件中。七、nullptr 空指针nullptr是 C11 才有的。它可以转换为任意其他类型的指针类型。使用nullptr定义空指针可以避免类型转换的问题因为nullptr只能被隐式地转换为指针类型而不能被转换为整数类型。以后 C11 版本及以后的代码都用nullptr就可以了。
返回列表