【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

相关文章

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数