C++入门(1)—命名空间、缺省参数

news2024/11/13 11:27:28

目录

一、什么是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)

C++总计63个关键字,C语言32个关键字。通过不断地学习我们会逐渐掌握这些关键字。

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、命名冲突 

我们先来看一下命名冲突: 

大体命名冲突有两种: 

  1. 我们自己定义和库里面的名字冲突
  2. 项目组,多个人之间定义的名字冲突 

下面我们举例来解释两种情况的产生 。

第一种:

我们定义一个全局变量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)是指程序中变量、函数、类等实体的可见范围和生命周期。根据实体的定义位置和作用范围,可以将域分为以下几种类型:

  1. 全局域(Global Scope):全局域中定义的变量、函数、类等实体在整个程序中都是可见的,它们的生命周期与程序的运行时间相同。在C/C++中,全局变量和全局函数默认情况下都属于全局域。

  2. 局部域(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;
}

 这种嵌套没有限制,可以进行多层嵌套。

C++中多个文件中相同的命名空间会被合并成一个命名空间。这是因为命名空间是C++中用于避免命名冲突的机制,它的作用是将一组相关的函数、类、变量等封装在一个命名空间中,以避免命名冲突和提高代码的可读性。

5、访问命名空间

  1.  指定命名空间访问
    struct Code::Q::Node node1;
    struct Code::L::Node node2;
  2.  全局展开. 一般情况,不建议全局展开的。
    #include "list.h"
    using namespace Code;
    int main()
    {
    	struct L i;
    	return 0;
    }
    但是一般情况下不建议全局展开,项目中禁止,平时练习可以。
  3. 部分展开
    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是一个命名空间,它包含了许多标准库函数和对象,例如coutcin。命名空间的作用是为了避免不同库中的函数或对象名称冲突,因此在使用标准库中的函数和对象时,

  • 如果不使用 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(); 至少传一个值给a
	return 0;
}

这种就不可以 ,不符合从右往左连续缺省。

void Func(int a = 0, int b , int c = 3)

 注意!

缺省参数不能在函数声明和定义中同时出现

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

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

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

相关文章

Python开源项目DifFace——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

无论是自己、家人或是朋友、客户的照片&#xff0c;免不了有些是黑白的、被污损的、模糊的&#xff0c;总想着修复一下。作为一个程序员 或者 程序员的家属&#xff0c;当然都有责任满足他们的需求、实现他们的想法。除了这个&#xff0c;学习了本文的成果&#xff0c;或许你还…

如何在面试中胜出?接口自动化面试题安排上

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

Godot4.1 GDExtension 配置VisualStudio方法梳理以及快捷配置工具

写在最前 本篇教程基于之前教程&#xff0c;并且默认为Windows10&#xff0c;64位&#xff0c;Godot版本4.1.3如果遇到任何问题&#xff0c;欢迎及时提出&#xff0c;如果配置成功了请点个赞&#xff0c;球球啦。 之前教程 https://blog.csdn.net/qq_31805591/article/detai…

天机学堂-1、项目搭建,微服务架构设计

1.学习背景 各位同学大家好&#xff0c;经过前面的学习我们已经掌握了《微服务架构》的核心技术栈。相信大家也体会到了微服务架构相对于项目一的单体架构要复杂很多&#xff0c;你的脑袋里也会有很多的问号&#xff1a; 微服务架构该如何拆分&#xff1f; 到了公司中我需要自…

8.查询数据

一、单表查询 MySQL从数据表中查询数据的基本语为SELECT语。SELECT语的基本格式是: SELECT {* | <字段列名>} [ FROM <表 1>, <表 2>… [WHERE <表达式> [GROUP BY <group by definition> [HAVING <expression> [{<operator>…

Linux网络应用层协议之http/https

文章目录 目录 一、http协议 1.URL 2.http协议格式 3.http的方法 4.http的状态码 5.http常见header 6.实现一个http服务器 二、https协议 1.加密 2.为什么要加密 3.常见的加密方式 对称加密 非对称加密 4.https的工作过程探究 方案1 只使用对称加密 方案2 只使…

类似于推箱子的小游戏 寻找 最短路径

实现效果如下 类似 推箱子小游戏 的变种 C/C版本 BFS最短路径 黑色代表墙壁 不能越过 蓝色代表HOME点 灰色代表要找的小箱子 绿色代表路径 最终目标是将灰色的小箱子移动到蓝色的HOME点 需要两次搜索 第一次是 出发点到灰色小箱子 第二次是灰色小箱子到蓝色HOME点 BF…

python爬取网站数据,作为后端数据

一. 内容简介 python爬取网站数据&#xff0c;作为后端数据 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接&#xff1a; 三.主要流程 3.1 通过urllib请求网站 里面用的所有的包 ! pip install lxml ! pip install selenium ! pip install…

100G.的DDoS高防够用吗?

很多人以为100G的DDoS防御已经足够了&#xff0c;但殊不知DDoS攻击大小也是需要分行业类型的&#xff0c;比如游戏、金融、影视、电商甚至ZF或者行业龙头等等行业类型&#xff0c;都是大型DDoS攻击的重灾区&#xff0c;别说100G防御&#xff0c;就算300G防御服务器也不一定够用…

开启核磁数据处理新篇章-MestReNova(MNOVA14)助您轻松解读科学界密码

在科学研究领域&#xff0c;核磁共振&#xff08;NMR&#xff09;技术被广泛应用于分析和解读化学物质的结构和性质。而MestReNova&#xff08;MNOVA14&#xff09;作为一款专业的核磁数据处理软件&#xff0c;凭借其强大的功能和易用性&#xff0c;已成为众多科研人员的首选工…

用这个平台制作电子杂志,,还能实时分享,太方便啦!

在我们看电子杂志的时候&#xff0c;总会觉得图文效果有点枯燥&#xff0c;如果能做出翻页书效果的电子杂志&#xff0c;还给人一种身临其境的真实翻书感就好了。 其实制作这种翻页电子杂志很简单&#xff0c;不需要下载安装任何软件&#xff0c;只需登录FLBOOK这个平台 &…

SpringCloud微服务:Nacos的下载和配置

目录 Nacos的下载 Nacos的配置 Nacos的下载 nacos压缩包&#xff0c;点击下载百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/…

NVIDIA安装

电脑显卡类型 两种方法&#xff1a; 选择对应的版本 产品系列下载Notebooks&#xff0c;这样产品才会出现Laptop的GPU&#xff08;Laptop是代表笔记本&#xff09;。 下载完之后双击安装&#xff0c;更改下载路径后&#xff0c;选择默认的下载即可。 卸载 如果之后要卸载…

上位机模块之halcon绘制ROI与获取ROI,在hsmartwindow实现

在上位机中通常需要使用到绘制ROI模块或者获取已经绘制好的ROI区域的参数&#xff0c;在这里通过使用hsmartwindow窗体控件进行对ROI的绘制和获取。 先上代码&#xff1a; /// <summary>/// 创建ROI/// </summary>/// <param name"Win">传入HSmar…

2023鸿蒙预定未来,环境搭建学习

鸿蒙开发基础知识 鸿蒙的基本概念和特点 鸿蒙&#xff08;HarmonyOS&#xff09;是华为公司开发的一款全场景分布式操作系统。它的设计目标是为各种设备提供统一的、无缝的用户体验。鸿蒙的核心特点包括以下几个方面&#xff1a; 分布式架构&#xff1a;鸿蒙采用分布式架构&…

EDA实验------数控分频器设计(QuartusII)

目录 一、实验目的 二、实验原理 三、实验内容 四、实验步骤 五、注意事项 六、思考题 七、实验过程 分频器的基本原理 什么是分频器&#xff1f; 如何去分频&#xff1f; 1.创建新项目 2.创建Verilog文件&#xff0c;写入代码 3.连接电路 ​编辑 锁相环的创建 4…

9.基于SpringBoot3+MybatisPlus定制化代码生成器类

我们在3.基于SpringBoot3集成MybatisPlus中讲到自定义代码生成器&#xff0c;但是往往遗留代码生成的类格式或者命名不符合要求&#xff0c;需要手工修改&#xff0c;但是当表很多时就比较头痛,所以我们自定义模板在进行代码生成 1. 新建MyTemplateEngine.java类 里面大多实现…

企业大文件传输的四大误区:你还在用传统的FTP和网盘吗?

在当前数字化时代&#xff0c;数据已经成为企业的核心资产&#xff0c;而文件传输则是数据流动的重要方式。企业需要高效、安全、稳定地传输各种类型和规模的文件&#xff0c;无论是内部协作还是外部交付。然而&#xff0c;很多企业在文件传输方面存在一些误区&#xff0c;导致…

“大数据分析师”来了,提高职业含金量,欢迎来领

大数据分析师是指在不同行业中&#xff0c;专门从事相关数据的收集、整理、分析&#xff0c;并依据数据通过科学算法模型进行行业研究、评估和预测等工作的专项人才。应用行业涉及互联网信息技术企业、科研院校、金融行业、制造业、物流、生物医疗、农业等大数据相关行业。 常…

Unity中Shader矩阵的逆矩阵

文章目录 前言一、逆矩阵的表示二、逆矩阵的作用四、逆矩阵的计算五、顺序的重要性六、矩阵的逆总结1、求矩阵的逆前&#xff0c;这个矩阵必须得是个方阵2、只有 A x A ^-1^ A^-1^ x A 1时&#xff0c;A的逆才是A^-1^3、求2x2矩阵的逆&#xff1a;交换 a 和 b 的位置&#xf…