【C++初阶】C++基础(上)——C++关键字、命名空间、C++输入输出、缺省参数、函数重载
目录
1. C++关键字
2. 命名空间
2.1 命名空间的定义
2.2 命名空间的使用
3. C++输入&输出
4. 缺省参数
4.1 缺省参数概念
4.2 缺省参数分类
5. 函数重载
5.1 函数重载概念
5.2 C++支持函数重载的原理——名字修饰(name Mingling)
5.3 extern "C"
❀❀❀没有坚持的努力,本质上并没有多大的意义。
1. C++关键字
#include <iostream> 相当于C语言中的 #include<stdio.h>
2. 命名空间
2.1 命名空间的定义
同一个作用域里面,是不能有同名变量的。
命名冲突,在C语言没有很好的解决这个问题,但是CPP引入了namespace来解决这个问题。
::域作用限定符
命名空间可以定义变量
#include <iostream>
//这是一个命名空间,可以定义变量、函数、类型
namespace ky
{int a = 0;int c = 2;
}int b = 0;
int c = 1;int main()
{int b = 1;int a = 1;printf("%d\n", b);//b = 1,访问局部变量printf("%d\n", ::b);//b = 0, 访问全局变量//::域作用限定符printf("%d\n", a);//a = 1;printf("%d\n", ky::a);//a = 0;printf("%d\n", c);//1printf("%d\n", ::c);//1printf("%d\n", ky::c);//2return 0;
}
命名空间可以定义函数、类型
#include <iostream>
namespace yyqx
{//定义函数void f(){printf("void f()\n");}//定义结构struct ListNode{int val;struct ListNode* next;};}namespace ky
{struct ListNode{int val;struct ListNode* next;};}int f = 0;
int main()
{printf("%d\n", f);//0printf("%p\n", yyqx::f);//结构体的地址yyqx::ListNode* n1 = NULL;ky::ListNode* n2 = NULL;return 0;
}
命名空间可以嵌套而且同名的命名空间是可以同时存在的,编译器编译时会将其合并。
代码1展示:
#include <iostream>namespace yyqx
{int a = 1;namespace A{struct Node{int val = 0;struct Node* next= NULL;};}}namespace yyqx
{int b = 1;namespace B{struct Node{int val = 0;struct Node* next = NULL;};}}int main()
{struct yyqx::A::Node n1;struct yyqx::B::Node n2;return 0;
}
命名空间不影响生命周期,是全局变量还是全局变量,只是命名发生冲突时,进行隔离的作用。【命名空间只能放在全局】
2.2 命名空间的使用
(1)加命名空间名称及作用域限定符
(2)使用using将命名空间中某个成员引入
using yyqx::a;//代码1//释放yyqx命名空间里面的变量a //释放的是命名空间就加namespace,如果释放的不是命名空间而是命名空间里的数据,就不用加namespace
(3)使用using namespace 命名空间名称引入
[我们经常使用第二种,既不会容易发生冲突,又不会特别麻烦]
using namespace yyqx;//意思是把yyqx这个命名空间定义的内容释放出来
int main()
{struct A::Node n1;struct B::Node n2;return 0;
}
using namespace yyqx;//意思是把yyqx这个命名空间定义的内容释放出来
using namespace A;//第二层释放
//因为A在yyqx里面,所以上面两行的内容不能进行交换
int main()
{struct Node n1;struct B::Node n2;return 0;
}
这里代码释放A,就不能释放B,否则就发生命名冲突(using相当于没有命名空间)
using namespace yyqx::A;
这个代码相当于释放A,但是并没有释放yyqx;
using namespace std;//std 封C++库的命名空间
3. C++输入&输出
#include <iostream>
using namespace std;int main()
{int a = 0;cin >> a;// >>流提取运算法,相当于scanfcout << a;// << 流插入运算法return 0;
}
#include <iostream>
using namespace std;int main()
{int a = 0;double b = 0;cin >> a >> b;// >>流提取运算法,相当于scanfcout << a << " " << b << endl;// << 流插入运算法 endl相当于换行cout << a << ":" << b << '\n';cout << "hello world" << endl;return 0;
}
(1)endl相当于换行'\n'
(2)<assert.h>在C++中也可以用,但是没有命名空间,<cassert>就有命名空间了
(3)使用 cout 标准输出对象 ( 控制台 ) 和 cin 标准输入对象 ( 键盘 ) 时,必须 包含 < iostream > 头文件 以及按命名空间使用方法使用std 。(4)C++的输入输出可以自动识别变量类型。(5)旧编译器(vc 6.0)中还支持<iostream.h>格式,<iostream.h>格式没有命名空间
4. 缺省参数
4.1 缺省参数概念
#include <iostream>
using namespace std;//缺省参数(默认参数)
void Test(int a = 0)
{cout << a << endl;
}int main()
{Test();//没有传参时,使用参数的默认值a = 0Test(1);//传参时,使用指定的实参 a = 1;
}
4.2 缺省参数分类
(1)全缺省参数(全默认参数)
void Test(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}
(2)半缺省参数
void Test(int a , int b = 20, int c = 30)//必须从右向左缺省,并且是连续的
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}
1. 半缺省参数必须 从右往左依次 来给出,不能间隔着给2. 缺省参数不能在函数声明和定义中同时出现(最好在声明给;声明不给,定义给也不可以)3. 缺省值必须是常量或者全局变量4. C 语言不支持(编译器不支持)
5. 函数重载
5.1 函数重载概念
(1)参数类型不同
int Add(int left, int right)
{return left + right;
}
double Add(double left, double right)
{return left + right;
}
(2)参数个数不同
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}
(3)参数类型顺序不同
void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}
C语言不支持同名函数,CPP支持同名函数。要求:参数名相同,参数不同
代码:
short Add(short left, short right)
{return left + right;
}
int Add(short left, short right)
{return left + right;
}
上述代码不是函数重载,因为函数进行调用的时候,并不知道要调用哪一个函数。(仅仅只有返回值不同是不能构造函数重载的)函数重载要求参数不同。而跟返回值没关系。
5.2 C++支持函数重载的原理——名字修饰(name Mingling)
C语言不支持重载,C++支持重载。C++是如何支持的?为什么C语言不支持?
在 C/C++ 中,一个程序要运行起来,需要经历以下几个阶段: 预处理(预编译)、编译、汇编、链接 。预处理:头文件展开、宏替换、条件编译、去掉注释
编译:检查语法、生成汇编代码
汇编:把汇编代码转换成二进制的机器码
链接:找调用函数的地址,链接对应上,合并到一起
(1)实际项目通常是由多个头文件和多个源文件构成,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?
(2) 所以链接阶段就是专门处理这种问题, 链接器看到 a.o 调用 Add ,但是没有 Add 的地址,就会到 b.o 的符 号表中找 Add 的地址,然后链接到一起 。
//函数1
void f(int a, double b)
{printf("%d %lf\n", a, b);
}
//函数2
void f(double b, int a)
{printf("%lf %d\n", b, a);
}
链接的时候,有符号表和函数调用指令。
C语言中,函数1和函数2,生成的符号表,都是f,所以会发生冲突,所以会发生错误,C语言就不支持函数重载
但是在C++中,函数1和函数2生成的符号表是不同的,所以C++就支持函数重载
总而言之还是函数修饰后的名字不同,C语言中仍然是函数名,而C++中是【_Z+函数长度+函数名+类型首字母(如果是指针就多加一个P)】通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
5.3 extern "C"
C语言是可以调用C++和C语言的静态库和动态库的。C++是可以调用C++和C语言的静态库和动态库的。
C++调用C静态库:(虽然C++兼容C,为什么需要用到extern "C"呢?因为函数的命名修饰是不一样的,所以想调用C的函数的时候,符号表找不到我们想要的内容)
extern "C" {#include "../../Stack_C/Stack_C/stack.h" }
然后,右击属性->链接器->常规->附加库目录->找到静态库文件,最后右击属性->链接器->输入->附加依赖项Stack_C.lib;即可
C语言调用C++:(C中没有extern "C",只有C++有)
在C++的文件中,函数前面添加EXTERN_C(这个是随意定义的),然后前面再写一个条件编译(__cplusplus是C++中)[两个杠]
【(第一种写法)条件编译:当在C++中,函数前面经过宏替换就是extern "C",在C语言中,就相当于什么也没有】
(第二种写法)
然后,右击属性->链接器->常规->附加库目录->找到静态库文件,最后右击属性->链接器->输入->附加依赖项Stack_CPP.lib;即可
相关文章:

【C++初阶】C++基础(上)——C++关键字、命名空间、C++输入输出、缺省参数、函数重载
目录 1. C关键字 2. 命名空间 2.1 命名空间的定义 2.2 命名空间的使用 3. C输入&输出 4. 缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 5. 函数重载 5.1 函数重载概念 5.2 C支持函数重载的原理——名字修饰(name Mingling) 5.3 extern &…...

代码随想录训练营Day55动态规划part15|392.判断子序列|115.不同的子序列
392.判断子序列 编辑距离问题目前能够很简单的做出来,注意两个细节 s为空,直接输出true在break时,j不会再,因此在break前要手动 Carl用了二维数组,dp[i][j] 由dp[i-1][j-1]1dp[i][j-1]递推 115.不同的子序列 dp[i][…...

Linux下安装RabbitMQ教程
官方安装指南:https://www.rabbitmq.com/install-rpm.html 我们将要安装的RabbitMQ的版本是3.8.2 el/7/rabbitmq-server-3.8.2-1.el7.noarch.rpm - rabbitmq/rabbitmq-server packagecloud 不需要单独安装Erlang环境。 2. 环境配置: 前提ÿ…...

如何加强Mysql安全,请给出可行的具体措施
如何加强Mysql安全,请给出可行的具体措施 数据库对于公司而言是一个非常重要的资产。它在数据存储和管理、业务应用支持、决策和分析、数据安全和合规性、业务连续性以及客户关系管理等方面都发挥着关键作用。因此,公司应该高度重视数据库的建设、管理和…...

创造自己的宠物医院预约服务小程序,步骤详解
在现代社会,越来越多的人开始养宠物,而宠物的健康管理也成为了一个重要的话题。为了方便宠物主人随时随地进行宠物医院的管理和服务,开发一个宠物医院管理小程序是很有必要的。今天我们将分享一些制作宠物医院管理小程序的技巧,帮…...

MACOM EDI 需求分析
MACOM 是一家全球性半导体公司,专注于设计和制造高性能射频、微波和光电元件,其产品被广泛应用于通信、航空航天、国防、工业和医疗等领域。随着 MACOM 的不断发展,传统数据传输方式效率较低,无法满足 MACOM 的需求。为了提高企业…...

使用Spring Boot AOP实现日志记录
目录 介绍 1.1 什么是AOP 1.2 AOP体系与概念 AOP简单实现 2.1 新建一个SpringBoot项目,无需选择依赖 2.2 设置好本地Maven配置后,在pom.xml文件里添加添加maven依赖 2.3 创建一个业务类接口 2.4 在实体类实现接口业务 2.5 在单元测试运行结果 …...

图像中不规则物体的长轴与短轴:OpenCV实现指南
1.首先,读取图像并将其转换为灰度图像。 2.进行图像预处理,包括使用高斯模糊和阈值化,以便更好地处理图像。 3.通过使用OpenCV的cv2.findContours()函数,找到图像中的所有轮廓。 4.遍历所有轮廓,如果轮廓点的数量大…...

C/C++开发,opencv与qt结合播放视频
目录 一、qt_ui创建 1.1 ui设置 1.2 ui及代码输出保存 二、创建工程 2.1 工程目录及编译设置 2.2 源码设计 三、编译及测试 3.1 程序编译 3.2 程序运行 首先声明,这是一个OpenCV 3学习文档的案例,但是说明有些过于省略,只有一些简短的代码…...

磁共振图像处理中 fft1c 和 ifft1c 函数的 Python 实现
fft1c 和 ifft1c 是 MRI 图像处理的常用函数。通常使用如下的 Matlab 实现 (Michael Lustig,2005) function res ifft1c(x,dim)% res fft1c(x) % % orthonormal forward 1D FFT %nsize(x,dim); shftzeros(1,5); shft(dim)ceil(n/2);xcirc…...

阿里云国际站香港地域服务器访问延迟丢包的原因及解决方法
阿里云百科有2台香港地域的轻量应用服务器,国内使用发现Ping值延迟丢包严重,从大陆到香港访问是经过国际链路和运营商国际路由节点,会受到到国际链路拥塞,以及运营商出境路由限制,导致无法正常连接或访问某些网站&…...

GULI PART.1
文章目录 1、尚硅谷-谷粒学院1.1、系统功能模块介绍1.2、系统开发方式 2、Mybatis-Plus2.1、什么是 MyBatis?2.2、什么是Mybatis-Plus?2.3、Mybatis-plus 的特性2.4、支持的数据库 3、Mybatis-Plus入门3.1、创建表和数据3.2、创建SpringBoot工程3.3、安装…...

NetApp FAS2750 和 FAS2820:适用于分布式企业和从远程到核心的 FAS
NetApp FAS2750 和 FAS2820:适用于分布式企业和从远程到核心的 FAS 拥有分布式企业和多个办公位置的客户希望使用这些系统进行虚拟化,以及为大型 FAS 和 AFF 系统提供简单且经济高效的备份和灾难恢复。 为什么要从 NetApp FAS 系列中选择一个型号&…...

剑指YOLOv8改进最新MPDIoU损失函数:超越现有多种G/D/C/EIoU,23年7月首发论文,高效准确的边界框回归的损失
💡本篇内容:剑指YOLOv8改进最新MPDIoU损失函数:超越现有多种G/D/C/EIoU,23年7月首发论文,高效准确的边界框回归的损失 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 💡:重点:该专栏《剑指YOLOv8原创改进》只更新改进 YOLO…...

SQL-每日一题【1070. 产品销售分析 III】
题目 销售表 Sales: 产品表 Product: 编写一个 SQL 查询,选出每个销售产品 第一年 销售的 产品 id、年份、数量 和 价格。 结果表中的条目可以按 任意顺序 排列。 查询结果格式如下例所示: 示例 1: 解题思路 前置知…...

为何押注AI大模型的微软云,业绩增速反而不如谷歌云?
科技云报道原创。 上周微软、谷歌、Meta等国外科技公司相继发布最新财报。作为与人工智能、云计算和数字广告等领域相关的巨头,它们的一举一动都将对市场产生影响,同时也吸引着众多从业者的关注。 在国外三大云巨头中,谷歌云的市场份额长期…...

CDN加速服务的工作原理
CDN(内容分发网络)加速服务是一种用于提高网站和应用性能的技术,通过将内容分发到全球多个节点,使用户可以从就近的节点获取所需内容,从而实现更快的加载速度和更稳定的访问体验。下面详细介绍CDN加速服务的工作原理&a…...

在CSDN学Golang云原生(Kubernetes Service)
一,service的定义与基本用法 在 Kubernetes 中,Service 是一种抽象概念,用于定义一组 Pod 并为它们提供访问入口。通过 Service,您可以将多个 Pod 组合成一个逻辑单元,并使用标签选择器来确定哪些 Pod 属于该 Service…...

【数据结构篇C++实现】- 图
友情链接:C/C系列系统学习目录 文章目录 🚀一、图的基本概念和术语1、有向图和无向图3、基本图和多重图4、完全图5、子图6、连通、连通图和连通分量7、强连通图、强连通分量8、生成树、生成森林9、顶点的度、入度和出度10、边的权和网11、稠密图、稀疏图…...

Sentinel持久化规则
项目中有用到Sentinel,然后需要将Sentinel上配置的规则做持久化(或者初始化),通过改写Sentinel源码实现了需求,下面记录一下实现过程。 如果不知道Sentinel怎么搭,可以看看: 流控平台Sentinel搭建和接入教程_东皋长歌的博客-CSDN博客 一,背景 Sentinel是Alibaba开源…...

list与sort()
运行代码: //list与sort() #include"std_lib_facilities.h" //声明Item类 struct Item {string name;int iid;double value;Item():name(" "),iid(0),value(0.0){}Item(string ss,int ii,double vv):name(ss),iid(ii),value(vv){}friend istre…...

6个月、21天,GoldenDB分布式数据库核心系统落地中移动
近日,2023“鼎新杯”数字化转型应用大赛入围名单公示,山东移动基于GoldenDB分布式数据库的CRM&BOSS核心系统自主创新实践成功入选。该项目是中兴通讯与中国移动在数据库关键领域的又一个合作范例。 核心系统业务量大,分布式转型迫在眉睫 …...

如何正确培养数据思维?
在大数据时代,数据思维已成了每个人的必备品。下面,我们就来了解一下,什么是数据思维。不过要想弄懂什么是数据思维,首先来打破大家对数据的错误认知,数据不仅仅指数字。 1. 数据思维是什么? 百度百科对数…...

JavaScript中的?.和??的用法
1、?.(可选链运算符) 在JavaScript中,"?.“是一种叫做"Optional Chaining”(可选链)的新操作符。它允许我们在访问一个可能为null或undefined的属性或调用一个可能不存在的方法时,避免出现错误…...

Git for linux
<1> linux 安装git sudo apt-get install git-all <2> 创建git,分为两部分,远程网络部分和本地主机部分 远程网路:登录GitHub: Let’s build from here GitHub 注册帐号,创建登录密码,此密码很长&a…...

uniapp小程序,根据小程序的环境版本,控制的显页面功能按钮的示隐藏
需求:根据小程序环境控制控制页面某个功能按钮的显示隐藏; 下面是官方文档和功能实现的相关代码: 实现上面需要,用到了uni.getAccountInfoSync(): uni.getAccountInfoSync() 是一个 Uniapp 提供的同步方法,…...

kotlin 编写一个简单的天气预报app(二)增加搜索城市功能
增加界面显示openweathermap返回的信息。 在activity_main.xml里增加输入框来输入城市,在输入款旁边增加搜索按钮来进行查询。 然后原来显示helloworld的TextView用来显示结果。 1. 增加输入城市名字的EditText <EditTextandroid:id"id/editTextCity"…...

【分布鲁棒、状态估计】分布式鲁棒优化电力系统状态估计研究[几种算法进行比较](Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

vue中的require
vue中的require 一、基本概念二、具体演示1.引入json2.引入图片 三、require.context引入图片:引入json引入模块js:引入vue文件: 一、基本概念 require 是 node 中的一个方法,他的作用是 用于引入模块、 JSON、或本地静态文件。r…...

Linux进程间共享内存通信时如何同步?(附源码)
今天我们来讲讲进程间使用共享内存通信时为了确保数据的正确,如何进行同步? 在Linux中,进程间的共享内存通信需要通过同步机制来保证数据的正确性和一致性,常用的同步机制包括信号量、互斥锁、条件变量等。 其中,使用信号量来同…...