【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;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/558021.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

❤️‍FlyFlow工作流周更来咯~~

FlyFlow 借鉴了钉钉与飞书的界面设计理念&#xff0c;致力于打造一款用户友好、快速上手的工作流程工具。相较于传统的基于 BPMN.js 的工作流引擎&#xff0c;我们提供的解决方案显著简化了操作逻辑&#xff0c;使得用户能够在极短的时间内构建定制化的业务流程&#xff0c;即便…

Redis之路系列(3)纸上得来终觉浅(下)

03 纸上得来终觉浅(下) 基于Redis6&#xff0c;本章节主要介绍了Rdis的一些主要应用场景&#xff0c;包含了&#xff1a;大数据的过滤&#xff0c;分布式锁设计&#xff0c;并讲解了有趣的布隆过滤器原理&#xff0c;HyperLogLog 原理&#xff0c;二进制位数与存储大小计算的常…

汽车IVI中控开发入门及进阶(十五):AUTOSAR

前言: 随着汽车四化的进行,汽车电子系统standard标准化和coperation互操作性变得重要, AUTOSAR(AUTomotive Open System Architecture 汽车开放系统架构)框架已成为汽车行业的基础支柱。 AUTOSAR始自2000年,当时认识到标准化是有必要

Qt6连接MySQL

Qt6连接MySQL Qt6编译MySQL的过程太变态了&#xff0c;MinGW和MSVC都很费劲。 主要参考qt6.5.0MySQL驱动手动编译以及数据库连接详细教程以及注意事项附资源链接&#xff0c;这篇文章堪称保姆级教程&#xff0c;写的十分详细。 笔者这里踩了个坑&#xff0c;在按照上文中的过…

css设置文字撑满盒子

效果如上&#xff1a; <div style"width: 250px;background-color:red;text-align-last:justify;word-break: keep-all;">为中国崛起而读书</div>

【Linux】文件描述符——万字详解

目录​​​​​​​ 前言 预备知识 复习C语言的文件接口 写方式打开文件 追加方式打开文件 读方式打开文件 系统的文件接口 open close write read 文件描述符 0 & 1 & 2 理解文件描述符 文件描述符的分配规则 重定向的本质 dup2 理解Linux下一切…

Go 单元测试基本介绍

文章目录 引入一、单元测试基本介绍1.1 什么是单元测试&#xff1f;1.2 如何写好单元测试1.3 单元测试的优点1.4 单元测试的设计原则 二、Go语言测试2.1 Go单元测试概要2.2 Go单元测试基本规范2.3 一个简单例子2.3.1 使用Goland 生成测试文件2.3.2 运行单元测试2.3.3 完善测试用…

存储过程的使用(一)

目录 不带参数的存储过程 创建一个存储过程&#xff0c;向数据表 dept 中插入一条记录 带 IN 参数的存储过程 在存储过程中接受来自外部的数值&#xff0c;在存储过程中判断该数值是否大于零并显示 输入一个编号&#xff0c;查询数据表emp中是否有这个编号&#xff0c;如果…

博客系统项目测试(selenium+Junit5)

在做完博客系统项目之后&#xff0c;需要对项目的功能、接口进行测试&#xff0c;利用测试的工具&#xff1a;selenium以及Java的单元测试工具Junit进行测试&#xff0c;下面式测试的思维导图&#xff0c;列出该项目需要测试的所有测试用例&#xff1a; 测试结果&#xff08;全…

【Tesla T4为例】GPU安装最新版本NVIDIA Driver、CUDA、cuDNN、Anaconda、Pytorch

NVIDIA Driver 进入英伟达官网下载页面 按照以上方式选择即可得到>535.113.01版本的驱动&#xff0c;可以实现多卡推理&#xff0c;小于这个版本会导致多卡训练以及推理报错 虽然最新版本为550.54.15&#xff0c;但是535版本更加稳定&#xff0c;并且pytorch目前只支持到1…

云渲染采用了哪些核心技术来实现其高效的计算的?

云渲染运用云计算技术&#xff0c;将3D渲染任务分配至远程服务器集群以实现高速高效渲染&#xff0c;释放本地资源&#xff0c;缩短了影视动画、效果图等的制作周期&#xff0c;在影视、建筑、游戏等行业发挥关键作用。哪云渲染都用了哪些技术呢&#xff1f;我们一起来看看。 …

2024新版淘宝客PHP网站源码

源码介绍 2024超好看的淘客PHP网站源码&#xff0c;可以做优惠券网站&#xff0c;上传服务器&#xff0c;访问首页进行安装 安装好了之后就可以使用了&#xff0c;将里面的信息配置成自己的就行 喜欢的朋友们拿去使用把 效果截图 源码下载 2024新版淘宝客网站源码

UE5下载与安装

官方网站&#xff1a;https://www.unrealengine.com/zh-CN 1、下载启动程序安装包。 登录官网后&#xff0c;点击首页右侧下载按钮下载Epic Games启动程序的安装包&#xff0c;如下图&#xff1a; 2、安装启动程序。 双击步骤1所下载安装软件&#xff0c;如下图&#xff1a;…

一个开箱即用的物联网项目,开源免费可商用

一、平台简介 今天给大家推荐一款开源的物联网项目&#xff0c;简单易用&#xff0c;非常适合中小团队和个人使用&#xff0c;项目代码和文档完全开源&#xff0c;个人和公司都可以应用于商业项目&#xff0c;只需要保留开源协议文件即可。 本项目可应用于智能家居、农业监测…

Jmeter测试学习笔记

第一章 jmeter基础知识 一.Jmeter工具中的组件 1.测试计划&#xff1a;Jmeter测试的起点。容器。 2.线程组&#xff1a;代表一定的用户 3.取样器&#xff1a;发送请求的最小单元 4.逻辑控制器&#xff1a;处理请求逻辑 5.前置处理器&#xff1a;请求之前的操作 6.后置处…

算法课程笔记——pair的使用

先思考&#xff0c;为什么 STL 中的容器和算法都是用的左闭右开区间&#xff1f; | | | 这样迭代器只需要支持和!(或者<或者)操作就可以方便的进行区间遍历了。 其它区间设置的话&#xff0c;要么得支持<操作&#xff0c;要么得在循环体内&#xff0c;操作之前进行!判定。…

Proxmox VE 实现批量增加多网络

前言 实现批量创建多网络&#xff0c;更改主机名称&#xff0c;hosts解析 初始化网卡&#xff0c;主机名称&#xff0c;hosts解析&#xff0c;重启网卡 我的主机六个网卡&#xff0c;使用的有四个网卡&#xff0c;以下一键创建和初始化主机名称我是以硬件的SN号最为主机的名…

【InternLM 实战营第二期作业04】XTuner微调LLM:1.8B、多模态、Agent

基础作业 训练自己的小助手认知 1.环境安装 安装XTuner 源码 # 如果你是在 InternStudio 平台&#xff0c;则从本地 clone 一个已有 pytorch 的环境&#xff1a; # pytorch 2.0.1 py3.10_cuda11.7_cudnn8.5.0_0studio-conda xtuner0.1.17 # 如果你是在其他平台&#x…

[NISACTF 2022]huaji?

注意要加--run-asroot

第四百六十七回

文章目录 1. 知识回顾2. 使用方法3. 示例代码4. 内容总结 我们在上一章回中介绍了"OverlayEntry组件简介"相关的内容&#xff0c;本章回中将介绍OverlayEntry组件的用法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中介绍了Overlay…
最新文章