C++入门(1)—命名空间、缺省参数
目录
一、什么是C++
1、C++关键字(C++98)
2、C++兼容C
二、C++程序预处理指令
三、命名空间
1、命名冲突
第一种:
第二种:
2、域作用限定符
3、实现命名空间
4、命名空间冲突
5、访问命名空间
6、命名空间“std”
四、输入输出
1、定义
2、自动识别类型
3、格式化输出
五、缺省参数
1、全缺省
2、半缺省
一、什么是C++
- C++是一种高级程序设计语言,它是在C语言的基础上发展而来的。C++支持面向对象编程OOP(object oriented programming:面向对象)思想,这种编程方式可以更好地处理复杂问题和大规模程序的开发。
- C++既可以进行C语言的过程化程序设计,也可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。
- 1982年,C++的设计者Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,使得C++成为一种功能强大、灵活性高、可扩展性好的编程语言。
- C++的出现是为了解决软件危机,支持高度抽象和建模,适用于处理复杂问题和大规模程序的开发。C++还支持泛型编程和模板元编程,这使得C++成为一种非常灵活和强大的编程语言。
1、C++关键字(C++98)
2、C++兼容C
使用C语言的语法在 .cpp 文件中依然可以运行。

二、C++程序预处理指令
#include <iostream>
C和C++一样,使用一个预处理器 在进行主编译之前对源文件进行处理,上述的编译指令使预处理器将 iostream 文件的内容添加到程序中。
那么什么要将 iostream 文件的内容添加到程序中呢?
- 答案涉及程序与外部世界之间的通信。iostream 中的 io 指的是输入(进入程序的信息)和输出(从程序中发送出去的信息)。
- C++的输入输出方案涉及 iostream文件中的多个定义。为了使用cout来显示消息,第一个程序需要这些定义。#include编译指令导致 iostream 文件的内容随源代码文件的内容一起被发送给编译器。
- 实际上,iostream 文件的内容将取代程序中的代码行#include <iostream>。原始文件没有被修改,而是将源代码文件和 iostream 组合成一个复合文件,编译的下一阶段将使用该文件。
- 注意:使用 cin(=scanf) 和 cout(=printf) 进行输入和输出的程序必须包含文件iostrcam。
#include <iostream>
using namespace std;//后续讲解
int main()
{int a = 0;cin >> a;cout << a << endl;return 0;
}

三、命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
1、命名冲突
我们先来看一下命名冲突:
大体命名冲突有两种:
- 我们自己定义和库里面的名字冲突
- 项目组,多个人之间定义的名字冲突
下面我们举例来解释两种情况的产生 。
第一种:
我们定义一个全局变量rand,此时程序正常输出。
#include <stdio.h>int rand = 1;int main()
{printf("%d\n", rand);return 0;
}

如果我们包含头文件<stdlib.h>再次运行
#include <stdio.h>
#include <stdlib.h>
int rand = 1;int main()
{printf("%d\n", rand);return 0;
}
此时程序无法正常运行,显示错误如下:
![]()
这是因为<stdlib>头文件中定义了rand函数,当我们自己声明全局变量rand时,再包含头文件<stdlib.h> 就造成了 rand 的重定义。
第二种:
我们在两个头文件中同时定义了Node结构体。

然后主函数包含两个新创建的头文件,
#include <stdio.h>
#include "list.h"
#include "queue.h"int main()
{return 0;
}
编译一下,结果程序报错如下:

由此可知,两个头文件包含相同的命名时,同时调用程序会报错。
为了解决这个问题,我们的大佬推出了命名空间的概念,对标识符的名称进行本地化,以避免命名冲突或名字污染。
2、域作用限定符
我们先来回顾“域”的概念:
在C/C++中,域(Scope)是指程序中变量、函数、类等实体的可见范围和生命周期。根据实体的定义位置和作用范围,可以将域分为以下几种类型:
-
全局域(Global Scope):全局域中定义的变量、函数、类等实体在整个程序中都是可见的,它们的生命周期与程序的运行时间相同。在C/C++中,全局变量和全局函数默认情况下都属于全局域。
-
局部域(Local Scope):局部域中定义的变量、函数、类等实体只在其定义的代码块中可见,它们的生命周期与代码块的执行时间相同。在C/C++中,函数中定义的变量和函数参数都属于局部域。
这段代码中函数 f1 和函数 f2 中变量a都是域,int a = 2;是全局域。
#include<stdio.h>
int a = 2;void f1()
{int a = 0;
}
void f2()
{int a = 1;
}int main()
{printf("%d\n", a);return 0;
}
此时如何在函数 f1的局部域中打印全局域的变量 a 呢?
我们可以借助域作用限定符 :: (两个冒号) 实现,:: 左边为指定的域,不指定默认全局域。
int a = 2;
void f1()
{int a = 0;printf("%d\n",::a); // ::域作用限定符
}
运行后,成功输出全局域的全局变量 2 。

3、实现命名空间
定义命名空间需要关键字 namespace,分别为两个Node结构体定义名为 Q
和名为 L 的命名空间 .

然后在主函数中使用通过命名空间使用他们。
#include <stdio.h>
#include "list.h"
#include "queue.h"
int main()
{struct Q::Node node1;struct L::Node node2;return 0;
}
我们声明了一个名为node1的 struct Q::Node 类型的变量,然后声明了一个名为node2的 struct L::Node 结构体类型的变量。由于这两个结构体都定义在不同的命名空间中,因此我们需要使用作用域解析运算符::来指定命名空间的名称。
我们对于重名的变量也可以放入不同的命名空间中,在两个命名空间中分别加入变量 x。

我也可以通过作用域解析运算符,访问不同命名空间中相同命名的变量。
int main()
{struct Q::Node node1;struct L::Node node2;Q::x++;L::x++;return 0;
}
4、命名空间冲突
比如这种情况:

我们可以进行命名空间的嵌套。

我们对命名空间Code分别嵌套一层命名空间Q和L,这样就可解决命名空间冲突的问题,使用命名空间的内容时,只需多加一层域解析运算符。代码如下:
#include <stdio.h>
#include "list.h"
#include "queue.h"
int main()
{struct Code::Q::Node node1;struct Code::L::Node node2;Code::Q::x++;Code::L::x++;return 0;
}
这种嵌套没有限制,可以进行多层嵌套。
5、访问命名空间
- 指定命名空间访问
struct Code::Q::Node node1; struct Code::L::Node node2;- 全局展开. 一般情况,不建议全局展开的。
但是一般情况下不建议全局展开,项目中禁止,平时练习可以。#include "list.h" using namespace Code; int main() {struct L i;return 0; }- 部分展开
using std::cout; using std::endl;int main() {cout << "1111" << endl;return 0; }
6、命名空间“std”
#include <iostream>
using namespace std;
int main()
{int a = 0;cin >> a;cout << a << endl;return 0;
}
std是一个命名空间,它包含了许多标准库函数和对象,例如cout和cin。命名空间的作用是为了避免不同库中的函数或对象名称冲突,因此在使用标准库中的函数和对象时,
- 如果不使用
using namespace std;语句,需要在前面加上std::前缀,以指明它们属于std命名空间。 - 如果使用
using namespace std;语句可以让我们直接使用这些函数和对象,而不需要加上std::前缀。
四、输入输出
1、定义
- 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件 以及按命名空间使用方法使用std。
- cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
- iostream >头文件中。
- <<是流插入运算符,>>是流提取运算符。
#include <iostream>
using namespace std;
int main()
{int a;cin >> a;cout << a << endl;return 0;
}

2、自动识别类型
- 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
- C++的输入输出可以自动识别变量类型。
#include <iostream>
using namespace std;
int main()
{int n = 0;cin >> n;double* a = (double*)malloc(sizeof(int) * n);for (int i = 0; i < n; i++){cin >> a[i];}for (int i = 0; i < n; i++){cout << a[i] << endl;}return 0;
}

3、格式化输出
这种情况用cout输出就显得有些麻烦,此时用C语言的printf进行格式化输出就方便许多。
int main()
{char name[100] = "Kelly";int age = 20;cout << "name:" << name << endl;cout << "age:" << age << endl;printf("name:%s\nage:%d\n", name, age);return 0;
}
五、缺省参数
C++ 可以在函数定义时对参数赋初始值,调用时可以不对函数传值,输出则为参数的初始值。
void func(int a = 0)
{cout << a << endl;
}
int main()
{func();return 0;
}

如果对函数传值,则函数使用传入值。
func(666);

1、全缺省
使用缺省值,必须从右往左连续使用。
void Func(int a = 1, int b = 2, int c = 3)
{cout << a << " " << b << " " << c << endl;
}
int main()
{Func(4, 5, 6);Func(4, 5);Func(4);Func();return 0;
}
输出结果如下:

2、半缺省
必须从右往左连续缺省。
void Func(int a , int b = 2, int c = 3)
{cout << a << " " << b << " " << c << endl;
}
int main()
{Func(4, 5, 6);Func(4, 5);Func(4);//Func(); 至少传一个值给areturn 0;
}

这种就不可以 ,不符合从右往左连续缺省。
void Func(int a = 0, int b , int c = 3)
注意!
缺省参数不能在函数声明和定义中同时出现

Visual Studio可能没有报错,是因为它的编译器对这种情况进行了特殊处理,将函数声明和定义中的缺省参数合并起来,但是,这种行为并不是所有编译器都支持,因此在编写跨平台的代码时,最好避免在函数声明和定义中同时指定缺省参数,以函数声明中指定的缺省参数为准。

相关文章:
C++入门(1)—命名空间、缺省参数
目录 一、什么是C 1、C关键字(C98) 2、C兼容C 二、C程序预处理指令 三、命名空间 1、命名冲突 第一种: 第二种: 2、域作用限定符 3、实现命名空间 4、命名空间冲突 5、访问命名空间 6、命名空间“std” 四、输入输出 1、定义 2、自动识…...
以程序员的身份使用curl获取速卖通详情
作为一名程序员,我们经常需要和各种API接口打交道。在电商领域,速卖通是一个非常受欢迎的平台。本文将介绍如何使用curl工具通过速卖通的API接口获取商品详情。 一、准备工作 在开始之前,请确保您已完成以下准备工作: 注册速卖…...
Java设计模式-结构型模式-装饰模式
装饰模式 装饰模式角色案例装饰模式与静态代理的区别 装饰模式 允许向一个现有的对象动态地添加新的功能,同时不改变其结构。它是继承的一种替代方案,可以动态地扩展对象。有点像静态代理 角色 装饰者模式有四种角色 抽象被装饰者,被装饰者…...
这7个“小毛病”项目经理必须克服
大家好,我是老原。 项目经理干项目可能不在行,但“踩坑”、“背锅”一定在行。 当上项目经理不容易,当好项目经理更不容易,有永远填不完的坑和背不完的锅。 如果要问项目经理都踩过哪些坑,那真的是太多了࿰…...
一言成文大模型:大模型实践之路
元宇宙_一言成文大模型...
【VSCode】配置C/C++开发环境教程(Windows系统)
下载和配置MinGW编译器 首先,我们需要下载并配置MinGW编译器。 下载MinGW编译器,并将其放置在一个不含空格和中文字符的目录下。 配置环境变量PATH 打开控制面板。可以通过在Windows搜索栏中输入"控制面板"来找到它。 在控制面板中…...
算法实战:亲自写红黑树之四 插入insert的平衡
本文承接自: 算法实战:亲自写红黑树之一-CSDN博客 算法实战:亲自写红黑树之二 完整代码-CSDN博客 算法实战:亲自写红黑树之三 算法详解-CSDN博客 目录 一、入口 二、普通二叉树插入 三、插入后的平衡 四、算法解惑 一、入口 入…...
JWT 技术
一、介绍 JWT全称:JSON Web Token 官网:https://jwt.io/ 定义了一种简洁的、自包含的格式,用于在通信双方以 json 数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的 在生成 JWT 令牌时,会对 JSON 格式的数…...
003.文件描述符、重定向
1、文件描述符 文件描述符是与输入和输出流相关联的整数。最广为人知的文件描述符是stdin、stdout和stderr。我们可以将某个文件描述符的内容重定向到另一个文件描述符中。 在编写脚本的时候会频繁用到标准输入(stdin)、标准输出(stdout&am…...
图论| 827. 最大人工岛 127. 单词接龙
827. 最大人工岛 题目:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上、下、左、右四个方向相连的 1 形成。 题目链接:[827. 最大人工岛](ht…...
2023年中国恒温蜡疗仪发展趋势分析:应用前景存有很大发展与探索空间[图]
恒温电蜡疗仪可将蜡熔化,利用蜡自身特点,能阻止热的传导、散热慢、气体和水分不易消失,保温性能优越。利用蜡能紧密贴于体表的可塑性,可加入其他药物协同进行治疗,也可将中药与蜡疗有机地结合在一起,产生柔…...
认识“协议”
文章目录: 什么是协议结构化的数据传输序列化和反序列化网络版本计算器 什么是协议 在计算机网络中,协议是指在网络中进行通信和数据交换时,双方遵循的规则和约定集合。它定义了数据的传输格式、顺序、错误处理、认证和安全性等方面的规范。 …...
GO语言的由来与发展历程
Go语言,也称为Golang,是由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明,并于2009年正式对外发布的开源编程语言。 三名初始人的目标是设计一种适应网络和多核时代的C语言,Go语言从C继承了…...
MPN – 制造零件号
S/4 1610 中的 MPN – 基于 NAST 的输出管理 我试图查找有关 MPN 设置的信息,但找不到详细的配置步骤。在浏览了一些信息和 help.sap 链接后,我能够在 S/4 1610 系统中配置 MPN 设置,这与使用旧输出类型(Nast 和输出类型 NEU&…...
Redis企业级问题及解决方案
1.1 缓存预热 场景:“宕机” 服务器启动后迅速宕机 问题排查: 1.请求数量较高,大量的请求过来之后都需要去从缓存中获取数据,但是缓存中又没有,此时从数据库中查找数据然后将数据再存入缓存,造成了短期…...
【2021集创赛】基于arm Cortex-M3处理器与深度学习加速器的实时人脸口罩检测 SoC
团队介绍 参赛单位:深圳大学 队伍名称:光之巨人队 指导老师:钟世达、袁涛 参赛队员:冯昊港、潘家豪、慕镐泽 图1 团队风采 1. 项目简介 新冠疫情席卷全球,有效佩戴口罩可以极大程度地减小病毒感染的风险。本项目开发…...
B码的相关知识点笔记
B码(B-Code)通常是指中国北斗卫星导航系统的坐标编码方式。北斗卫星导航系统使用的坐标系是WGS-84,而B码是针对WGS-84坐标系进行编码的一种方式。 B码的格式通常为18位或24位,其中包含以下信息: 前两位为国家码&…...
java“贪吃蛇”小游戏
基于java实现贪吃蛇小游戏,主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。 我是在javaSwing项目下创建了一个包 名字叫做:Snakes包 包下有一个启动类和一个设置代码的主界面两个类 代码主界面: 代码主界面主要讲解的是 …...
【面试经典150 | 位运算】数字范围按位与
文章目录 Tag题目来源题目解读解题思路方法一:公共前缀方法二:n & (n-1) 写在最后 Tag 【位运算】 题目来源 201. 数字范围按位与 题目解读 计算给定区间内所有整数的按位与的结果。 解题思路 本题朴素的方法是直接将区间内的所有整数按位与&…...
推介会如何做好媒体宣传
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 推介会是一种专为企业、社会组织和团体、政府等提供的展示自身特点、产品和政策的活动形式,旨在促进交流活动,形成合作,从而带来共同利益。推介会的本…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
