C++入门小清单

在上一篇文章中我向大家介绍了关于C++的命名空间的用处以及一些,这篇内容主要是讲解有关C++入门的一些小知识,大家可以通过此文章初步进行一个了解,这些东西在之后的C++学习中都会有更多的妙用,如果有小伙伴感兴趣C++的命名空间,可以点击链接🔗C++的命名空间

一、缺省参数

缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参

则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把

缺省参数也叫默认参数)

//全缺省参数
void Func1(int a = 1, int b = 2)
{std::cout << a << " " << b << std::endl;
}
//半缺省参数
//半缺省参数必须从右往左写
void Func2(int a, int b = 2)
{std::cout << a << " " << b << std::endl;
}int main()
{Func1();Func1(2);Func1(2,3);Func2(1);Func2(1,3);return 0;
}

 大家可以对照一下结果,如果我没有调用时没有输入参数,就会直接输出函数定义时默认的数值,但要注意的时半缺省参数必须从右往左写,要不然编译器没有办法把数值进行匹配 。  比如下面这种写法,调用中的3如果是匹配的a的话,b就没有数值对应了。

void Func3(int a = 1, int b)
{std::cout<< a << "  " << b << std::endl;
}int main()
{Func3(3);
}

缺省参数不能声明和定义同时给出,比如下面的例子

test.hvoid Func(int a = 1);//在头文件中已经给出了缺省参数test.cvoid Func(int a = 1)//再次给出便是错误void Func(int a)//此做法则是正确的
{std::cout << a << std::endl;
}

二、函数重载

C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同名函数的。

#include<iostream>
using namespace std;void Swap(int* pa, int* pb)
{cout << "void Swap(int* pa, int* pb)" << endl;
}
//参数类型不同
void Swap(double* pa, double* pb)
{ cout << "void Swap(double* pa, double* pb)" << endl;
}
//参数个数不同
void Swap(int* pa, int* pb, double* pc)
{cout << "void Swap(int* pa, int* pb, double* pc)" << endl;
}
//参数顺序不同
void Swap(int* pa, double* pc,int* pb)
{cout << "void Swap(int* pa, double* pc, int* pb)" << endl;
}int main()
{int a = 10;int b = 20;double c = 30.0, d = 40.0;Swap(&a, &b);Swap(&c, &d);Swap(&a, &b, &c);//调用歧义return 0; 
}

 

值得注意的点是:

  1. 返回值不同不能构成重建,因为在调用的时候无法区分
  2. 函数重载中同名函数的形参列表(参数个数或参数类型或参数顺序)必须不同                 

为什么C语言不支持函数重载呢 ?

在编译过程中,C++编译器会进行以下几个步骤:

  1. 预处理:展开头文件、宏定义、条件编译等。生成预处理后的文件,例如 define.i 和 test.i。
  2. 编译:检查语法,生成汇编代码。例如,生成 define.s 和 test.s。
  3. 汇编:将汇编代码转换成机器码,生成目标文件。例如,生成 define.o 和 test.o。
  4. 链接:将多个目标文件链接成一个可执行文件。在链接时,编译器会根据修饰后的函数名来查找函数的地址。

在C++中,函数声明和定义的过程如下:

  • test.cpp 中只有函数声明,没有函数的地址。
  • 函数的定义在 define.cpp 中,经过汇编后生成目标文件 define.o,其中包含了函数的地址。

但是C语言是通过函数名来查找的,如果遇到同名却参数不同的函数,自然是很难定位到的,而C++则是根据修饰后的函数名来查找,这个修饰方法取决于编译器(有一些会带着参数一起查找)

三、引用

引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间,它和它引⽤的变量共⽤同⼀块内存空间。例如你会网上“某些印度小哥”取名为“三哥”。

int main()
{int a = 0;//引用:b是a的别名int& b = a;int& c = a;int& d = b;//一个符号两用,地址是一致的cout << &a << endl;cout << &b << endl;cout << &c << endl;cout << &d << endl;return 0;
}

 很明显可以看出来他们的地址都是一致的,所以在取别名并没有为他们额外开辟空间,同时在C++中“&”不仅表示引用,也可以表示取地址

引用也有一些要注意的点:

  1.  引用在定义的时候必须初始化
  2. 一个变量可以有多个引用
  3. 引用一旦引用一个实体,再不能引用其他实体

那么引用有什么用呢?再学习数据结构的时候很多小伙伴可能对指针的传参都是云里雾里的,引用传参则可以在一定环境上代替它!比如下面这个很常见的例子

void Swap (int a , int b)
{int temp = a;a = b;b = temp;
}int main()
{int x = 0, y = 1;cout << x << " " << y << endl;Swap(x , y);cout << x << " " << y << endl;return 0;
}

 

可以看到这里是并没有交换成功的, 因为函数里的交换是没有被传回来了,形参只是实参的一份临时拷贝,以往我们都是通过指针来解决这个问题,很多朋友都搞不太清,现在我们可以用引用来解决,比如下面这种写法

void Swap(int &a, int &b)
{int temp = a;a = b;b = temp;
}
int main()
{int x = 0, y = 1;cout << x << " " << y << endl;Swap(x, y);cout << x << " " << y << endl;return 0;
}

 看这种就可以交换成功啦!引用还有一个要注意的点就是这个权限的问题,int的权限是可读可写,const是只读,所以int类型 就不能作为const类型的别名,这是权限放大。

int main()
{const int m = 10;int &n = m;//不可以,不能权限放大const int& n = m;//可以,权限相同int x = 0;const int& z = x;//可以,权限缩小const int* p1 = &m;p1++;//可以++,const在*前面修饰的是*p1,在*后面修饰的是p1int* p2 = p1;//不可以,const int*不能赋值给int*,权限放大return 0;
}

还有一个权限的放大,是大家会忽视的,也就是算式运算结果存储、类型转换中产生的权限放大。

 将 double 类型的 d 隐式转换为 int 类型,并赋值给 i。在这个过程中,d 的值会被截断为整数部分,即 12。隐式类型转换会产生一个临时变量,运算结果存储在这个临时变量中。因为 d 是 double 类型,编译器会创建一个临时的 int 类型变量来存储 d 的值(即 12),然后 r 引用这个临时变量。由于临时变量具有常量属性,所以引用必须是 const 类型。(常量属性也就是不能被修改,和const中的只读是一致的)!

int main()
{    double d = 12.34;//隐式类型转换//类型转换会产生临时变量,运算结果也是存储在临时变量中int i = d;int& r = d;//不可以,此时属于权限放大const int& r = d;//如果不加const不可以,因为临时变量有常量属性;return 0;}

3.1、引用和指针的区别

刚刚我们有说到,引用在一定环境条件下是可以替代指针的,可以更好的理解

  1. 引用必须初始化,指针不需要初始化
  2. 引用初始化后不可以改变,指针可以改变指向
  3. 引用没有const,指针有const
  4. 引用没有NULL,指针有NULL
  5. 引用在编译时会被替换为常量指针
  6. 语法层面上引用不开空间,指针开空间
  7. sizeof的含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数
int main()
{int a = 10;double b[] = { 1.2,2.3,3.4,4.5 };int& x = a;//引用的本质是指针,r是a的别名double* p = b;//指针p指向b的地址int* ptr = NULL;int& r = *ptr;//这里并没有对指针进行解引用//cout << r << endl;//会报错的原因是在打印的时候会对指针进行解引用,但引用不能为NULLcout << sizeof(x) << endl;cout << sizeof(int&) << endl;cout << sizeof(p) << endl;
}

大家可以对照一下别名和指针的内存大小区别,以及上面所说的我们单纯只是将指针赋值给别名r的时候是不会报错的,因为这个时候没有对指针解引用,他只是给这个空指针换了个名字,但是当我们要输出的时候,就会对指针进行解引用了,引用是没有NULL的!

四、内联函数

我们在项目开发的时候可能会有一些函数会进行频繁调用,比如我们在进行排序算法的时候我们经常就会用到swap函数,但在这种时候我们就会建立很多函数栈帧从而造成性能的损失,在C语言中我们通常是通过宏来解决这个问题,但是宏的使用其实并不简单,很多初学者很容易踩坑。在C++中我们就利用内联函数来替代C语言中的宏。

inline void Swap(int& a, int& b)
{int temp = a;a = b;b = temp;
}int main()
{int a = 1, b = 2;Swap(a, b);cout << a << " " << b << endl;return 0;
}

但是内联函数也有一些坏处

  1. 函数内部语句很多不会展开,内联对于编译器来说是一个建议
  2. 可能会使目标文件变大
  3. 内联不能定义和声明分离,分离会导致链接错误,因为内联被展开,没有地址

五、auto的便利用法

大家以前遍历数组是不是这样的

int main()
{int array[] = { 0,1,2,3,4,5,6 };for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i){array[i] *= 2;}for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i){cout << array[i] << " ";}cout << endl;
}

这多麻烦,今天C++给您行个方便,看下面这个是不是代码一下少写了不少,这就是C++的便利

int main()
{int array[] = { 0,1,2,3,4,5,6 };for (auto x : array)//auto自动识别变量类型{cout << x << " ";}cout << endl;return 0;
}

注意!

  • auto不能作为函数的参数
  • auto不能定义数组
  • 不能在同一行定义不同类型的变量,auto无法推断

好啦今天的文章就到这里啦,这些都只是一些C++很入门的东西,C++在很多地方对C语言进行了优化,让语言使用起来更加的舒适优化,但是C++学起来还是很有难度的,希望今天的入门小知识有帮助到你,这么个宝藏博客还不点个关注和小心心嘛?

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【kafka系列】日志存储设计 消息写入、读取

目录 日志存储设计 1. 日志存储的目录结构 2. 日志内容格式设计 3. 日志索引设计 4. 设计优势 消息写入流程 示例 流程图 消息读取流程 示例 关键设计细节 流程图 日志存储设计 Kafka的日志存储是其高吞吐、持久化能力的核心设计&#xff0c;其结构包含目录组织、…

复杂电磁环境下无人机自主导航增强技术研究报告——地磁匹配与多源数据融合方法,附matlab代码

本文给出介绍和matlab程序&#xff0c;来实现地磁辅助惯性导航仿真验证&#xff0c;包含地磁基准图构建、飞行轨迹生成、INS误差建模、地磁匹配定位及多源数据融合等模块。通过对比分析验证地磁匹配修正惯性导航累积误差的有效性&#xff0c;可视化显示卫星拒止环境下的航迹修正…

springboot项目读取 resources 目录下的文件的9种方式

1. 使用 ClassLoader.getResourceAsStream() 方法 InputStream inputStream getClass().getClassLoader().getResourceAsStream(“file.txt”); 2.使用 Class.getResourceAsStream() 方法 InputStream inputStream getClass().getResourceAsStream(“/file.txt”); 3.使用 Re…

基于SSM+uniapp的鲜花销售小程序+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、商户功能模块&#xff1a;用户管理、商户管理、鲜花分类管理、鲜花管理、订单管理、收藏管理、购物车、充值、下单等技术选型&#xff1a;SSM&#xff0c;Vue&#xff08;后端管理web&#xff09;&#xff0c;uniapp等测试环境&#x…

硕成C语言22【一些算法和数组的概念】

1.求水仙花数 #include <stdio.h>int main() {//求水仙花数&#xff1a;1.三位数 2.个位的立方十位的立方百位的立方该数int unit, tens, hundreds;for (int i 100; i < 1000; i)//i表示该水仙花数{unit i / 1 % 10;tens i / 10 % 10;hundreds i / 100 % 10;if (…

游戏引擎学习第101天

回顾当前情况 昨天的进度基本上完成了所有内容&#xff0c;但我们还没有进行调试。虽然我们在运行时做的事情大致上是对的&#xff0c;但还是存在一些可能或者确定的bug。正如昨天最后提到的&#xff0c;既然现在时间晚了&#xff0c;就不太适合开始调试&#xff0c;所以今天我…

无人机航迹规划:互联银行系统优化(Connected Banking System Optimizer,CBSO)求解无人机路径规划MATLAB

一、互联银行系统优化算法 互联银行系统优化&#xff08;Connected Banking System Optimizer&#xff0c;CBSO&#xff09;算法是2024年由Mehrdad Nemati等人提出的一种智能优化算法&#xff0c;其灵感来源于银行系统之间的连接和交易过程。在银行系统中&#xff0c;核心银行…

【清晰教程】通过Docker为本地DeepSeek-r1部署WebUI界面

【清晰教程】本地部署DeepSeek-r1模型-CSDN博客 目录 安装Docker 配置&检查 Open WebUI 部署Open WebUI 安装Docker 完成本地DeepSeek-r1的部署后【清晰教程】本地部署DeepSeek-r1模型-CSDN博客&#xff0c;通过Docker为本地DeepSeek-r1部署WebUI界面。 访问Docker官…

css简介

一.css-网页的美容师 css也是一种标记语言&#xff0c;主要用于设置HTML页面中的文本内容(字体大小对齐方式)&#xff0c;图片外形&#xff08;宽高 边框样式 边距等&#xff09;以及版面的布局和外观显示样式。 二.css语法规范 css规则由两个主要的部分构成:选择器以及一条…

Postman如何流畅使用DeepSeek

上次写了一篇文章是用chatBox调用api的方式使用DeepSeek&#xff0c;但是实际只能请求少数几次就不再能给回响应。这回我干脆用最原生的方法Postman调用接口请求好了。 1. 通过下载安装Postman软件 postman下载(https://pan.quark.cn/s/c8d1c7d526f3)&#xff0c;包含7.0和10…

DC-6靶机渗透测试全过程

目录 前期准备 一、渗透测试 1.IP地址查询 2.端口信息搜寻 3.网页信息搜集 wappalyzer WPScan 反弹shell graham用户 反弹出jens的shell nmap提权 二、总结 前期准备 攻击机&#xff1a; kali windows11 靶机&#xff1a;DC-6靶机&#xff08;调至NAT模式&#xff0…

以若依移动端版为基础,实现uniapp的flowable流程管理

1.前言 此代码是若依移动端版为基础&#xff0c;实现flowable流程管理&#xff0c;支持H5、APP和微信小程序三端。其中&#xff0c;APP是在安卓在雷电模拟器环境下完成的&#xff0c;其他环境未测试&#xff0c;此文章中所提及的APP均指上述环境。移动端是需要配合若依前后端分…

C++ Primer 返回值和return语句

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

dma_ddr 的编写 通过mig控制ddr3

此外还有别的模块 本模块是 其中一个 timescale 1ns/1ps module dma_ctrl (input wire ui_clk , //100MHZ 用户时钟input wire ui_rst_n ,//写fifo的写端口 input wire wf_wr_clk , //由数据产生模块的时…

【15】思科AireOS:创建使用 PSK 认证的 WLAN

1. 概述 在 Cisco AireOS 无线局域网控制器(WLC)上,您可以配置基于预共享密钥(PSK)的 WLAN,以提供无线访问。PSK 认证是一种 WPA2/WPA3 个人模式下常用的认证方式,适用于家庭或小型企业环境。 本指南将详细介绍如何在 Cisco AireOS WLC 上配置 PSK 认证的 WLAN,并确保…

基于css实现正六边形的三种方案

方案一&#xff1a;通过旋转三个长方形生成正六边形 分析&#xff1a; 如下图所示&#xff0c;我们可以通过旋转三个长方形来得到一个正六边形。疑问&#xff1a; 1. 长方形的宽高分别是多少&#xff1f; 设正六边形的边长是100&#xff0c;基于一些数学常识&#xff0c;可以…

Python用PyMC3马尔可夫链蒙特卡罗MCMC对疾病症状数据贝叶斯推断

全文链接&#xff1a;https://tecdat.cn/?p39937 本文聚焦于马尔可夫链蒙特卡罗&#xff08;MCMC&#xff09;方法在贝叶斯推断中的Python实现。通过介绍MCMC的基础原理、在贝叶斯推断中的应用步骤&#xff0c;展示了其在解决复杂分布采样问题上的强大能力。同时&#xff0c;借…

linux--关于makefile

makefile文件 可以指定编译顺序&#xff0c;这样方便一个项目的多个文件要编译的挨个操作的麻烦。 makefile文件的命名&#xff1a;makefile 或者 Makefile 必须是这俩&#xff0c;系统才能识别 规则的书写语法如下&#xff1a; 一个makefile内可以有多个规则 目标:依赖a 依…

何须付费免费它不香吗

聊一聊 又是一年开学季。 开学了发一些应时期的小软件。 今天给大家分享一款学校班级课程表工具。 这款工具可以投放在学校电子大屏上。 支持学校的白板软件。 软件介绍 学校班级课程表 工具界面清爽&#xff0c;信息能一目了然。 虽然看感觉功能简单&#xff0c;但每个…

day10后期软件

美图秀秀&#xff1a;美拍拼图、Facetune&#xff1a;面部重塑、泼辣修图&#xff1a;手机中的PS Lightroom&#xff1a;精致调色 想法类&#xff1a; 玩创意特效 PicsArt:很强大 排版类&#xff1a;精美杂志风 MOLDIV&#xff1a;无损排版&#xff1b;天天P图&#xff1a…