[C++初阶]初识C++(一)—————命名空间和缺省函数

声明:

        本篇文献内容选自百度文库、比特就业课

        代码内容部分选自比特就业课

一、命名空间

1.什么是命名空间

在编程语言中,命名空间是一种特殊的作用域,它包含了处于该作用域中的所有标示符,而且其本身也是由标示符表示的。命名空间的使用目的是为了将逻辑相关的标示符限定在一起,组成相应的命名空间,可使整个系统更加模块化,最重要的是它可以防止命名冲突。就好比在两个函数或类中定义相同名字的对象一样,利用作用域标示符限定该对象是哪个类里定义的。

2.命名空间的好处

在C语言中,我们很有可能会遇到这样的问题,如果我们有一家公司,有很多程序员在写程序,但是由于大家分开来写的,很有可能出现同名的函数或者变量名,那么这时,C语言会出现重定义问题,会报错,那么我们在C语言怎么解决这个问题呢?只能改变量名,所以我们只能这样解决。两个程序员去天台打一架,谁赢了,谁用这个变量名。

例子如下:

在C语言中我们写如下代码会报错

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

rand重定义

所以在C++中我们的祖师爷创造了命名空间这个东西,它可以很好地解决这个问题。

2.1命名空间的定义

定义命名空间,需要使用到 namespace 关键字 ,后面跟 命名空间的名字 ,然后接一对{} 即可, {}
中即为命名空间的成员
namespace Snowar
{// 命名空间中可以定义变量/函数/类型int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}
命名空间可以嵌套
例:
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 命名空间使用

命名空间的使用有三种:

1.加命名空间名称及作用域限定符

例子:

int main()
{printf("%d\n", N::a);return 0;    
}

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

例子:

using N::b;
int main()
{printf("%d\n", N::a);printf("%d\n", b);return 0;    
}

3.使用using namespace 命名空间名

using namespce N;
int main()
{printf("%d\n", N::a);printf("%d\n", b);Add(10, 20);return 0;    
}

3.C++输入&输出

在C++中:std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中

using namespace std;
int main()
{
cout<<"Hello world!!!"<<endl;
return 0;
}
说明:
1. 使用 cout 标准输出对象 ( 控制台 ) cin 标准输入对象 ( 键盘 ) 时,必须 包含 < iostream > 头文件
以及按命名空间使用方法使用 std
2. cout cin 是全局的流对象, endl 是特殊的 C++ 符号,表示换行输出,他们都包含在包含 <
iostream > 头文件中。
3. << 是流插入运算符, >> 是流提取运算符
4. 使用 C++ 输入输出更方便,不需要像 printf/scanf 输入输出时那样,需要手动控制格式。
C++ 的输入输出可以自动识别变量类型。
5. 实际上 cout cin 分别是 ostream istream 类型的对象, >> << 也涉及运算符重载等知识,
这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。后面我们还有有
一个章节更深入的学习 IO 流用法及原理。
注意:早期标准库将所有功能在全局域中实现,声明在 .h 后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std 命名空间下,为了和 C 头文件区分,也为了正确使用命名空间,规定C++ 头文件不带 .h ;旧编译器 (vc 6.0) 中还支持 <iostream.h> 格式,后续编译器已不支持,因此推荐 使用 <iostream>+std 的方式。
选自,比特就业课。
#include <iostream>
using namespace std;
int main()
{int a;double b;char c;// 可以自动识别变量的类型cin>>a;cin>>b>>c;cout<<a<<endl;cout<<b<<" "<<c<<endl;return 0;
}
std 命名空间的使用惯例:
std C++ 标准库的命名空间,如何展开 std 使用更合理呢?
1. 在日常练习中,建议直接 using namespace std 即可,这样就很方便。
2. using namespace std 展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型 /
/ 函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模
大,就很容易出现。所以建议在项目开发中使用,像 std::cout 这样使用时指定命名空间 +
using std::cout 展开常用的库对象 /类型等方式。
选自,比特就业课。

4. 缺省参数

缺省参数是指在定义函数时给某个参数设置一个默认值,当函数被调用时,如果没有传递该参数,就会使用默认值。缺省参数可以简化函数的调用,避免繁琐的参数传递过程,同时也提高了函数的灵活性。

void Func(int a = 0)
{cout<<a<<endl;
}
int main()
{Func();     // 没有传参时,使用参数的默认值Func(10);   // 传参时,使用指定的实参
return 0;
}

缺省函数分为,全缺省函数和半缺省函数

4.1全缺省函数

全缺省函数就像上面的那个一样.就是在函数里,给每个参数设置默认值.

代码示例:

void Func(int a = 10, int b = 20, int c = 30){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}

4.2半缺省函数

半缺省函数就是参数不全部设置默认值

代码示例:

void Func(int a, int b = 10, int c = 20){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}

注意:

1. 半缺省参数必须从右往左依次来给出,不能间隔着给
2. 缺省参数不能在函数声明和定义中同时出现
例:
  //test.hvoid Func(int a = 10);//test.cppvoid Func(int a = 20){}// 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该
用那个缺省值。

3. 缺省值必须是常量或者全局变量
4. C语言不支持(编译器不支持)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32的定时器中断Cubemx

STM32的定时器中断Cubemx 0.定时器简介1.配置时钟2.配置定时器3.创建工程4.补充源码 0.定时器简介 基本定时器功能&#xff1a; 16位向上、向下、向上/下自动装载计数器16位可编程(可以实时修改)预分频器&#xff0c;计数器时钟频率的分频系数为1&#xff5e;65535之间的任意…

vue2源码解析——vue中如何进行依赖收集、响应式原理

vue每个组件实例vm都有一个渲染watcher。每个响应式对象的属性key都有一个dep对象。所谓的依赖收集&#xff0c;就是让每个属性记住它依赖的watcher。但是属性可能用在多个模板里&#xff0c;所以&#xff0c;一个属性可能对应多个watcher。因此&#xff0c;在vue2中&#xff0…

Practice of PILos——transform np.array into img ,store in batch

先放上源码 import os import shutil import subprocess import tarfileimport os import pandas as pd import numpy as np from PIL import Image# Set up Kaggle API credentials kaggle_json_path os.path.expanduser("~/.kaggle/kaggle.json")if not os.path.…

UR SIM

详细Ubuntu 22.04 配置最新UR机械臂仿真环境(ros2-humble, ur-sim, ur-ros2-driver) ur_robot_driver官方教程-UR仿真器部分 Setup URSim with Docker universalrobots/ursim_cb3 - Docker Image | Docker Hub UR5机器人学习之TCP/IP通讯 使用Docker设置URSim 设置自己的 …

github 多个账号共享ssh key 的设置方法

确认本机是否已有ssh key 首先确认自己系统内有没有 ssh key。 bash复制代码cd ~/.ssh ls *.pub # 列出所有公钥文件id_rsa.pub若有&#xff0c;确认使用当前 key 或者生成新 key&#xff0c;若没有&#xff0c;生成新 key。由于我需要登录两个帐号&#xff0c;所以在已经存在…

uni-app自定义导航栏下拉刷新实现

【z-paging下拉刷新、上拉加载】高性能&#xff0c;全平台兼容。支持虚拟列表&#xff0c;分页全自动处理 - DCloud 插件市场 先记录一个插件&#xff0c;后续更新

【WPF应用31】WPF基本控件-ListView的详解与示例

WPF&#xff08;Windows Presentation Foundation&#xff09;是.NET框架的一个组成部分&#xff0c;它用于构建桌面应用程序的用户界面。ListView是WPF中一个非常强大的数据展示控件&#xff0c;它可以用来显示一系列的项&#xff0c;类似于Windows资源管理器中的文件列表。Li…

MyBatis动态SQL--where 标签

在上一章中的介绍if 标签时&#xff0c;其实我们发现了一个问题&#xff0c;就是当所有条件都为空时&#xff0c;sql语句会多出来一个where&#xff0c;而且有时候会多出来一个and等等。 而where标签的作用就是为了解决这类问题&#xff0c;where 标签可以自动去除多余的where…

Java基础 - 10 - File、IO流(一)

File&#xff1a;代表文本 IO流&#xff1a;读写数据 一. File File是java.io.包下的类&#xff0c;File类的对象&#xff0c;用于代表当前操作系统的文件&#xff08;可以是文件或文件夹&#xff09; 注意&#xff1a;File类只能对文件本身进行操作&#xff0c;不能读写文件里…

区块链技术的基本概念学习

1.去中心化 去中心化就是你我之间转账&#xff0c;不依赖于银行或支付处理公司。 2.区块链网络 区块链网络是由分布在全球的节点组成&#xff0c;每个节点都有完整的区块链副本。 3.区块 区块就是区块链中的的一个块&#xff0c;这个块里面包含了很多信息&#xff0c;如交…

搜维尔科技:TechViz 虚拟现实在工业项目中沉浸式体验

TechViz虚拟现实在工业项目中沉浸式体验 搜维尔科技&#xff1a;TechViz 虚拟现实在工业项目中沉浸式体验

Deepface Lab2.0参数选取建议

制作非常基本和低质量/分辨率的 Deepfakes 的最低要求&#xff1a; - 支持 AVX 和 SSE 指令的现代 4 核 CPU - 16GB RAM - 具有 8GB VRAM 的现代 Nvidia 或 AMD GPU - 充足的存储空间和大页面文件 确保启用硬件-加速 Windows 10/11 下的 GPU 调度并确保您的 GPU 驱动程序是最新…

MyBatis动态SQL--if 标签

mybatis动态sql对我们来说是非常常见的&#xff0c;比如在下面这样一个场景中&#xff0c; 我们需要多条件查询&#xff0c;但是查询的条件又不是固定的&#xff0c;是可以动态改变的&#xff0c;那我们就需要用到动态sql去完成。 动态SQL之 if 标签 接下来我们介绍第一个动态…

Day43 动态规划 part05

Day43 动态规划 part05 1049.最后一块石头的重量II 我的思路: 提示说和划分两个和相等的子集差不多&#xff0c;猛然想到&#xff0c;这道题不就是划分子集&#xff0c;用sum - 和最大*2 代码就是划分和相同的子集的变形 解答&#xff1a; class Solution {public int last…

【JavaScript】函数 ⑥ ( 使用 arguments 获取所有实参 | arguments 内置对象 | 伪数组概念 )

文章目录 一、使用 arguments 获取所有实参1、arguments 内置对象2、伪数组概念3、arguments 实参遍历4、arguments 代码示例 - 基本使用5、arguments 代码示例 - 遍历实参 一、使用 arguments 获取所有实参 1、arguments 内置对象 在 定义 JavaScript 函数 时 , 有时 不确定 形…

使用LangChain编写图检索查询实现RAG

大家好&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称RAG&#xff09;是一种先进的人工智能技术&#xff0c;通过整合大型语言模型&#xff08;LLM&#xff09;的内部知识和外部权威数据源&#xff0c;来提升生成式AI模型的表现。 本文…

安全可靠!麒麟信安操作系统各版本均不受liblzma/xz漏洞影响!

近日&#xff0c;XZ Utils 5.6.0和5.6.1版本存在严重后门风险的消息披露后&#xff0c;麒麟信安立即展开全面排查&#xff0c;经分析验证&#xff0c;麒麟信安操作系统各版本均不受liblzma/xz漏洞影响。 关于liblzma/xz漏洞 漏洞描述 xz 5.6.0 与 5.6.1 版本的上游代码中发现…

ComplexHeatmap绘图:注释、图例、热图基础(自备)

目录 基础介绍 Heatmap绘图基础参数 数据 作图参数 Heatmap Annotations&#xff08;注释&#xff09; 基础注释设置 简单注释测试 anno_points散点注释 anno_lines连线注释 anno_barplot条形图 anno_boxplot箱线图 anno_histogram直方图 热图组合 基础组合 进行…

【热门话题】文言一心与ChatGPT-4:一场跨时代智能对话系统的深度比较

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 文言一心与ChatGPT-4&#xff1a;一场跨时代智能对话系统的深度比较一、技术背景…

Maven--lib分离的打包方式

就是把lib包和source源码分开打包。优势就是&#xff0c;面对频繁更新的应用场景时&#xff0c;可以只更新源码包&#xff08;当然&#xff0c;前提是你的依赖没有增减&#xff09;。尤其是使用jenkins更新项目时&#xff0c;会省去很多时间吧&#xff1f; 不同项目的 lib之间不…