【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个关键字
关键字 | 关键字 | 关键字 | 关键字 | 关键字 | 关键字 | 关键字 | 关键字 |
---|---|---|---|---|---|---|---|
asm | else | new | this | auto | enum | operator | throw |
bool | explicit | private | true | break | export | protected | try |
case | extern | public | typedef | catch | false | register | typeid |
char | float | reinterpret_cast | typename | class | for | return | union |
const | friend | short | unsigned | const_cast | goto | signed | using |
continue | if | sizeof | virtual | default | inline | static | void |
delete | int | static_cast | volatile | do | long | struct | wchar_t |
double | mutable | switch | while | dynamic_cast | namespace | template | nullptr |
typeid | override | alignas | final | char16_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?
因为在预处理阶段会把头文件展开,一般函数的声明就放在头文件中。如果只在函数的定义中给了缺省值,那头文件展开后,函数的声明语句中并没有缺省参数,此时如果在调用该函数的时候没有传参希望使用它的缺省值,那在程序编译的过程中就会出现问题,即:函数的声明没给出缺省值,意味着该函数需要参数
今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是阿辉前进的动力!
相关文章:

【C++对于C语言的扩充】C++与C语言的联系,命名空间、C++中的输入输出以及缺省参数
文章目录 🚀前言🚀C有何过C之处?🚀C中的关键字🚀命名空间✈️为什么要引入命名空间?✈️命名空间的定义✈️如何使用命名空间中的内容呢? 🚀C中的输入和输出✈️C标准库的命名空间✈…...

Excel中部分sheet页隐藏并设置访问密码
1、新建sheet1 2、新建sheet2 3、隐藏sheet2 4、保护工作簿、输密码 5、密码二次确认 6、隐藏的sheet2已经查看不了 7、想要查看时,按图示输入原密码即可 8、查看sheet2内容...

从零开始配置pwn环境:CTF PWN 做题环境
前期在kali2023环境安装的pwndocker使用发现不好用,so找了网上配置好pwn环境的虚拟机。 GitHub - giantbranch/pwn-env-init: CTF PWN 做题环境一键搭建脚本 可以直接下载我配置好的Ubuntu 16.04,为VMware导出的ovf格式 链接:百度网盘 请输…...

Vue3复习笔记
目录 挂载全局属性和方法 v-bind一次绑定多个值 v-bind用在样式中 Vue指令绑定值 Vue指令绑定属性 动态属性的约束 Dom更新时机 ”可写的“计算属性 v-if与v-for不建议同时使用 v-for遍历对象 数组变化检测 事件修饰符 v-model用在表单类标签上 v-model还可以绑定…...

【OpenCV】OpenCV:计算机视觉的强大工具库
摘要 OpenCV是一个广泛应用于计算机视觉领域的开源工具库,为开发者提供了丰富的图像处理和计算机视觉算法。本文将介绍OpenCV的功能和应用领域,并探讨它在实践中的重要性和前景。 计算机视觉的强大工具库 一、什么是OpenCV?二、OpenCV的功…...

spring-boot-autoconfigure误引入spring-boot-starter-data-jpa而导致数据源初始化异常
一、现状描述 某个Grade类引入了jpa的注解: import javax.persistence.Column; import javax.persistence.Embeddable;/*** 年级*/ Embeddable public class Grade {Column(name "code")private int code; }并且pom.xml中引入该jar包:sprin…...

工程(十六)——自己数据集跑Fast_livo
一、基础环境 Ubuntu20.04 ROS noetic PCL 1.8 Eigen 3.3.4 Sophus git clone https://github.com/strasdat/Sophus.git cd Sophus git checkout a621ff mkdir build && cd build && cmake .. make sudo make install 下面两个直接把包下载下来一起编译…...

PostgreSQL数据库的json操作
1.操作符 select json字段::json->key值 from order -- 对象域 select json字段::json->>key值 from order -- 文本 select json字段::json#>{key值} from order -- 对象域 select json字段::json#>>{key值} from order -- 文本对象域表示还能继续操作&#…...
gradio-osprey-demo
创建需要的dockerfle ################### # 使用 Ubuntu 作为基础镜像 FROM nvcr.io/nvidia/cuda:11.8.0-devel-ubuntu22.04 # 更新软件包列表并安装依赖项 RUN apt update && \ apt install -y python3 python3-pip git ffmpeg libsm6 libxext6 curl wget …...

从仿写持久层框架到MyBatis核心源码阅读
接上篇手写持久层框架:https://blog.csdn.net/liwenyang1992/article/details/134884703 MyBatis源码 MyBatis架构原理&主要组件 MyBatis架构设计 MyBatis架构四层作用是什么呢? API接口层:提供API,增加、删除、修改、查询…...

浏览器常用基本操作之python3+selenium4自动化测试
1、打开指定的网页地址 我们使用selenium进行自动化测试时,打开浏览器之后,第一步就是让浏览器访问我们指定的地址,可使用get方法实现 1 2 3 from selenium import webdriver driver webdriver.Edge() driver.get(https://www.baidu.com/)…...

在MySQL中使用VARCHAR字段进行日期筛选
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...

微信小程序自定义步骤条效果
微信小程序自定义一个步骤条组件,自定义文字在下面,已完成和未完成和当前进度都不一样的样式,可点击上一步和下一步切换流程状态,效果如下。 这是视频效果: 前端实现步骤条效果 下面我们一步步实现编码,自定…...

QT的信号与槽
QT的信号与槽 文章目录 QT的信号与槽前言一、QT 打印"hello QT"的dome二、信号和槽机制?二、信号与槽的用法1、QT5的方式1. 无参的信号与槽的dome2.带参的信号与槽dome 2、QT4的方式3、C11的语法 Lambda表达式1、函数对象参数2、操作符重载函数参数3、可修…...

Python 为UnityAndroid端自动化接入Tradplus广告SDK
Python 为UnityAndroid端自动化接入Tradplus广告SDK Tradplus介绍常规接入进入Android开发文档选择渠道配置生成接入代码人工依赖下载官网同版本的 Unity插件 使用自动化工具接入首次 你需要打两个标记来定位运行工具 控制台会列出最新的十个Tradplus版本 任选其一然后拖入项目…...

Matplotlib基础
目录: 一、绘制yx^2图像: 一、绘制yx^2图像: from matplotlib import pyplot as plt import numpy as np #生成(-50,50)的数组 x np.arange(-50,50) #计算因变量y的值 y x ** 2 #根据x、y数组绘制图形yx^2 plt.plot…...
上海东海职业技术学院低代码实训平台建设项目竞争性磋商公告
上海东海职业技术学院低代码实训平台建设项目竞争性磋商公告 招标|招标公告 上海市|闵行区 项目编号:0773-2340GNSHFWCS2823 招标单位:上海东海职业技术学院 代理单位:中金招标有限责任公司 预算金额:59万元 联系方式&…...

c语言之将输入的十进制转换成二进制数并打印原码反码补码
十进制转二进制 首先,我们要知道的是十进制转换成二进制数的方法。我们一般采用的除二取余的方法,在这里我用32位数组来进行转换。 int main() {printf("请输入一个十进制数\n");int n 0;scanf("%d", &n);int arr[32];int* p…...
算法题明明的随机数
第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数,代表明明生成的随机数。 具体格式可以参考下面的"示例"。 import java.util.Iterator; import java.util.Scanner; import java.util.TreeSet; // 注意类名必须为 Main, 不要有任何 pa…...

B站不赚钱、“芒果”赚钱难,视频“后浪”火拼跨年夜
又是一年跨年时。 各大视频平台跨年晚会展开火拼,今年谁是赢家? 作为视频“后浪”,芒果超媒(300413.SZ)、哔哩哔哩(09626.HK,下称“B站”)此前相继公布了2023年三季报,…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...