C++入门知识点

news2024/11/27 18:42:28

目录

命名空间

 命名空间定义

命名空间使用

 法一:加命名空间名称及作用域限定符::

 法二:使用using部分展开(授权)某个命名空间中的成员

法三:使用using对整个命名空间全部展开(授权)

C++输入&输出

std命名空间的使用惯例:

缺省参数

缺省参数分类

全缺省参数:所有的参数都有指定的缺省值

 半缺省参数:部分参数有指定缺省值

 缺省参数的作用

函数重载

​编辑 C++支持函数重载的原理

总结:C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载


命名空间

C/C++中,变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突

 命名空间定义

关键字是namespace,后面跟名字,命名空间的名字可以任意取,然后{},里面是命名空间的成员

1 命名空间中可以定义变量/函数/类型

namespace N1
{
	int rand = 10;

	int Add(int x, int y)
	{
		return x + y;
	}

	struct Node
	{
		int val;
		struct Node* next;
	};
}

2 命名空间可以嵌套

namespace N1
{
	int rand = 10;

	int Add(int x, int y)
	{
		return x + y;
	}

	struct Node
	{
		int val;
		struct Node* next;
	};
	
	namespace N2
	{
		int a = 9;
	}
}

3 同一个工程中允许存在多个相同名称的命名空间,编译器最后会将它们合并成同一个命名空间 

如一个工程中的test.h和test.cpp中的两个N1会被合并成一个 

//test.cpp中的命名空间N1
namespace N1
{
	int rand = 10;

	int Add(int x, int y)
	{
		return x + y;
	}

	struct Node
	{
		int val;
		struct Node* next;
	};
	
	int a = 9;
}

//test.h中的命名空间N1
namespace N1
{
	int b = 6;
}

 一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

命名空间使用

定义在命名空间中的成员若没有授权是无法被搜索到的,那要使用命名空间中的成员有如下三种方法

 法一:加命名空间名称作用域限定符::

namespace N1
{
	int rand = 10;

	int Add(int x, int y)
	{
		return x + y;
	}

	struct Node
	{
		int val;
		struct Node* next;
	};
	
	int a = 9;
}

int main()
{
	cout << N1::Add(1, 3) << endl;
	cout << N1::a<< endl;
	return 0;
}

 法二:使用using部分展开(授权)某个命名空间中的成员

展开常用的库对象/类型,这样就不用每次都要像法一一样了

using N1::a;
int main()
{
	cout << a<< endl;
	return 0;
}

法三:使用using对整个命名空间全部展开(授权)

using namespace N1;
int main()
{
	cout << a<< endl;
	return 0;
}

C++输入&输出


std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中

而早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应
头文件即可,后来将其实现在std命名空间下

使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
以及按命名空间使用方法使用std

endl:换行,cout、cin、endl都包含在<iostream >头文件中

<<是流插入运算符,>>是流提取运算符

#include<iostream>
using namespace std;
int main()
{
	cout << "hello world"<<endl;
    return 0;
}

C++输入输出更方便,不需要手动控制格式,它的输入输出可以自动识别变量类型

#include<iostream>
using namespace std;
int main()
{
	int a = 0;
	double b = 0;
	cin >> a >> b;
	cout << a<<endl;
	cout << b << endl;
    return 0;
}

std命名空间的使用惯例:

日常练习中,可以直接using namespace std即可,比较方便

using namespace std展开,是对std的全部展开(授权),那么标准库就全部暴露出来了,若我们定义跟库重名的类型/对象/函数,就存在冲突问题。而在日常练习中很少出现,所有可以全部展开(授权),但是项目开发中就不要全部展开了,因为代码多,很容易出现命名冲突,可以用命名空间使用的另外两种方法
 

缺省参数


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

缺省参数不能在函数声明和定义中同时出现,声明给,定义不给
因为若声明和定义同时出现缺省参数,且恰巧两个位置给定的值不同,那编译器就无法确定到底该
用那个缺省值

void func(int a = 4)
{
	cout << a << endl;
}

int main()
{
	func();
	func(9);
	return 0;
}

缺省参数分类

全缺省参数:所有的参数都有指定的缺省值

void func(int a = 4,int b = 5,int c= 6)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

int main()
{
	func();
	return 0;
}

注意:显示传参,需要从左往右传参

 

 半缺省参数:部分参数有指定缺省值

半缺省,必须从右往左给缺省值,不能间隔着给

void func(int a,int b = 5,int c= 6)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl << endl;
}

int main()
{
	func(1);
	func(1, 4);
	func(1, 4, 7);
	return 0;
}

 缺省参数的作用

比如用在开辟栈的数组空间的时候,默认开4个,如果你知道自己需要100个空间,那就可以开100个

//stack.h
namespace N1
{
	typedef struct Stack
	{
		int* a;
		int top;
		int capacity;
	}ST;

	void STInit(ST* pst,int N = 4);//声明给缺省参数,默认开4个空间
	void STPush(ST* pst,int x);
}
//stack.c
void N1::STInit(ST* pst, int N)
{
	pst->a = (int*)malloc(sizeof(int) * N);
	pst->top = 0;
	pst->capacity = 0;
}

int main()
{
	N1::ST st;
	STInit(&st,100);//传入100,那就由原来默认的开4个空间变成开100个空间
	int i = 0;
	for (i = 0; i < 100; i++)
	{
		STPush(&st, i);
	}
	return 0;
}

函数重载

简单来说,函数重载就是一个函数名有多个功能,就像一词多义

c语言不支持函数重载

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

//参数类型不同
int Add(int x, int y)
{
	cout << "int Add(int x, int y)"<<endl;
	return x + y;
}

double Add(double x, double y)
{
	cout << "double Add(double x, double y)" << endl;
	return x + y;
}

int main()
{
    Add(3,4);
    Add(3.3,4.4);
    return 0;
}

 2 参数个数不同

//参数个数不同
void func()
{
	cout << "func()" << endl;
}

void func(int a)
{
	cout << "func(int a)" << endl;
}

int main()
{
	func();
	func(3);
}

 3 参数类型顺序不同

//参数类型顺序不同
void f(int x, char y)
{
	cout << "f(int x, char y)" << endl;
}

void f(char x, int y)
{
	cout<< "f(char x, int y)" << endl;
}

int main()
{
	f(3, 4.4);
	f('A', 8);
	return 0;
}

两个函数函数名和参数是一样的,但返回值不同是不构成重载的,如以下情况

因为调用时编译器没办法区分,c++的函数名修饰规则不关返回值的事

 C++支持函数重载的原理

c语言是不支持函数重载的,那为什么c我们知道一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接

 

 

 对于c:若是认为c能够支持函数重载,那么我们就会在同一个文件内定义两个同名不同功能的函数,在编译时,会进行全局变量的符号汇总,c语言会直接用函数本身的名字,可能会稍微加一些小改变,比如有f函数,那就变成_f,下面可以看到f变成了_f

那么两个同名的函数,在编译时进行符号汇总,就会在同一个文件内搜集到相同的两个名字,比如_f和_f

在汇编形成符号表时,形成符号名+地址的映射关系

在链接时,会进行符号表的合并和重定位,那这个时候问题就来了,两个相同名字,却各自有地址,链接时到底用谁?

对于c++:c++有函数名修饰规则,即使时相同名字的函数,在编译时会根据函数形参的类型对原本的函数名进行修饰

我声明了两个函数名相同的函数f,参数不同

 

在vs中:

 我们可以看到原本函数名f变成了复杂的名字,一个函数名f变成了

另一个函数名f变成了

区分就是第一个是HD,第二个是DH,H用来代表参数的int类型,D代表参数的char类型 

vs中的修饰规则比较复杂,那我们用Linux来演示

 在Linux下g++中:g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】
 

 

函数名Add变成了_Z3Addii ,把Add的参数类型加入名字修饰中

函数名func变成了_Z4funcidiPi ,把func的参数类型加入名字修饰中

所以C++存在的函数名修饰规则,会在编译时为名字相同但功能不同的函数给出不同的名字

因为函数重载的特性就是同一作用域下同名函数,形参列表(参数个数 或 类型 或 类型顺序)不同,那就肯定修饰的名字不同

故而链接时可以区分,不会发生冲突

总结:C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修
饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载

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

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

相关文章

Windows修改mysql服务的root密码

目录 步骤1、停止mysql服务2、使用命令行启动mysql服务&#xff0c;跳过密码验证3、密码置空4、关闭命令行启动的mysql服务并正常启动5、修改root密码 参考 步骤 1、停止mysql服务 以管理员身份打开终端&#xff0c;输入指令net stop mysql停止MySQL服务&#xff0c;停止服务…

PBOOTCMS登录请求发生错误,您可按照如下方式排查: 1、试着删除根目录下runtime目录,刷新页面重试;2、检查系统会话文件存储目录是否具有写入权限;

PBOOTCMS后台登录请求发生错误&#xff0c;您可按照如下方式排查&#xff1a; 1、试着删除根目录下runtime目录&#xff0c;刷新页面重试;2、检查系统会话文件存储目录是否具有写入权限&#xff1b; 以上提示其实就是&#xff0c;表单提交校验失败&#xff0c;请刷新后重试的提…

U盘文件修复怎么做?简单3步,快速修复u盘文件!

“很离谱&#xff01;由于有些文件存在错误&#xff0c;我想将这些错误文件修复&#xff0c;但在操作过程中&#xff0c;不知为什么所有的数据都被删除了。U盘文件修复应该怎么做呀&#xff1f;是不是我的操作方法有误呢&#xff1f;” U盘使用时间长了之后&#xff0c;很可能会…

【分布鲁棒、状态估计】分布式鲁棒优化电力系统状态估计研究[几种算法进行比较](Matlab代码实现)

&#x1f4a5;1 概述 文献来源&#xff1a; 摘要&#xff1a; 能源市场的自由化、可再生能源的渗透、先进的计量能力以及对情境感知的需求&#xff0c;都要求进行系统范围的电力系统状态估计&#xff08;PSSE&#xff09;。然而&#xff0c;由于互联的复杂性、实时监测中的通信…

MySQL八股学习记录6-日志from小林coding

MySQL八股学习记录6-日志from小林coding MySQL日志分类undo logBuffer Poolredo logbinlogredo log 和undo log有什么区别主从复制是如何实现update语句执行过程为什么需要两阶段提交 MySQL日志分类 undo log:InnoDB存储引擎层生成的日志,实现事务中的原子性,主要用于事务回滚…

学习记录——SpectFormer、DilateFormer、ShadowFormer、MISSFormer

SpectFormer: Frequency and Attention is what you need in a Vision Transformer, arXiv2023 频域混合注意力SpectFormer 2023 论文&#xff1a;https://arxiv.org/abs/2304.06446 代码&#xff1a;https://badripatro.github.io/SpectFormers/ 摘要视觉变压器已经成功地应用…

No.2(4)——双指针解决柱子间最大面积

已知现在有几根柱子成有序排列&#xff0c;求出两根柱子之间围成面积的最大值。 不难想到&#xff0c;只需要将每两个柱子之间的面积计算一次并找出最大值&#xff0c;即可找到答案&#xff0c;但采用双指针法可以有效降低重复计算&#xff1a;从数组的两侧开始移动左右两个指针…

Elasticsearch SQL 详解

Elasticsearch SQL 是一个 X-Pack 组件&#xff0c;允许用户使用类似 SQL 的语法在 ES 中进行查询。用户可以在 REST、JDBC、命令行中使用 SQL 在 ES 执行数据检索和数据聚合操作。ES SQL 有以下几个特点&#xff1a; 本地集成&#xff0c;SQL 模块是 ES 自己构建的&#xff0…

数据库| 中国研究数据服务平台

数据哪里查&#xff0c;查不到&#xff0c;怎么办&#xff1f; 今天分享一个数据库|中国研究数据服务平台&#xff08;CNRDS&#xff09; 中国研究数据服务平台&#xff08;Chinese Research Data Services&#xff0c;简称CNRDS&#xff09;&#xff0c;是上海经禾信息技术有…

HCIA|详解Telnet协议

一、前言 今天翻到了之前写的Telnet协议的实验&#xff0c;由于该篇文章创作于开始写作的初期&#xff0c;文章结构简单、布局潦草&#xff0c;但实验内容是完整的&#xff0c;因此本篇文章将对Telnet技术进行详解&#xff0c;希望能够对大家提供帮助。在本文中&#xff0c;将从…

ECharts is not Loaded -- echarts里china.json与china.js有何区别

echarts官方提示他们的地图json测绘不符合中国官方标准不提供下载 如下图 china.json china.js 可以很明显的看出地图山东与辽宁部分堆到一起的情况, 接下来换成china.js vue项目&#xff0c;要引入china.js&#xff0c;直接import引入会报错&#xff1a;ECharts is not Loa…

【SCI征稿】IEEE旗下中科院1区(TOP),有关计算机的广泛领域研究

期刊简介&#xff1a; 出版社&#xff1a;IEEE 影响因子&#xff1a;IF&#xff08;2022&#xff09;10.5-11.0 期刊分区&#xff1a;JCR1区&#xff0c;中科院1区&#xff08;TOP&#xff09; 检索情况&#xff1a;SCIE&EI 双检 自引率&#xff1a;13.20% 国人占比&…

在Illustrator中创建 3D 冰淇淋模型对象

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 一旦你学会了如何在Illustrator中制作一个对象3D&#xff0c;你可以前往Envato Elements&#xff0c;在那里你可以找到大量的3D设计来激发你的灵感。这个基于订阅的市场拥有超过 2&#xff0c;000 个 Illus…

国外广告联盟和国内广告联盟的优劣势是什么

国外广告联盟和国内广告联盟在一些方面存在一些差异和优劣势。以下是对比它们的一些常见优劣势&#xff1a; 一、国外广告联盟优势&#xff1a; 1、国际资源&#xff1a;国外广告联盟拥有更广泛的国际媒体资源&#xff0c;能够帮助广告主拓展全球市场&#xff0c;进一步提高国…

Arduino安装ESP32下载失败的解决方法

Arduino安装ESP32时&#xff0c;经常下载失败 解决办法&#xff1a; 1.复制命令行中的提示信息到记事本&#xff0c;找到下载地址 2.打开浏览器&#xff0c;在地址栏中贴粘下载地址&#xff0c;回车开始下载 3.将下载的包复制到C:\Users\Administrator\AppData\Local\Arduino…

Spring Boot进阶(54):Windows 平台安装 MongoDB数据库 | 超级详细,建议收藏

1. 前言&#x1f525; Windows如何安装MongoDB数据库及使用呢&#xff1f;这将又会是干货满满的一期&#xff0c;全程无尿点不废话只抓重点教&#xff0c;具有非常好的学习效果&#xff0c;拿好小板凳准备就坐&#xff01;希望学习的过程中大家认真听好好学&#xff0c;学习的途…

vue3 电子书 pdf转图片 pdf实现翻页效果 pdfjs-dist、turn.js电子书翻页效果

实现效果&#xff1a; 一、下载插件 // 重点 pdfjs-dist 下载版本有时候 2.16.105 有效 有时候 3.4.120 有效&#xff0c;小编也没搞懂为什么npm install pdfjs-dist3.4.120 //一定要下载 3.4.120 版本的&#xff0c;不然会有报错npm install jquery // 使用的是 turn.js…

【技巧】Maven重复依赖分析查找

【技巧】Maven重复依赖分析查找 遇到奇葩的错误可以考虑是不是依赖冲突了 比如同一段代码 再这个项目中好好的 另一个项目中不能用等 idea安装插件 maven helper 打开pom文件 输入要查找的依赖 将不用的排除掉 右键排除即可

helm 部署 cert-manager 实践

文章目录 1. 介绍2. 架构3. 安装4. 测试5. 删除 1. 介绍 Cert-manager 是一个 Kubernetes 上的证书管理控制器&#xff0c;它可以自动化证书签发和更新的过程。它使用了 Kubernetes 中的 Custom Resource Definitions (CRDs) 来定义证书的请求和颁发&#xff0c;以及与之相关的…

【深度学习】:《PyTorch入门到项目实战》(十六):卷积神经网络:NiN(Network in Network)和1×1卷积(附Pytorch源码)

专栏介绍 ✨本文收录于【深度学习】&#xff1a;《PyTorch入门到项目实战》专栏&#xff0c;此专栏主要记录如何使用PyTorch实现深度学习算法及其项目实战&#xff0c;目前pytorch基础计算已经更新完&#xff0c;正在更新CNN&#xff0c;接下来会陆续更新RNN、CV、NLP、搜推广项…