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

c++基础篇

一、命名空间:

1.1命名空间存在的意义:

1.1要知道c++是对c语言缺点的完善,而在c语言中我们是知道,定义变量、函数名或者全域名是不能相同的,否则会产生冲突,但要知道这都是大量存在的,就像一个名字也有很多重名,一个项目,每个人负责不同的模块,也避免不了名字相同(因为我不知道你也用了这个名字),在c语言中就会产生冲突,而且在全域中也可能和库函数中名字相同例如:

1.2命名空间的定义:

 1.2.1命名空间的定义要用到一个关键字就是namespace加命名空间的名字,然后接一个{ },里面就是命名空间的成员。

//这我定义一个名字为xiaoming
namespace xiaoming
{//可以定义变量也可以定义函数int rand = 10;int add(int x, int y){return x + y;}// 同时可以进行嵌套namespace hello // 嵌套在命名空间xiaoming的命名空间hello// 不同命名空间里的名字可以相同{int rand = 20;int add(int x, int y){return x + y;}}
}

1.3命名空间的使用:

1.3.1命名空间中的成员并不能直接使用,有三种形式使用方式:

<1>加命名空间名称以及作用域符号::

# include <iostream>
using namespace std;namespace xiaoming
{int a = 10;int b = 20;
}int main()
{// cout << a << 这种是错误的不能直接使用cout << xiaoming::a;cout << xiaoming::b;
}

<2>使用using将命名空间某个成员引入:

# include <iostream>
using namespace std;
using xiaoming::a;namespace xiaoming
{int a = 10;int b = 20;
}int main()
{cout << a; //这个已经被引入所以可以直接使用cout << xiaoming::b;
}

<3>使用using namespace命名空间的引入

# include <iostream>
using namespace std;
using namespace xiaoming;namespace xiaoming
{int a = 10;int b = 20;
}int main()
{cout << a;cout << b;
}

二、缺省参数:

3.1缺省参数的定义:

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


#include<iostream>
using namespace std;
int Add(int x=10,int y=20)
{return x+y;
}
int main()
{int ret1=Add();  //不穿参数,使用形参默认值cout<<ret1<<endl;int ret2=Add(1,2)  //穿参数,使用指定实参cout<<ret2<<endl;return 0;
}

3.2省参数的分类:

全缺省参数:


#include<iostream>
using namespace std;
int Add(int x=10,int y=20,int z=30)
{return x+y+z;
}
int main()
{int ret1=Add(); //可以不传参数int ret2=Add(1); //可以传一个参数int ret3=Add(1,2); //可以传两个参数int ret4=Add(1,2,3); //可以传三个参数//但不能像Add(,2,3)或者这样Add(1,,3)传参,必须是从左到右连续滴传参。cout<<ret1<<endl<<ret2<<endl<<ret3<<endl<<ret4<<endl;

半省参数:


#include<iostream>
using namespace std;
int Add(int x,int y=20,int z=30)
{return x+y+z;
}//半省参数必须从右向左依次赋值
int Add1(int x,int y,int z=30)
{return x+y+z;
}
//上面两种都是可以的
//但不能中间间隔例如:int Add(int x=10,int y,int z=30)
//或者这样也是不行的 int Add(int x=10,int y,int z)
int main()
{int ret1=Add(1,2,3);//可以int ret2=Add(1,2);//可以int ret3=Add(1);//可以// int ret4=Add(); 不可以的x需要传参
同样滴int ret5 =Add1(1,2,3);//可以int ret6=Add(1,2);//可以//  int ret7=Add(1); 不可以因为y没有传参//半缺省参数是要赋值的return 0;
}

函数重载:

函数重载的概念:

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


#include<iostream>
using namespace std;
int Add(int x,int y,int z)
{return x+y+z;
}
//参数个数不同
int Add(int x,int y)
{return x+y;
}
//参数类型不同
double  Add(double x,double y)
{return x+y;
}
//参数顺序不同
double  Add(int x,double y)
{return x+y;
}
double  Add(double y, int x)
{return x+y;
}
int main()
{int  ret =Add(1,2,3);int  ret1=Add(1,2);double   ret2=Add(1.2,2.2);double   ret3=Add(1,1.2);double   ret4=Add(1.2,1);  //函数重载的作用就是一个函数可以实行多种功能cout<<ret<<endl<<ret1<<endl<<ret2<<endl<<ret3<<endl<<ret4<<endl;return 0;
}

编译器的工作:
  如果两个函数的参数表中参数的个数或类型或顺序不同,则认为这两个函数是重载。

判断函数重载的规则

如果两个函数的参数表相同, 但是返回类型不同,会被标记为编译错误:函数的重复声明

int my_max(int a,int b)
{return a > b ? a : b;
}
unsigned int my_max(int a,int b) // error;
{return a > b ? a : b;
}
int main()
{int ix = my_max(12,23);unsigned int = my_max(12,23); // error;reutrn 0;
}

参数表的比较过程与形参名无关

// 声明同一个函数
int my_add(int a,int b);
int my_add(int x,int y);

如果在两个函数的参数表中,只有缺省实参不同,则第二个声明被视为第一个的重复声明

void Print(int *br,int n);
void Print(int *br,int len = 10);


引用:

引用的概念:

引用比较好理解啦,就是给你原有的变量去了一个别名,例如在生活中你的外号,就像叫我小马一样都是别名的意思,编译器不会给引用变量开辟新的内存,他和他引用的变量公用同一个内存空间。

#include<iostream>
using namespace std;
int main()
{int a=10;int& ra=a;printf("%p\n",&a);  //打印a的地址printf("%p\n",&ra);    //打印ra的地址 两个地址是相同的 return 0;

引用的特性:

<1>引用变量必须初始化。 就像你给一个人起小名要有对象呀

<2>一个变量可以有多个引用。  一个人可以有多个外号什么的

<3>引用一旦引用一个实体,再也不能引用其他实体。

#include<iostream>
using namespace std;
int main()
{int a=10;int&ra=a; //这是引用的初始化// int&ra; //这里没有初始化是不正确的。int& rb=a; //一个变量可以有多个引用return 0;
}

引用的应用:

引用做参数:

通过引用的概念我们可以知道引用是和他的引用变量用同一个地址,所以改变引用就是改变他所引用的变量,就像夸小马文章写的好不就是在夸我吗


#include<iostream>
using namespace std;
void swap(int& x,int& y)
{int tmp=0;tmp=x;x=y;y=tmp;
}
int main()
{int x=10;int y=20;swap(x,y);cout<<x<<' '<<y<<endl;return 0;
}

引用做返回值:

#include<iostream>
using namespace std;
int& Add(int x,int y)
{static int ret=x+y; //想想这里为什么用staticreturn ret;
}
int main()
{int ret=Add(1,2);cout<<ret<<endl;return 0;
}

在这里我们想一下为什么要用static 要是不用static的后果是什么呢? 在我们讲函数栈帧的创建和销毁的时候已经知道,局部变量是储存在栈区的,而栈区是随着函数调用结束后是会被销毁的, 但引用是和引用对象一个地址的,static是把局部变量从栈区存放到静态区,这样随着函数的调用结束后不会被销毁,因此返回的时候还能够找到,要是不用static当返回去寻找的时候是找到的就会是随机值。就好比你住个酒店,而当你退房了之后,发现你的包裹没有拿,而当你返回去的时候,你就无法确定你的包裹还在,他可能还在就是没有被收拾,但有可能你住的酒店已经被其他用户住给扔掉了,这都是有可能的,而static就是把包放在一个储存的东西的地方,你再去这个地方拿就行了

引用和指针的区别:

引用就是引用对象的一个别名,而指针是变量的地址

引用必须初始化,而地址不需要初始化。

引用在初始化一个引用对象后就不能在引用其他变量了,而指针确可以在任何时候指向同类型的地址。

用自身加一是引用对象加一,而指针加一则是地址加一。

指针有多级指针,而引用没有

内联函数:

内敛函数存在的意义:

 在c语言中调用一个函数要经过栈帧的创建和销毁,而当一个函数调用次数过多的时候就会降低程序运行的效率。这里的解决办法是什么呢?在c语言中有一个解决的方法就是宏函数。想必大家也忘了宏函数的写法了,这里我写一个宏函数的代码。


#include<iostream>
using namespace std;
#define Add(x,y)   ((x)+(y))
int main()
{int ret=Add(1,2);cout<<ret<<endl;return 0;
}

为什么宏函数解决了效率呢,要知道一个程序运行的完整运行,是有预处理,编译,汇编,链接四个过程的,而宏函数是在预处理已经完成了。但宏函数已经解决了c栈帧创建和销毁的缺点,为什c++还会创建一个内敛函数呢?要知道虽然宏函数解决了效率问题,但它本身也有自身的缺点,我们可以看出宏函数还是很容易写错的,我这个是比较简单的,要是复杂一点就是很容易就写错的,而宏函数因为在预处理就已经结束了,所以是没有办法调试的,并且他也没有类型安全的检查,因此c++就用内敛函数来解决这个问题。

内敛函数的定义:

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。


#include<iostream>
using namespace std;
inline int Add(int x,int y)
{return x+y;
}
int main()
{int ret =Add(1,2);cout<<ret<<endl;return 0;
}

内敛函数和普通函数功能相同就是在函数inline同时也具有了宏函数的一些功能就是不参与编译,在预处理就已经完成了。

内敛函数特性:

inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。

inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。

相关文章:

c++基础篇

一、命名空间&#xff1a; 1.1命名空间存在的意义&#xff1a; 1.1要知道c是对c语言缺点的完善&#xff0c;而在c语言中我们是知道&#xff0c;定义变量、函数名或者全域名是不能相同的&#xff0c;否则会产生冲突&#xff0c;但要知道这都是大量存在的&#xff0c;就像一个名…...

卫浴行业All in 智能化,国货品牌拿到了先手棋

想要了解一个行业的趋势和风向&#xff0c;展会可以说是最佳的窗口。 比如半个月前在上海举办的第28届中国国际厨房、卫浴设施展览会上&#xff0c;1500多家国内外企业同台竞技&#xff0c;给出了各自的解决方案&#xff0c;其中“智能化”已成为出镜率最高的词汇。 走在数智…...

分享10个国内可以使用的GPT中文网站

在今天的人工智能领域&#xff0c;基于对话的语言模型已成为研究的热点&#xff0c;尤其是像 ChatGPT 这样因其出色的语言理解与对话交互能力而广受关注的模型。本文将介绍10个国内可以直接使用GPT的网站&#xff0c;旨在为大家在选择和使用这些优秀的AI工具时提供有价值的参考…...

golang实现mediasoup的tcp服务及channel通道

tcp模块 定义相关类 Client&#xff1a;表示客户端连接&#xff0c;包含网络连接conn、指向服务器的指针Server和Channel指针c。server&#xff1a;表示TCP服务器&#xff0c;包含服务器地址address、TLS配置config以及三个回调函数&#xff1a; onNewClientCallback&#xf…...

Spring:IoC容器(基于注解管理bean)

1. HelloWorld * 引入依赖* 开启组件扫描* 使用注解定义 Bean* 依赖注入 2.开启组件扫描 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/20…...

如何解决Redis缓存雪崩问题?

解决Redis缓存雪崩问题&#xff0c;可以从多个方面入手来确保系统在高并发和缓存失效时能够保持稳定运行。以下是一些具体的解决策略&#xff1a; 合理设置缓存过期时间&#xff1a; 避免大量缓存设置相同的过期时间&#xff0c;这样会导致在某一时刻缓存同时失效&#xff0c;…...

vue3的组件通信v-model使用

一、组件通信 1.props 》 父向子传值 props 主要用于父组件向子组件通信。再父组件中通过使用:msgmsg绑定需要传给子组件的属性值&#xff0c;然后再在子组件中用props接收该属性值 方法一 普通方式:// 父组件 传值<child :msg1"msg1" :list"list">…...

从关键新闻和最新技术看AI行业发展(2024.5.6-5.19第二十三期) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky的公众号&…...

一文带你学会如何部署个人博客到云服务器,并进行域名备案与解析!

哈喽&#xff0c;大家好呀&#xff01;这里是码农后端。之前我给大家介绍了如何快速注册一个自己的域名&#xff0c;并创建一台自己的阿里云ECS云服务器。本篇将介绍如何将个人博客部署到云服务器&#xff0c;并进行域名备案与解析。 1、域名备案 注册了域名并购买了云服务器之…...

YoloV8实战:复现基于多任务的YoloV8方案

摘要 自动驾驶中多任务学习,特别是通过设计一种自适应、实时且轻量级的模型来同时处理目标检测、可行驶区域分割和车道线分割,是一种非常有用的研究方法,其中最出名的当属YOLOP模型。然后,YoloP在实时性上并没有得到满足,本文复现基于YoloV8的对任务方案,并在BDD100K数据…...

专题汇编 | ChatGPT引领AIGC新浪潮(一)

ChatGPT的产生与迭代 2022年11月末,美国人工智能研究实验室OpenAI推出ChatGPT。上线的ChatGPT只用了2个月,活跃用户数就突破了1亿,创造了应用增速最快的纪录。 ChatGPT是什么 ChatGPT是一种人工智能技术驱动的自然语言处理(Natural Language Processing,NLP)工具,使用的…...

Excel分类汇总,5个做法,提高数据处理效率!

在日常的工作中&#xff0c;我们经常需要使用Excel中的各种功能&#xff0c;Excel分类汇总功能无疑是数据分析和报告制作中的一把利器&#xff0c;它极大地提高了数据处理的效率和准确性。在现代商业环境中&#xff0c;数据无处不在&#xff0c;而如何从这些数据中提取有效信息…...

使用Nginx实现高可用HTTP和TCP代理:健康检查与最佳实践配置20240523

使用Nginx实现高可用HTTP和TCP代理&#xff1a;健康检查与最佳实践配置 在现代分布式系统中&#xff0c;确保应用的高可用性至关重要。Nginx作为一个高性能的HTTP服务器和反向代理&#xff0c;同时也支持TCP代理&#xff0c;通过合理配置可以大大提高系统的可用性。本文将深入…...

代码随想录算法训练营Day52 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组 | Python | 个人记录向

注&#xff1a;Day51休息。 本文目录 300.最长递增子序列做题看文章 674. 最长连续递增序列做题看文章 718. 最长重复子数组做题看文章 以往忽略的知识点小结个人体会 300.最长递增子序列 代码随想录&#xff1a;300.最长递增子序列 Leetcode&#xff1a;300.最长递增子序列 …...

Python编程的黑暗魔法:模块与包的神秘力量!

哈喽&#xff0c;我是阿佑&#xff0c;今天给大家讲讲模块与包~ 文章目录 1. 引言1.1 模块化编程的意义1.2 Python中模块与包的概念概述 2. 背景介绍2.1 Python模块系统模块的定义与作用Python标准库简介 2.2 包的结构与目的包的定义与目录结构包在项目组织中的重要性 3. 创建与…...

python编程不良习惯纠正: 慎用顶层代码

这几天在跑一个开源代码时&#xff0c;发现&#xff0c;通过pdb断点不起作用&#xff0c;经过一番检查&#xff0c;发现代码运行时甚至没有进入main函数,就开始一顿操作. 然后定位到是在执行"import"操作的时候发生了冗余操作. 经过进一步的检查发现&#xff0c;是下…...

Simulate Ring Resonator in INTERCONNECT

Simulate Ring Resonator in INTERCONNECT 正文正文 首先,我们采用 Interconnect 模块的工作流程 一文中介绍的方法添加一个直波导器件。接着,我们需要对它的名称进行更改,此时我们看左侧 Property View - Root Element 中的 General 属性,我们发现 name 属性是灰色的,无…...

Flutter 中的 DrawerController 小部件:全面指南

Flutter 中的 DrawerController 小部件&#xff1a;全面指南 Flutter 是一个流行的跨平台移动应用开发框架&#xff0c;它提供了丰富的组件和工具来帮助开发者构建高质量的应用。在Flutter中&#xff0c;DrawerController并不是一个内置的组件&#xff0c;但是它的概念可以用于…...

Flutter 中的 ImageFiltered 小部件:全面指南

Flutter 中的 ImageFiltered 小部件&#xff1a;全面指南 在Flutter中&#xff0c;ImageFiltered是一个功能强大的小部件&#xff0c;它允许你对图片应用各种图像处理效果&#xff0c;如模糊、颜色转换、对比度调整等。通过ImageFiltered&#xff0c;你可以为应用添加丰富的视…...

C++第二十弹---深入理解STL中vector的使用

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、vector的介绍 2、vector的使用 2.1、构造函数和赋值重载 2.1.1、构造函数的介绍 2.1.2、代码演示 2.2、容量操作 2.3、遍历 2.4、增删…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...