当前位置: 首页 > news >正文

C++入门知识点

目录

命名空间

 命名空间定义

命名空间使用

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

 法二:使用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++是通过函数修
饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载

相关文章:

C++入门知识点

目录 命名空间 命名空间定义 命名空间使用 法一&#xff1a;加命名空间名称及作用域限定符&#xff1a;&#xff1a; 法二&#xff1a;使用using部分展开&#xff08;授权&#xff09;某个命名空间中的成员 法三&#xff1a;使用using对整个命名空间全部展开&#xff08;授权…...

开眼界了,AI绘画商业化最强玩家是“淘宝商家”

图片来源&#xff1a;由无界AI生成 7月&#xff0c;2023世界人工智能大会在上海召开&#xff0c;顶尖的投资人、创业者都去了。 创业者吐槽&#xff1a;投我啊&#xff0c;我很强。 投资人反问&#xff1a;你的商业模式是什么&#xff1f;护城河是什么&#xff1f; 创业者投资人…...

机器学习与深度学习——自定义函数进行线性回归模型

机器学习与深度学习——自定义函数进行线性回归模型 目的与要求 1、通过自定义函数进行线性回归模型对boston数据集前两个维度的数据进行模型训练并画出SSE和Epoch曲线图&#xff0c;画出真实值和预测值的散点图&#xff0c;最后进行二维和三维度可视化展示数据区域。 2、通过…...

大屏项目也不难

项目环境搭建 使用create-vue初始化项目 npm init vuelatest准备utils模块 业务背景&#xff1a;大屏项目属于后台项目的一个子项目&#xff0c;用户的token是共享的 后台项目 - token - cookie 大屏项目要以同样的方式把token获取到&#xff0c;然后拼接到axios的请求头中…...

c#webclient请求中经常出现的几种异常

WebClient是.NET Framework提供的用于HTTP请求的类&#xff0c;如果在使用WebClient时遇到异常&#xff0c;我们可以根据具体的异常类型进行处理。 以下是一些常见的WebClient异常及其处理方法&#xff1a; System.Net.WebException WebException通常是由于请求超时、网络连…...

设计模式-原型模式

目录 一、传统方式 二、原型模式 三、浅拷贝和深拷贝 克隆羊问题&#xff1a; 现在有一只羊tom&#xff0c;姓名为: tom,年龄为: 1&#xff0c;颜色为: 白色&#xff0c;请编写程序创建和tom羊属性完全相同的10只羊。 一、传统方式 public class Client {public static vo…...

sentinel介绍-分布式微服务流量控制

官网地址 https://sentinelguard.io/ 介绍 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自…...

基于Redisson的Redis结合布隆过滤器使用

一、场景 缓存穿透问题 一般情况下&#xff0c;先查询Redis缓存&#xff0c;如果Redis中没有&#xff0c;再查询MySQL。当某一时刻访问redis的大量key都在redis中不存在时&#xff0c;所有查询都要访问数据库&#xff0c;造成数据库压力顿时上升&#xff0c;这就是缓存穿透。…...

BrowserRouter刷新404解决方案

1、本地开发环境 在js脚本命令里加上 --history-api-fallback "scripts": {"serve": "webpack serve --config webpack.dev.js --history-api-fallback" }2、生产环境&#xff0c;可以修改 nglnx 配置&#xff1a; server {listen XXXX; //端口号…...

解决appium-doctor报opencv4nodejs cannot be found

一、下载cmake 在CMake官网下载&#xff1a;cmake-3.6.1-win64-x64.msi 二、安装cmake cmake安装过程 在安装时要选择勾选为所有用户添加CMake环境变量 三、检查cmake安装 重新管理员打开dos系统cmd命令提示符&#xff0c;输入cmake -version cmake -version四、安装opencv4no…...

安卓通过adb pull和adb push 手机与电脑之间传输文件

1.可以参考这篇文章 https://www.cnblogs.com/hhddcpp/p/4247923.html2.根据上面的文章&#xff0c;我做了如下修改 //设置/system为可读写&#xff1a; adb remount //复制手机中的文件到电脑中。需要在电脑中新建一个文件夹&#xff0c;我新建的文件夹为ce文件夹 adb pull …...

java常用的lambda表达式总结

一、概述 lambda表达式是JDK8中的一个新特性&#xff0c;对某些匿名内部类进行简化&#xff0c;是函数式编程&#xff1b; 二、基本格式 (参数列表)->{方法体代码} 三、Stream流 是jdk8中的新特性&#xff0c;将数据以流的形式进行操作 三、常用方法解析 3.1、准备工作 …...

分布式应用之zookeeper集群+消息队列Kafka

一、zookeeper集群的相关知识 1.zookeeper的概念 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能…...

GStreamer学习笔记(四)

Time management 仅当管道处于PLAYING状态时&#xff0c;可以刷新屏幕。如果不在PLAYING状态&#xff0c;什么都不做&#xff0c;因为大多数查询都会失败。 函数与知识点 GstClockTime 说明&#xff1a;所需的超时时间必须以GstClockTime的形式指定。即以纳秒&#xff08;ns…...

DBeaver连接华为高斯数据库 DBeaver连接Gaussdb数据库 DBeaver connect Gaussdb

DBeaver连接华为高斯数据库 DBeaver连接Gaussdb数据库 DBeaver connect Gaussdb 一、概述 华为GaussDB出来已经有一段时间&#xff0c;最近工作中刚到Gauss数据库。作为coder&#xff0c;那么如何通过可视化工具来操作Gauss呢&#xff1f; 本文将记录使用免费、开源的DBeaver来…...

.net core 2.1 简单部署IIS运行

netcore的项目不像netFramework那么方便部署到iis还是要费点功夫的 比如我想把这个netcore2.1的项目部署到iis并运行&#xff1a; 按照步骤走&#xff1a; 一、确认自己的netcore环境 1、需要安装下面3个环境包(如果电脑已安装请忽略) 检查是否安装cmd命令&#xff1a;cmd&…...

提高视觉检测系统稳定性的隐藏办法——10G高速图像采集卡

提高视觉检测系统稳定性的隐藏办法——10G高速图像采集卡 目前&#xff0c;随着我国各方面配套基础设施建设的完善&#xff0c;企业技术、资金的积累&#xff0c;各行各业积极探索和大胆的尝试机器视觉技术&#xff0c;实现工业自动化、智能化。在机器视觉系统的使用过程中&am…...

注解方式实现数据库字段加密与解密

目录 前言实现步骤定义注解加密工具类定义mybatis拦截器 总结 前言 一些敏感信息存入数据需要进行加密处理&#xff0c;比如电话号码&#xff0c;身份证号码等&#xff0c;从数据库取出到前端展示时需要解密&#xff0c;如果分别在存入取出时去做处理&#xff0c;会很繁锁&…...

C\C++ 使用socket判断ip是否能连通

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan 简介&#xff1a; 使用socket判断ip是否能联通 效果&#xff1a; 代码&#xff1a; #include <iostream> #include <cstdlib> #include <cstdio> #include &…...

数学建模-相关系数

excel基本操作&#xff1a;ctrl右&#xff0c;ctrl左&#xff0c;ctrlshift下/右&#xff0c;ctrlshift空格 题目里有数据&#xff0c;给出描述性统计是比较好的习惯 excel描述性统计&#xff1a;数据-数据分析-描述统计 MATLAB要做散点图C62个 SPSS可以直接画出两两之间的散…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...