【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);//上面的例子中的命名空间tmhreturn 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中的aprintf("%d\n", b);//正确,去访问tmh中的bint 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?

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


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

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

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

相关文章

实战入门 K8s剩下三个模块

1.Label Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识&#xff0c;用来对它们进行区分和选择。 Label的特点&#xff1a; 一个Label会以key/value键值对的形式附加到各种对象上&#xff0c;如Node、Pod、Service等等 一个资源对象可以定义任意数量…

圆梦、取舍、成长—独孤风的2023年回顾

大家好&#xff0c;我是独孤风&#xff0c;一位曾经的港口煤炭工人&#xff0c;目前在某国企任大数据负责人&#xff0c;公众号大数据流动的作者。 2023年马上就要过去了&#xff0c;这一年我们结束了三年核酸检测的生活。一切回归到正常的轨迹。回望这一年可能更多的时候会觉得…

计算机操作系统(OS)——P5设备管理

1、I/O设备的概念和分类 什么是I/O设备 I/O就是输入/输出&#xff08;Input/Output&#xff09;。 I/O设备就是可以将数据输入到计算机&#xff0c;或者可以接收计算机输出数据的外部设备&#xff0c;属于计算机中的硬件部件。 UNIX系统将外部设备抽象为一种特殊的文件&#x…

30 UVM Adder Testbench Example

1 Adder Design 加法器设计在时钟的上升沿产生两个变量的加法。复位信号用于clear out信号。注&#xff1a;加法器可以很容易地用组合逻辑开发。引入时钟和重置&#xff0c;使其具有测试台代码中时钟和重置的样子/风格。 module adder(input clk, reset, input [7:0] in1, in…

数据结构模拟实现LinkedList双向不循环链表

目录 一、双向不循环链表的概念 二、链表的接口 三、链表的方法实现 &#xff08;1&#xff09;display方法 &#xff08;2&#xff09;size方法 &#xff08;3&#xff09;contains方法 &#xff08;4&#xff09;addFirst方法 &#xff08;5&#xff09;addLast方法 …

QT音频编程实战项目(一)ui搭建和槽函数的完成

第一个类实现播放音乐&#xff0c;第二个类实现歌曲列表&#xff0c;第三个类是播放本地歌曲 上边是歌曲的总时长&#xff0c;下边是当前播放的时长。 所需要的槽函数如上图。 这个是构造函数&#xff1a; …

Group k-fold解释和代码实现

Group k-fold解释和代码实现 文章目录 一、Group k-fold解释和代码实现是什么&#xff1f;二、 实验数据设置2.1 实验数据生成代码2.2 代码结果 三、实验代码3.1 实验代码3.2 实验结果3.3 结果解释 四、总结 一、Group k-fold解释和代码实现是什么&#xff1f; 0&#xff0c;1…

找不到msvcp140.dll文件的多种解决方法,五个方法轻松搞定

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一个组件&#xff0c;它是运行许多Windows应用程序所必需的动态链接库文件之一。当这个文件丢失或损坏时&#xff0c;就会导致相关应用程序无法正常启动或运行。本文将全面解析msvcp140.dll丢失的原因以及解决方法。 关…

JavaWeb——前端之AjaxVue

6. 前后端交互 6.1 Ajax&#xff08;原生的&#xff09; 概念&#xff1a; Asynchronous JavaScript And XML&#xff08;异步的JavaScript和XML&#xff09; 作用&#xff1a; 数据交互&#xff1a;通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据异步交…

爱思唯尔的KBS——模板、投稿、返修、接收的总结

第二篇论文终于是接受了QAQ&#xff0c;被审稿人疯狂拖时间&#xff0c;KBS是真难绷啊 由于之前发布过关于爱思唯尔旗下的ESWA博客&#xff0c;KBS和ESWA是类似的&#xff0c;因此本篇博客主要说下区别以及期间碰到的各种情况&#xff0c;有疑问依然可以在评论区说&#xff0c;…

从0到1入门C++编程——02 通讯录管理系统

文章目录 一、创建结构体及菜单显示二、添加联系人三、显示联系人四、删除联系人五、查找联系人六、修改联系人七、清空联系人八、退出通讯录 本文通过C实现一个通讯录管理系统&#xff0c;系统要实现的功能如下。 1、添加联系人&#xff1a;向通讯录中添加新人&#xff0c;信息…

Lightroom Classic 2024 for Mac/win中文版:摄影后期处理的极致体验

随着数字摄影的普及&#xff0c;后期处理成为创作过程中的关键环节。对于摄影师而言&#xff0c;一款强大的后期处理软件是必不可少的。Adobe Lightroom Classic 2024正是这样一款备受推崇的软件&#xff0c;它为摄影师提供了从导入、编辑到共享的一站式解决方案&#xff0c;让…

数据结构期末复习(3)栈和队列

堆栈&#xff08;stack&#xff09; 堆栈&#xff08;stack&#xff09;是一种基于后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;原则的数据结构。它模拟了现实生活中的堆栈&#xff0c;类似于一摞盘子或一堆书。 堆栈有两个基本操作&#xff1a;入栈&a…

2.3物理层下面的传输媒体

目录 2.3物理层下面的传输媒体2.3.1导引型传输媒体1.双绞线2.同轴电缆3.光纤 2.3.2非导引型传输媒体无线电微波通信 2.3物理层下面的传输媒体 传输媒体是数据传输系统中在发送器和接收器之间的物理通路 两大类&#xff1a; 导引型传输媒体&#xff1a;电磁波被导引沿着固体媒体…

开放原子训练营(第四季)TobudOS——TobudOS内核移植(keil版)

前言 12月份参加了开放原第四季线下活动&#xff0c;觉得很有意义。通过这篇博文&#xff0c;记录一下这次活动进行的移植TobudOS内核的过程&#xff0c;下面就让我们开始吧。 开发板介绍 本次使用的开发板型号为STM32H750&#xff0c;当然了&#xff0c;其他型号的开发版也…

Angular进阶之六:Progressive rendering

简介 Progressive Rendering 是一种提高 Web 应用性能的方法&#xff0c;允许页面在加载过程中逐步呈现&#xff0c;以提高用户体验。在本文中&#xff0c;我们将探讨如何在 Angular 中通过自定义指令实现 Progressive Rendering&#xff0c;特别是处理从服务器获取大量数据的…

Java开发过程中的幂等性问题

幂等性问题&#xff1a; 1. 有时我们在填写某些 form表单 时&#xff0c;保存按钮不小心快速点了两次&#xff0c;表中竟然产生了两条重复的数据&#xff0c;只是id不一样。 2. 我们在项目中为了解决 接口超时 问题&#xff0c;通常会引入了 重试机制 。第一次请求接口超时了…

【揭秘】如何使用LinkedHashMap来实现一个LUR缓存?

LRU&#xff08;Least Recently Used&#xff09;缓存是一种常用的缓存淘汰策略&#xff0c;用于在有限的缓存空间中存储数据。其基本思想是&#xff1a;如果数据最近被访问过&#xff0c;那么在未来它被访问的概率也更高。因此&#xff0c;LRU缓存会保留最近访问过的数据&…

Python编程新技能:如何优雅地实现水仙花数?

水仙花数&#xff08;Narcissistic number&#xff09;也被称为阿姆斯特朗数&#xff08;Armstrong number&#xff09;或自恋数等&#xff0c;它是一个非负整数&#xff0c;其特性是该数的每个位上的数字的n次幂之和等于它本身&#xff0c;其中n是该数的位数。简单来说&#x…

00-开篇导读:学习分库分表开源框架的正确方法

1 前言 互联网高速发展带来海量的信息化数据&#xff0c;也带来更多的技术挑战。各种智能终端设备&#xff08;比如摄像头或车载设备等&#xff09;以每天千万级的数据量上报业务数据&#xff0c;电商、社交等互联网行业更不必说。这样量级的数据处理&#xff0c;已经远不是传…