【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++关键字

C++ 总计 63 个关键字, C 语言 32 个关键字

#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);//1
	printf("%d\n", ::c);//1
	printf("%d\n", ky::c);//2
	return 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);//0
	printf("%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;// >>流提取运算法,相当于scanf
	cout << a;// << 流插入运算法

	return 0;
}

#include <iostream>
using namespace std;

int main()
{
	int a = 0;
	double b = 0;
	cin >> a >> b;// >>流提取运算法,相当于scanf
	cout << 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 = 0
	Test(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 函数重载概念

函数重载: 是函数的一种特殊情况, C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 参数类型顺序)不同 ,常用来处理实现功能类似数据类型不同的问题。
函数重载的条件:函数名相同、参数不同

(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语言中,extern "C" 可以添加在函数声明的前面,也可以extern "C"后添加一个花括号,然后把函数声明括起来
在函数前加 extern "C",作用是告诉编译器,将该函数按照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;即可

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

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

相关文章

【Nodejs】接口规范和业务分层

1.接口规范-RESTful架构 1.1 什么是REST REST全称是Representational State Transfer&#xff0c;中文意思是表述&#xff08;编者注&#xff1a;通常译为表征&#xff09;性状态转移。 它首次出现在2000年Roy Fielding的博士论文中&#xff0c;Roy Fielding是HTTP规范的主要编…

图像 检测 - FCOS: Fully Convolutional One-Stage Object Detection (ICCV 2019)

FCOS: Fully Convolutional One-Stage Object Detection - 全卷积一阶段目标检测&#xff08;ICCV 2019&#xff09; 摘要1. 引言2. 相关工作3. 我们的方法3.1 全卷积一阶目标检测器3.2 FCOS的FPN多级预测3.3 FCOS中心度 4. 实验4.1 消融研究4.1.1 FPN多级预测4.1.2 有无中心度…

HighTec 工程配置详解1

目录 HighTec 工程配置详解编译配置构建配置管理器编译属性编译步骤编译环境变量编译日志编译配置TriCore C CompilerTriCore C LinkerHighTec 工程配置详解 编译配置 构建配置管理器 管理器内,可以创建各种不同用途的配置项。例如用于生产工程的 ROM 配置,用于调试工程的…

神经网络的初始化方法

文章目录 1、随机初始化2、Xavier初始化3、He初始化4、权重预训练初始化5、零初始化 对于神经网络的训练过程中&#xff0c;合适的参数初始化方法有助于更好的处理梯度消失和梯度爆炸问题。通常有以下几种初始化方法&#xff1a; 1、随机初始化 随机初始化&#xff08;Random…

Android调用摄像头拍照从相册中选择图片

以下内容摘自郭霖《第一行代码》第三版 activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-a…

Java BIO,NIO,AIO

一丶IO模型&Java IO# Unix为程序员提供了以下5种基本的io模型&#xff1a; blocking io&#xff1a; 阻塞iononblocking io&#xff1a; 非阻塞ioI/O multiplexing&#xff1a; io多路复用signal driven I/O&#xff1a;信号驱动ioasynchronous I/O&#xff1a;异步io 但…

理解跨平台技术

1、为什么需要跨平台技术 write once&#xff0c;run everywhere 开发一个APP运行在Android手机需要一套代码&#xff0c;运行在ios操作系统的手机又需要一套代码&#xff0c;为了使同一套代码能运行在不同的操作系统上&#xff0c;解决多端独立开发的问题&#xff0c;跨平台…

综合案例(面向对象)

使用面向对象思想完成数据读取和处理基于面向对象思想重新认知第三方库使用&#xff08;PyEcharts&#xff09; 数据分析案例 某公司&#xff0c;有2份数据文件&#xff0c;现需要对其进行分析处理&#xff0c;计算每日的销售额并以柱状图表的形式进行展示。 数据内容 综合案…

分享VMware Workstation Pro ESXI7创建虚拟机和配置硬盘空间(分享自己的学习历程意在帮助有需要的小伙伴)

背景&#xff1a;因公司项目需求改用VMware Workstation Pro&#xff0c;已经使用1个月目前除了中途出现过一次问题被解决后一直稳定运行至今&#xff0c; 1:这里贴出拿出现的问题提示及解决方法的链接&#xff1a;解决vmWare ESXI 7.3报错; 2:如果你是第一次接触VMware Work…

STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL库开发)

时钟配置HSI主频配置64M 勾选打开8个通道的ADC 使能连续转换模式 添加DMA DMA模式选择循环模式 使能DMA连续请求 采样时间配置160.5 转换次数为8 配置好8次转换的顺序 配置好串口&#xff0c;选择异步模式配置好需要的开发环境并获取代码 修改main.c 串口重定向 #include &…

基于因果关系知识库的因果事件图谱构建、文本预处理、因果事件抽取、事件融合等

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

软件外包开发的流程图工具

软件开发过程中需要画流程图&#xff0c;可以更清楚的表达软件业务流程&#xff0c;减少在开发过程中的业务理解偏差&#xff0c;因此在软件开发过程中流程图工具是必不可少的软件管理工具。今天和大家分享常见的一些软件流程图工具&#xff0c;每款工具都有其自身的特色&#…

uniapp 微信小程序:页面+组件的生命周期顺序

uniapp 微信小程序&#xff1a;页面组件的生命周期顺序 首页页面父组件子组件完整顺序参考资料 这个uniapp的微信小程序项目使用的是 VUE2 首页 首页只提供了一个跳转按钮。 <template><view><navigator url"/pages/myPage/myPage?namejerry" hov…

flask中的session介绍

flask中的session介绍 在Flask中&#xff0c;session是一个用于存储特定用户会话数据的字典对象。它在不同请求之间保存数据。它通过在客户端设置一个签名的cookie&#xff0c;将所有的会话数据存储在客户端。以下是如何在Flask应用中使用session的基本步骤&#xff1a; 首先…

Linux内核中的链表、红黑树和KFIFO

lLinux内核代码中广泛使用了链表、红黑树和KFIFO。 一、 链表 linux内核代码大量使用了链表这种数据结构。链表是在解决数组不能动态扩展这个缺陷而产生的一种数据结构。链表所包含的元素可以动态创建并插入和删除。链表的每个元素都是离散存放的&#xff0c;因此不需要占用连…

kafka消息监听

1&#xff0c;spring配置kafka网址 2&#xff0c;listener Component public class OrderMsgListener {KafkaListener(topics "order",groupId "order-service")public void listen(ConsumerRecord record){System.out.println("收到消息&#xf…

IPv6 over IPv4

IPv6 over IPv4隧道简介 IPv6 over IPv4隧道可实现IPv6网络孤岛之间通过IPv4网络互连。由于IPv4地址的枯竭和IPv6的先进性&#xff0c;IPv4过渡为IPv6势在必行。因为IPv6与IPv4的不兼容性&#xff0c;所以需要对原有的IPv4设备进行替换。但是如果贸然将IPv4设备大量替换所需成…

11.python设计模式【责任链模式】

内容&#xff1a;使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。角色&#xff1a; 抽象处理者&#xff08;Handler&#xff09;具体处理…

【用户体验分析报告】 按需加载组件,导致组件渲染卡顿,影响交互体验?组件拆包预加载方案来了!

首先&#xff0c;我们看一些针对《如何提升应用首屏加载体验》的文章&#xff0c;提到的必不可少的措施&#xff0c;便是减少首屏幕加载资源的大小&#xff0c;而减少资源大小必然会想到按需加载措施。本文提到的便是一个基于webpack 插件与 react 组件实现的一套研发高度自定义…

索马里ECTN认证开船后办?都可以办的,

索马里ECTN认证开船后办&#xff1f;都可以办的&#xff0c;没有特别时间要求&#xff0c;可以在开船前办&#xff0c;也可以在开船后再办。因为索马里ECTN货物跟踪单看上去像是一份“证书”的文件&#xff0c;主要作用是用于目的港清关&#xff0c;所以很多客户习惯把它称为EC…