ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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

目录

  • 一、命名空间 namespace
  • 二、C++ 输入与输出
  • 三、缺省参数(默认参数)
  • 四、函数重载
  • 五、引用
  • 六、inline 内联函数
  • 七、nullptr 空指针

一、命名空间 namespace

1. 作用

防止命名冲突。当项目规模变大、多人协作或引入第三方库时,不同模块中很容易出现同名变量、函数或类型,命名空间通过域隔离来解决这一问题。

2. 定义

定义方式:namespace 名称 {}

C++ 中的域有函数局部域、全局域、命名空间域和类域。域影响的是编译时语法查找一个变量、函数或类型出处(声明或定义)的逻辑,有了域隔离,名字冲突就解决了。局部域和全局域除了影响编译查找逻辑,还会影响变量的生命周期;命名空间域和类域不影响变量生命周期。

命名空间只能定义在全局,而且可以嵌套定义。不同文件中定义相同名字的命名空间会自动合并为一个。C++ 标准库都被放在一个名为std的命名空间中。

3. 使用

编译查找一个变量的声明或定义时,默认只会在局部或全局查找,不会到命名空间里面去查找,所以直接使用命名空间中的变量或函数会编译报错。要使用命名空间中定义的变量或函数,有三种方式:

  1. 指定命名空间访问:例如my_namespace::a,项目中推荐这种方式。
  2. using 将命名空间中某个成员展开:例如using my_namespace::a,项目中经常访问且不存在冲突的成员推荐这种方式。
  3. 展开命名空间中全部成员:例如using namespace std;,项目不推荐,冲突风险很大;日常小练习程序为了方便推荐使用。

二、C++ 输入与输出

<iostream>是标准的输入、输出流库,定义了标准的输入、输出对象。

  • std::cinistream类的对象,主要面向窄字符的标准输入流。
  • std::coutostream类的对象,主要面向窄字符的标准输出流。
  • std::endl是一个函数,流插入输出时,相当于插入一个换行字符并刷新缓冲区。
  • <<是流插入运算符,>>是流提取运算符。可以把cout << ...记为把内容插入到控制台cout中,把cin >> ...记为把控制台cin的内容提取到变量中。

使用 C++ 输入输出更方便,不需要像printf/scanf那样手动指定格式,C++ 的输入输出可以自动识别变量类型(本质是通过函数重载实现的)。更重要的是,C++ 的流能更好地支持自定义类型对象的输入输出。

三、缺省参数(默认参数)

1. 定义

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。调用该函数时,如果没有指定实参,则采用该形参的缺省值;否则使用指定的实参。分为全缺省参数和半缺省参数。

2. 全缺省

全部形参都给出缺省值。

3. 半缺省

部分形参给出缺省值,且规定必须从右往左依次连续缺省,不能间隔跳跃给缺省值。

4. 调用规则

带缺省参数的函数调用,规定必须从左到右依次给实参,不能跳跃给实参。

5. 声明与定义分离

函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须由函数声明给缺省值。

四、函数重载

C++ 支持在同一作用域出现同名函数,但要求这些同名函数的形参不同,可以是参数个数不同或参数类型不同。

仅仅只有返回值类型不同,不构成函数重载。

五、引用

1. 概念和定义

引用不是新定义一个变量,而是给已存在的变量取一个别名,且引用与被引用的变量共同使用一块内存空间。

2. 引用的特性

  1. 引用在定义时必须初始化。
  2. 一个变量可以有多个引用。
  3. 引用一旦引用了一个实体,就不能再引用其他实体。

3. 引用的使用

引用在实践中主要用于传参以及做返回值来使用。引用传参和指针传参的功能类似,但引用传参更方便。

4. const 引用

可以引用一个const对象,但必须用const引用。const引用也可以引用普通对象,因为对象的访问权限在引用过程中可以缩小但不能放大。

类似int& rb = a * 3;double d = 12.34; int& rd = d;的场景中,a * 3保存在一个临时对象中,int& rd = d在类型转换的过程中也会产生临时对象存储中间值。也就是说rbrd引用的都是临时对象,而 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是 C++11 才有的。它可以转换为任意其他类型的指针类型。使用nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,而不能被转换为整数类型。

以后 C++11 版本及以后的代码,都用nullptr就可以了。

返回列表