【C++】:C++关键字,命名空间,输入输出,缺省参数

2024-04-20 00:04

本文主要是介绍【C++】:C++关键字,命名空间,输入输出,缺省参数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一,C++关键字(C++98)
  • 二,命名空间
    • 2.1 命名冲突
    • 2.2 关键字namespace
      • 2.2.1 命名空间中可以定义变量/函数/类型
      • 2.2.2 命名空间可以嵌套
      • 2.2.3 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
    • 2.3 命名空间的使用
      • 2.3.1 指定访问域中成员:加命名空间名称及作用域限定符
      • 2.3.2 使用using将命名空间中某个成员引入
      • 2.3.3 使用using namespace 命名空间名称 引入
    • 2.4 当两个命名空间定义相同成员,同时展开时会报错。
    • 2.5 总结
  • 三,输入&输出
    • 3.1 C++也有一套新的输入输出流。
    • 3.2 std命名空间的使用惯例
  • 四,缺省参数
    • 4.1 缺省参数概念
    • 4.2 缺省参数的分类
      • 4.2.1 全缺省参数
      • 4.2.2 半缺省参数

一,C++关键字(C++98)

C++总计63个关键字,C语言32个关键字。

ps:下面我们只是看一下C++有多少关键字,不对关键字进行具体的讲解。在以后的学习中会会了解的更深。

在这里插入图片描述

二,命名空间

2.1 命名冲突

在C语言的语法中,有时候会遇到这样的情况:

#include <stdio.h>
#include <stdlib.h>int rand = 0;int main()
{printf("%d\n", rand);return 0;
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c8f66916f1704e04859eccd60ac98f97.png

我们的本意是创建一个全局的 rand 变量,再进行输出。那为什么会报错呢?

原因:这是因为 rand 是一个库函数,当我们包含头文件 <stdlib.h> 时,在预处理阶段会展开头文件,里面的 rand 函数与我们定义的 rand 变量发生了冲突。编译器会自动识别 rand 是一个库函数,而不是对整形打印。

2.2 关键字namespace

使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染

首先我们知道在全局域(全局变量)和局部域(局部变量),可以分别定义名字相同的变量,但是使用时是局部优先。

那如何访问全局变量呢?就要用到域作用限定符::
当域作用限定符前没有其他符号时,就默认访问全局变量。

在这里插入图片描述

命名空间的本质也是一个域,叫做命名空间域。

它与全局域和局部域的区别是:命名空间域不影响生命周期。

使用方法是:后面跟命名空间的名字,然后接一对{}即可,里面的内容为命名空间的成员

使用变量,函数时,编译器的默认查找规则是:先在当前局部域查找,再在全局域中查找,但是不会在命名空间域里查找。

当要指定打印命名空间域中的变量时,在域作用限定符前要加上域的名字。

在这里插入图片描述

2.2.1 命名空间中可以定义变量/函数/类型

注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

在 test.cpp 中:

namespace bit
{int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}

2.2.2 命名空间可以嵌套

在大型项目中一般最多嵌套两三层,平时不会嵌套。

在 test.cpp 中:

namespace N1
{int a;int b;int Add(int left, int right){return left + right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}
}

在这里插入图片描述

2.2.3 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

比如在 test .h 中:

namespace N1
{int Mul(int left, int right){return left * right;}
}

一个工程中的 test.h 和上面 test.cpp 中两个N1会被合并成一个。

但是合并后不能有同名的变量,函数等,否则也会报错。要用嵌套解决。

2.3 命名空间的使用

2.3.1 指定访问域中成员:加命名空间名称及作用域限定符

在这里插入图片描述

2.3.2 使用using将命名空间中某个成员引入

可以指定域中的某个成员进行展开,使用它时可以不加作用域限定符。但是使用其他成员时要加。

比如 b 经常使用,a 偶尔使用时:

在这里插入图片描述

2.3.3 使用using namespace 命名空间名称 引入

当我们要多次使用域中某个成员时,每次都要 域名+限定符 十分麻烦就可以使用 using namespace + 名称 将域进行展开

在这里插入图片描述

2.4 当两个命名空间定义相同成员,同时展开时会报错。

所以命名空间不能随便展开!

namespace bit
{int a = 0;int b = 1;int c = 2;
}namespace hello
{int a = 0;int b = 1;int c = 2;
}//展开命名空间
using namespace bit;
using namespace hello;int main()
{printf("%d\n", a);printf("%d\n", a);printf("%d\n", a);printf("%d\n", a);printf("%d\n", a);printf("%d\n", a);return 0;
}

在这里插入图片描述

2.5 总结

所以说,使用 using namespace 展开命名空间的本质可以理解为改变了编译器默认的查找规则,不仅会先在局部域,全局域中查找,最后还会到命名空间域中查找。

但是要注意的是命名空间域的展开不是像头文件在预处理时展开的那样直接拷贝进来,而是相当于增加了一个声明。

三,输入&输出

3.1 C++也有一套新的输入输出流。

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ce58098261264fb3a2f777ce449e196b.png

cout 和 cin 包含在头文件< iostream >中,在使用时为啥要展开命名空间 std 呢?

原因:是为了防止标准库中定义的内容和你定义的内容发生冲突。std 是官方库的命名空间,把标准库里的内容保护起来

说明:

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中
  3. <<是流插入运算符,>>是流提取运算符
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式
    C++的输入输出可以自动识别变量类型

注意:
关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等等。因为C++兼容C语言的用法,这些又用得不是很多,所以在涉及这方面时建议使用printf 来控制格式,这样更方便。

3.2 std命名空间的使用惯例

std是C++标准库的命名空间,如何展开std使用更合理呢?

  1. 在日常练习中,建议直接using namespace std即可,这样就很方便
  2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。

四,缺省参数

4.1 缺省参数概念

缺省参数是声明或定义函数时函数的参数指定一个缺省值在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参

举例:

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1e5ef3b87b564b9096775c6fd3907df4.png

4.2 缺省参数的分类

4.2.1 全缺省参数

函数的所有参数均由自己指定。

在这里插入图片描述

4.2.2 半缺省参数

函数的参数部分传实参,其余的自己指定。

半缺省参数必须从右往左缺省,如图 b ,c 是缺省的,实参50床给 a。

在这里插入图片描述
注意:

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给。
  2. 缺省参数不能在函数声明和定义中同时出现,若有这种情况,以声明中的参数为主。

举例:

  1. 间隔缺省会报错
#include <iostream>
using namespace std;void Func(int a , int b = 20, int c )
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}int main()
{Func(50, ,30);return 0;
}

在这里插入图片描述

这篇关于【C++】:C++关键字,命名空间,输入输出,缺省参数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/918805

相关文章

通过Python脚本批量复制并规范命名视频文件

《通过Python脚本批量复制并规范命名视频文件》本文介绍了如何通过Python脚本批量复制并规范命名视频文件,实现自动补齐数字编号、保留原始文件、智能识别有效文件等功能,听过代码示例介绍的非常详细,... 目录一、问题场景:杂乱的视频文件名二、完整解决方案三、关键技术解析1. 智能路径处理2. 精准文件名

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

linux如何复制文件夹并重命名

《linux如何复制文件夹并重命名》在Linux系统中,复制文件夹并重命名可以通过使用“cp”和“mv”命令来实现,使用“cp-r”命令可以递归复制整个文件夹及其子文件夹和文件,而使用“mv”命令可以... 目录linux复制文件夹并重命名我们需要使用“cp”命令来复制文件夹我们还可以结合使用“mv”命令总

Python脚本实现图片文件批量命名

《Python脚本实现图片文件批量命名》这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言源码批量处理图片尺寸脚本源码GUI界面源码打包成.exe可执行文件前言本文介绍一个用python第三方库pi

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::