【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

相关文章

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

c# checked和unchecked关键字的使用

《c#checked和unchecked关键字的使用》C#中的checked关键字用于启用整数运算的溢出检查,可以捕获并抛出System.OverflowException异常,而unchecked... 目录在 C# 中,checked 关键字用于启用整数运算的溢出检查。默认情况下,C# 的整数运算不会自

Python如何使用seleniumwire接管Chrome查看控制台中参数

《Python如何使用seleniumwire接管Chrome查看控制台中参数》文章介绍了如何使用Python的seleniumwire库来接管Chrome浏览器,并通过控制台查看接口参数,本文给大家... 1、cmd打开控制台,启动谷歌并制定端口号,找不到文件的加环境变量chrome.exe --rem

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

详解Spring Boot接收参数的19种方式

《详解SpringBoot接收参数的19种方式》SpringBoot提供了多种注解来接收不同类型的参数,本文给大家介绍SpringBoot接收参数的19种方式,感兴趣的朋友跟随小编一起看看吧... 目录SpringBoot接受参数相关@PathVariable注解@RequestHeader注解@Reque

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的