【C++对于C语言的扩充】C++与C语言的联系,命名空间、C++中的输入输出以及缺省参数

请添加图片描述

文章目录

  • 🚀前言
  • 🚀C++有何过C之处?
  • 🚀C++中的关键字
  • 🚀命名空间
    • ✈️为什么要引入命名空间?
    • ✈️命名空间的定义
    • ✈️如何使用命名空间中的内容呢?
  • 🚀C++中的输入和输出
    • ✈️C++标准库的命名空间
    • ✈️输入输出头文件
  • 🚀C++缺省参数
    • ✈️缺省参数定义
    • ✈️缺省参数的分类
    • ✈️缺省参数只能出现在函数声明中

🚀前言

铁子们好啊!这是阿辉新开的专栏《拿下C++》的第一篇文章,本文主要带大家了解一下C++,带大家从C语言过渡到C++,所以大家首先要有C语言的基础,否则后面的内容你可能会异常懵逼。不会C语言的铁子,这里推荐各位先看阿辉的专栏《爱上C语言》(点击即可跳转,自荐一下嘛 😆)
不多bb好吧,让我们迈向C++的世界!!!


本篇文章仅为C++向C语言过渡的第一篇,后续会持续更新相关内容,阿辉不会去讲C++的发展史,阿辉旨在让铁子们快速入门C++,对于c++发展史感兴趣的铁子可以自行研究 😘


🚀C++有何过C之处?

首先,我们都知道C++这门编程语言是在C语言的基础上发展而来的,他名字也是由此而来,C++是完全兼容C语言的,怎么理解呢?C语言相当于是C++的真子集,C++包含了C语言的所有特性和语法规则,并且可以直接调用C语言的函数和库,也就是说C语言的代码在C++的环境下同样可以编译运行,用ven图表示如下
请添加图片描述
铁子们或许都听过C++是面向对象的语言,这个怎么理解呢?好的这个咱们先不理解 😅,因为我也不知道,my teacher告诉我学完C++你就懂了,好的铁子们咱们也学完C++在懂,提前懂了显得咱欺负人 😝

🚀C++中的关键字

C++中的69个关键字包含C语言中的32个关键字

关键字关键字关键字关键字关键字关键字关键字关键字
asmelsenewthisautoenumoperatorthrow
boolexplicitprivatetruebreakexportprotectedtry
caseexternpublictypedefcatchfalseregistertypeid
charfloatreinterpret_casttypenameclassforreturnunion
constfriendshortunsignedconst_castgotosignedusing
continueifsizeofvirtualdefaultinlinestaticvoid
deleteintstatic_castvolatiledolongstructwchar_t
doublemutableswitchwhiledynamic_castnamespacetemplatenullptr
typeidoverridealignasfinalchar16_t

这些关键字不认识没关系,也不需要去背,用熟了自然就会了 😁

🚀命名空间

✈️为什么要引入命名空间?

C++引入了命名空间的概念,以便更好地组织和管理代码。为啥呢?

大型程序一般会使用多个独立开发的库,这些库又可能定义大量的全局变量的名字,如类、函数和模板等。当程序用到多个供应商提供的库时,不可避免地会发生某些名字相互冲突地情况。
这个时候我们将每一个库都装起来,用的时候再拿出来用,既能保证命名不会冲突,又能在需要时使用

命名空间分割了全局命名空间,其中每一个命名空间是一个作用域域是一种空间概念,常见的域有:局部域、全局域、类域、命名空间域,域会影响访问和生命周期

✈️命名空间的定义

首先,定义命名空间需要使用namespace这个关键字,然后在namepace后面跟上命名空间的名字一对花括号{},花括号里面放的是命名空间内的变量、函数、类等的定义和声明,命名空间也可以嵌套定义
切记命名空间花括号后无分号
下面我们来展示一个例子:

//下面这个tmh命名空间嵌套了一个命名空间tzh
namespace tmh//命名空间的名字
{
	//定义变量
	int a = 10;
	//定义函数
	int Add(int left, int right)
	{
		return left + right;
	}
	//定义类型
	struct Node
	{
		struct Node* next;
		int val;
	};
	//嵌套命名空间
	namespace tzh
	{
		int c;
		int d;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}

注意

  • 命名空间的名字可以重复,这种重复并非两个不同的命名空间,而是在编译过程中将相同名字的命名空间合并,事实上还是一个命名空间

  • 命名空间不能在类和函数中定义

✈️如何使用命名空间中的内容呢?

这里我们引入一个操作符::作用域限定符,怎么使用呢?我们接着看

  • 命名空间的名字+::+命名空间内的变量、函数、类型等等
    例子:
int main()
{
    printf("%d\n", tmh::a);//上面的例子中的命名空间tmh
    return 0;    
}
  • 使用using将命名空间中某个成员(局部展开)
    例子:
using tmh::Node;//将定义的结构体Node展开在全局域中
int main()
{
   Node a;//用Node创建变量
    return 0;    
}
  • 使用using namespace 命名空间名称引入(全局展开)
    可以用using namespace tmh将命名空间展开(意味着在整个文件中都可以直接访问该命名空间中的函数、变量等),把命名空间中的成员提升到包含命名空间本身和using指示最近的作用域
    例子:
namespace tmh
{
	int a = 10;
	int b = 5;
	int c = 100;
}

int a = 30;

using namespace tmh;

int main()
{
	printf("%d\n", a);//这种写法是错误的,因为全局中定义了a,命名空间tmh中的a也展开在了全局域
	printf("%d\n", ::a);//正确:访问全局的a,::左边空白表示全局域
	printf("%d\n", tmh::a);//正确:访问tmh中的a
	printf("%d\n", b);//正确,去访问tmh中的b
	int c = 89;
	c++;//当前局部的c设置成90,局部变量优先,没有特别的指示优先使用局部域中的元素
	return 0;
}

🚀C++中的输入和输出

✈️C++标准库的命名空间

C++与C语言不同,在C++中标准库的定义和声明是分开的
std是C++标准库的命名空间,C++将标准库的定义实现都放到这个命名空间中
而将声明放在单独存放在各自的头文件中
std命名空间的使用惯例:

  • 在日常练习中,建议直接用using namespace std即可,这样很方便
  • 在项目开发中由于代码较多、规模大,就很容易出现冲突问题,所以建议指定命名空间去访问或者使用using把常用的名字引入

✈️输入输出头文件

C++中输入输出:

  • 使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含< iostream >头文件以及std标准命名空间
  • 使用C++输入输出更方便,不需增加数据格式控制,比如:整形–%d,字符–%c
    ostream (输出流)类型全局对象,istream (输入流)类型全局对象 ,endl全局的换行符号
  • <<是流插入运算符,>>是流提取运算符
  • 使用C++的输入输出更加方便,不需要像printf和scanf输入输出那样,需要手动控制格式。C++的输入输出可以自动识别变量类型(本质上是运算符重载),但cout和cin的效率比较低

给铁子们直接上代码:

struct Person
{
	char name[10];
	int age;
};
int main()
{
	std::cout << "C++ ";
	std::cout << "C++ " << std::endl;
	//cout与cin对比C语言printf\scanf 来说可以自动识别类型(函数重载+运算符重载)
	int a = 10;
	int* p = &a;
	printf("%d,%p\n", a, p);
	std::cout << a << "," << p << std::endl;
	char str[100];
	std::cin >> str;  //cin不用&
	std::cout << str << std::endl;
	struct Person P = { "tmh", 20 };  //格式化输出printf比cout好
	printf("name:%s age:%d\n", P.name, P.age);
	std::cout << "name:" << P.name<<" age:"<< P.age << "\n";
}

输入:

tmhazjy

输出:

C++ C++
10,0xffff4860
10,0xffff4860
tmhazjy
name:tmh age:20
name:tmh age:20

🚀C++缺省参数

✈️缺省参数定义

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参(缺省就是默认,没给函数传参就用默认的)

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

✈️缺省参数的分类

  • 半缺省参数
void test1(int a, int b = 10, int c = 20)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}

半缺省参数必须从右往左依次给缺省值,即:第一个形参和第二个形参给了缺省值,而第三个形参没有给缺省值,这种情况是不被允许的。也不能隔着给,即:第三个形参和第一个形参给了缺省值,而第二个形参没有给缺省值,这种情况也是不被允许的

  • 全缺省参数
void test2(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}

顾名思义就是每一个参数都设置缺省值

✈️缺省参数只能出现在函数声明中

为了避免出现不一致的情况,要求缺省参数不能在函数声明和定义中同时出现,并且只能出现在函数的声明中
why?

因为在预处理阶段会把头文件展开,一般函数的声明就放在头文件中。如果只在函数的定义中给了缺省值,那头文件展开后,函数的声明语句中并没有缺省参数,此时如果在调用该函数的时候没有传参希望使用它的缺省值,那在程序编译的过程中就会出现问题,即:函数的声明没给出缺省值,意味着该函数需要参数


今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是阿辉前进的动力!
请添加图片描述

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

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

相关文章

SpringBoot实用篇

SpringBoot实用篇 1、热部署 什么是热部署&#xff1f; 所谓热部署&#xff0c;就是在应用正在运行的时候升级软件&#xff0c;却不需要重新启动应用。对于Java应用程序来说&#xff0c;热部署就是在运行时更新Java类文件。 热部署有什么用&#xff1f; 节约时间&#xff0c;热…

Mybatis枚举类型处理和类型处理器

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

linux下docker搭建Prometheus +SNMP Exporter +Grafana进行核心路由器交换机监控

一、安装 Docker 和 Docker Compose https://docs.docker.com/get-docker/ # 安装 Docker sudo apt-get update sudo apt-get install -y docker.io# 安装 Docker Compose sudo apt-get install -y docker-compose二、创建配置文件及测试平台是否正常 1、选个文件夹作为自建…

医学图像分割中的频域多轴表示学习

摘要 https://arxiv.org/pdf/2312.17030v1.pdf 最近&#xff0c;视觉Transformer (ViT)在医学图像分割&#xff08;MIS&#xff09;中得到了广泛应用&#xff0c;这归功于其在空间域应用自注意力机制来建模全局知识。然而&#xff0c;许多研究都侧重于改进空间域模型&#xff…

LeetCode刷题--- 不同路径 III

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递…

x-cmd pkg | gum - 很好看的终端 UI 命令行工具

目录 简介首次用户功能特点Bubbles 与 Lip Gloss进一步探索 简介 gum 由 Charm 组织于 2022 年使用 Go 语言开发。旨在帮助用户编写 Shell 脚本与 dotfiles 时提供一系列快捷使用&#xff0c;可配置&#xff0c;可交互&#xff0c;美观的 Terminal UI 组件。 首次用户 使用 x…

U4_3 语法分析-自底向上分析-LR0/LR1/SLR分析

文章目录 一、LR分析法1、概念2、流程3、LR分析器结构及分析表构造1&#xff09;结构2&#xff09;一些概念 二、LR(0)分析法1、流程2、分析动作1&#xff09;移近2&#xff09;归约(reduce) 3、总结1&#xff09;LR分析器2&#xff09;构造DFA3&#xff09;构造LR(0)的方法(三…

Apache SSI 远程命令执行漏洞

一、环境搭建 二、访问upload.php 三、写shell <!--#exec cmd"id" --> 四、访问 如图所示&#xff0c;即getshell成功&#xff01;​

K8s实战入门

1.NameSpace Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下&#xff0c;kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中&#xff0c;可能不想让两个Pod之间进行互相…

C#线程基础(线程启动和停止)

目录 一、关于线程 二、示例 三、生成效果 一、关于线程 在使用多线程前要先引用命名空间System.Threading&#xff0c;引用命名空间后就可以在需要的地方方便地创建并使用线程。 创建线程对象的构造方法中使用了ThreadStart()委托&#xff0c;当线程开始执行时&#xff0c…

tp5+workman(GatewayWorker) 安装及使用

一、安装thinkphp5 1、宝塔删除php禁用函数putenv、pcntl_signal_dispatch、pcntl_wai、pcntl_signal、pcntl_alarm、pcntl_fork&#xff0c;执行安装命令。 composer create-project topthink/think5.0.* tp5 --prefer-dist 2、配置好站点之后&#xff0c;浏览器打开访问成…

Qt菜单工具栏和状态栏

QMenuBar 接口介绍 QAction 定义&#xff1a;QAction 是一个独立于具体界面元素的抽象动作表示。它封装了一个用户界面动作&#xff08;比如点击命令&#xff09;&#xff0c;通常与一个菜单项、工具栏按钮或快捷键相关联。用途&#xff1a;你可以将 QAction 视为一个可执行的…

解决Android Studio的adb命令行报错Permission denied问题-建议收藏备用!

目录 前言 一、报错信息 二、常见解决方法 三、最简单的解决方法 四、更多资源 前言 随着移动设备的普及&#xff0c;Android操作系统成为了全球最主要的移动设备操作系统之一。在开发和调试Android应用程序时&#xff0c;我们常常需要使用adb&#xff08;Android Debug B…

Resnet BatchNormalization 迁移学习

时间&#xff1a;2015 网络中的亮点&#xff1a; 超深的网络结构&#xff08;突破1000层&#xff09;提出residual模块使用Batch Normalization加速训练&#xff08;丢弃dropout&#xff09; 层数越深效果越好&#xff1f; 是什么样的原因导致更深的网络导致的训练效果更差呢…

云计算:OpenStack 分布式架构部署(单控制节点与多计算节点)

目录 一、实验 1.环境 2. 计算服务安装(计算节点2) 3. 网络服务安装(计算节点2) 一、实验 1.环境 (1) 主机 表1 主机 主机架构IP备注controller控制节点192.168.204.210已部署compute01计算节点1192.168.204.211 已部署compute02计算节点2192.168.204.212 &#xff08;…

如何下载Sentinel-1数据

Sentinel-1是欧洲空间局&#xff08;ESA&#xff09;的一组地球观测卫星&#xff0c;属于Copernicus计划的一部分。该计划旨在为全球环境监测提供数据&#xff0c;并支持应对气候变化、自然灾害和人类活动的挑战。Sentinel-1卫星的主要任务是提供全天候、全时段、高分辨率的合成…

C#-CSC编译环境搭建

一.Microsoft .NET Framework 确保系统中安装Microsoft .NET Framework相关版本下载 .NET Framework 4.7 | 免费官方下载 (microsoft.com)https://dotnet.microsoft.com/zh-cn/download/dotnet-framework/net47 二.编译环境搭建 已经集成编译工具csc.exe,归档至gitcode,实现us…

5G随身WiFi避坑,5G随身WiFi口碑推荐,5G随身WiFi避雷,5G随身WiFi好用吗?

第一、切忌盲目入坑&#xff0c;目前市面上的主流随身 WiFi都是4G网络&#xff0c;不支持5G&#xff0c;当一些只卖几十块的随身WiFi&#xff0c;商家告诉你是5G随身WiFi的时候&#xff0c;直接拉黑。随身WiFi芯片都上百了&#xff0c;设备才几十块&#xff0c;怎么可能&#x…

浅聊配置化-要不要实现动态表单

1、配置化的原则 配置化是一种抽象&#xff0c;把事物分成2类&#xff1a;不变的&#xff0c;可变的。 如果事物都是可变的&#xff0c;是无法实现配置化的。 配置化的根本在于找到不变的事物&#xff0c;基于不变的事物进行可变事物的配置。 所以&#xff0c;认为一切皆可…

老子的《道德经》透露,不努力反而更成功

人类生而自由&#xff0c;但到处都是枷锁。 永远不要怀疑经过慎思且足够投入的一小群人能否改变这个世界。事实上&#xff0c;只有他们才办得到。 优美灵魂的两个发展方向&#xff1a;崇拜道德的天才&#xff0c;对别人实行道德的判断。 一、道 《道德经》开始的名字是《老子…