【C++入门】C语言的不足之处
概要
C++入门主要讲的是C语言的一些不足,C++作为补充,来补充C的不足之处
C++的关键字有63个,C语言有32个(作为了解,不需要专门记)

变量的命名规则:
- 变量名必须以字母或下划线开头。
- 变量名只能包含字母、数字和下划线。不允许使用其他特殊字符。
- 不能与关键字重名
C语言中有命名冲突的问题(与库函数,或者工程里的其他变量/函数名发生冲突),因此就引出了命名空间的概念。
ps:前面的文章有专门讲过命名空间,这里就不再重复介绍辣,可以去翻翻之前的文章
输入输出
istream 输入流
ostream 输出流
而C++中常用到的cin和cout就分别是istream和ostream的对象
cin >> 流提取运算符 输入
cout << 流插入运算符 输出
cout 可以自动识别类型(但是是基于函数重载基础上的,后面会说到函数重载)
类库提供的头文件中已经对“<<”和“>>”进行了重载,使之作为流插入运算符和流提取运算符,能用来输出和输入C++标准类型的数据。
本质是在补充C语言的不足 对全局的变量,函数,类型进行封装,防止引发冲突
也可以去库函数中查询相关资料
C++官网:en.cppreference.com/w/
C++的输入输出比scanf/ printf要慢一点点 why?
因为:C++会同步C语言,会检查C语言的错误,如果希望快一点,可以选择关闭同步C语言或者使用scanf / printf
缺省参数(默认参数)
注意:
1)传参是从左往右传参, 缺省是从右向左缺省
2)缺省参数应该在声明的时候给缺省值,定义给缺省值没有实际意义,这样在传参的时候会转化到对应参数个数
3)必须是常量或者全局变量
1】全缺省:会用缺省值来初始化

如果给了参数则用参数值来初始化
2】半缺省:从右向左缺省

函数重载
同一作用域 形参(参数个数 类型 类型的顺序)不同 只有返回值不同是不行的
无参调用存在歧义 调用0个的时候存在歧义

为什么C++支持函数重载? 答:与函数名修饰规则有关 以及 编译链接过程有关
三个文件:Stack.h Stack.c test.c
预处理 头文件展开 宏替换 去除注释 条件编译 .i 最后生成Stack.i test.i
编译 语法检查 生成对应汇编代码 .s 最后生成 Stack.s test.s
汇编 xor(逻辑异或) cpu是不认识汇编代码的,只识别二进制。需要把汇编代码转换成二进制机器码 .o目标文件 最后生成 Stack.o test.o
链接 可执行程序 .exe /a.out(不指定) 此过程中 才会去看会不会重命名(找到定义 兑现承诺) 头文件中声明代表承诺 链接的过程就是一个兑现承诺的过程

error:无法解析外部符号 链接错误
一般都是缺少定义(有声明无定义) ,声明和定义不能同时赋值(缺省值),只能在声明中给缺省值,相当于将缺省参数补全了
因此C++支持函数重载而C语言不支持的原因在于:
1、C语言同名编译阶段就会报错 因为同名函数编译器不知道找哪一个
2、C++ 编译链接 g++将函数名和参数的数据类型缩写写入
windows下名称修饰规则:

所有函数都要链接吗?
如果在当前文件就有定义的话 编译阶段直接(兑现承诺),不需要进行链接操作,
因为编译的时候给了定义,相当于直接兑现承诺,就不需要进行链接了。
引用
给已存变量取别名,与被引用的变量公用一块命名空间
给引用变量赋值相当于给被引用变量赋值

引用的价值?
一个变量可以有多个引用,但是引用一旦有一个实体就不能引用其他实体了
引用在定义的时候必须初始化
就是取别名,认为没有开辟新的空间
注意:
1.定义时就必须初始化
2.一个变量可以有多个引用
3.但是引用一旦对应一个实体,就不能改变指向了
用引用的好处在于:
1、做参数
a、做输出型参数
输出型参数是指 形参改变会影响实参 就像swap函数用引用类型做形参,会改变实参
b、减少拷贝,提高效率
2、做返回值
a、减少拷贝,提高效率
做返回值的时候,因为出作用域变量会销毁,所以会建立一个临时变量;但是当变量不销毁(在静态区)的时候,也会建立临时变量(会不会生成临时变量,看的并不是变量出了函数会不会销毁,而是返回值类型;如果是传值返回,都会进行拷贝生成临时变量,如何不生成临时变量?)可以用引用类型作为返回值不生成临时变量,可以减少拷贝,提高运行效率
如果引用作为返回值,不需要拷贝,但是如果变量销毁了,返回的结果就不能确定了
可能情况:a、函数调用结束,函数栈帧销毁,未清理函数栈帧,结果是对的
b、函数调用结束,函数栈帧销毁,清理了函数栈帧,结果是错的
所以说一定要保证出了函数,变量不会销毁(仍然存在),才可以返回引用
b、获取返回值 修改返回值

可以用引用实现SLAt()函数,同时实现SLGet()和SLModify()的功能,简化代码
引用权限
引用权限不可以放大,但是可以缩小/平移
const int a;
int& b=a;
//权限放大了,改变b a也会改变 但是a本身是不能被改变的
int a=10;
int& b=a;
//权限平移了,可以这么写
int m=10;
int& n=m;
const int& p=m;
//权限缩小了。可以这么写
//不能通过p来改变m,但是m本身是可以修改的
m++;//可以这么写
n++;
//m和n变了之后p也变了
临时变量创建场景
1】带返回值的普通函数,调用结束的时候会建立栈帧,建立临时变量
2】在发生类型转换的时候会创建临时变量相同类型不会产生临时变量)
double a=1.0;
int b=a;//a发生类型转换,(截断或提升的时候)先创建临时变量if(a>b)//比较的类型不同,会发生类型提升(一般是小的向大的提升)
{ //先生成临时变量swap(&a,&b);
}
引用与指针区别?
【1】从语法层面上看:
引用:不开空间,只是对变量取别名

指针:开空间,开辟空间存储变量地址

【2】从底层汇编指令角度来看,引用是类似于指针方式实现的

auto用法
可以自动推导变量的类型
int a=1;
auto b=1+1.11;//可以根据右边表达式,自动推导出b是double类型的cout<<typeid(b).name()<<endl;//输出变量的数据类型
以后学到迭代器之后,代码会很长,写起来比较麻烦,所以用aoto较为简便
注意:
1、auto不能做函数参数
void Test(auto a)//这种写法是错误的
{,,,
}
2、不能直接声明数组
void test()
{auto b[]={1,2,3,4};//这也是错误的
}
范围for(语法糖)
//自动推导类型,依次取出数组中元素,赋值给e,自动迭代和判断结束
int arr[10]={1,2,3,4,5,6,7,8,9,0};for(auto e:arr)
{cout<<e<<" ";
}

相关文章:
【C++入门】C语言的不足之处
概要 C入门主要讲的是C语言的一些不足,C作为补充,来补充C的不足之处 C的关键字有63个,C语言有32个(作为了解,不需要专门记) 变量的命名规则: 变量名必须以字母或下划线开头。变量名只能包含字…...
【已解决】oracle获取最近2学年的数据
已解决 :oracle获取最近2学年的数据 SELECT * FROM (SELECT * FROM xx.JWXT_XSKB WHERE AND xn IN (‘2023-2024’,‘2022-2023’)); 问题 某某系统课表数据过大,要求只获取最近2学年的数据,不能写死。 思路 mysql 在子查询的WHERE子句中…...
【图卷积神经网络】1-入门篇:为什么使用图神经网络(下)
为什么使用图神经网络? 在本书中,我们将重点介绍图学习技术中的深度学习家族,通常称为图神经网络。GNNs是一种新的深度学习架构类别,专门设计用于处理图结构化数据。与主要用于文本和图像的传统深度学习算法不同,GNNs明确地用于处理和分析图数据集(见图1.4)。 图1.4 - …...
AIGC(生成式AI)试用 2 -- 胡言乱语
小时候曾希望做个科学家,才师笑着说:努力、加油,一定会实现的。 也曾说要做个发明家,家人一笑了之:你那笨手笨脚的,想啥呢。 也曾幻想自己要成为英雄,被朋友嘲笑:连架都不敢…...
爬虫逆向实战(30)-某查查股东关联公司(HmacSHA512)
一、数据接口分析 主页地址:某查查 1、抓包 通过抓包可以发现数据接口是api/people/getRelatCompany 2、判断是否有加密参数 请求参数是否加密? 无 请求头是否加密? 通过查看“标头”可以发现,请求头中有一个key和value都是…...
多态(个人学习笔记黑马学习)
多态分为两类 静态多态: 函数重载和 运算符重载属于静态多态,复用函数名动态多态: 派生类和虚图数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早绑定 编译阶段确定函数地址动态多态的函数地址晚绑定 运行阶段确定函数地址 1、基本语法 #include &…...
线程中future/atomic/async及nlohmann json的学习
1)std::future的其他成员函数 wait_for()成员函数,wait_for返回的是一个std::future_status枚举类型,根据返回值做相应处理 std::future_status state result.wait_for(std::chrono::seconds(1)); if(state std::future_status::ready) { cout<<result.get…...
windows安装MongoDB后进入命令交互界面失败解决方案
MongoDB下载链接:https://www.mongodb.com/download-center MongoDB安装教程:https://juejin.cn/post/6844903912000978952 不要安装最新的高版本MongoDB,因为配置方法可能会有差别,比如7.0一直失败的话就换5.0及以下版本试试&am…...
基于Java+SpringBoot+Vue前后端分离高校专业实习管理系统设计和实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
E. Hanging Hearts
Problem - E - Codeforces 思路:我们考虑用树形dp,用f[i][0]表示以i为根,并且当前节点不在最长上升子序列中,用f[i][1]表示以i为根,当前节点在最长上升子序列中,那么f[i][0]max(f[j][0],f[j][1])࿰…...
docker安装RabbitMQ教程
可以通过Docker来安装RabbitMQ,具体步骤如下: 安装Docker:请参考官方文档进行安装。 拉取RabbitMQ镜像:通过以下命令拉取最新版本的RabbitMQ镜像。 docker pull rabbitmq:latest运行RabbitMQ容器:通过以下命令运行Rab…...
Java虚拟机整型数加载指令学习
JVM中 int 类型数值,根据 取值范围将 入栈的 字节码指令 就分为4类: 取值 -1~5 采用 iconst 指令; 取值 -128~127 采用 bipush 指令; 取值 -32768~32767 采用 sipush指令; 取值 -2147483648~2147483647 采用 ldc 指令。…...
Docker 实现 MySQL 一主一从配置
1、新建主服务器容器实例,端口: 3307 docker run \ -p 3307:3306 \ --name mysql-master \ -v /var/docker/mysql-master/log:/var/log/mysql \ -v /var/docker/mysql-master/data:/var/lib/mysql \ -v /var/docker/mysql-master/conf:/etc/mysql \ --p…...
Python编程练习与解答 练习113:避免重复
本练习将创建一个程序,从用户处读取单词,直到用户输入空行,在用户输入空行之后,程序应该显示一次用户输入的每个单词。单词应该按照他们最初的输入顺序显示。例如如果用户输入: first second first third second …...
线上 udp 客户端请求服务端客户端句柄泄漏问题
本题分别从如下三个方面来分享: 问题描述 自定义连接池的编写 common_pool 的使用 问题描述 线上有一个业务,某个通服务通知 udp 客户端通过向 udp 服务端(某个硬件设备)发送 udp 包来进行用户上线操作 当同时有大量的请求打到…...
合宙Air724UG LuatOS-Air LVGL API控件-窗口 (Window)
窗口 (Window) 分 享导出pdf 示例代码 win lvgl.win_create(lvgl.scr_act(), nil) lvgl.win_set_title(win, "Window title") -- close_btn lvgl.win_add_btn_right(win, "\xef\x80\x8d") -- --lvgl.obj_set_event_cb(cl…...
80 # 图片防盗链
referer 来源,表示这个资源被谁引用过,可以用来做防盗链。 我们新建文件 no-referer.js const fs require("fs"); const path require("path"); const url require("url"); const http require("http");h…...
App自动化测试持续集成效率提高50%
持续集成是一种开发实践,它倡导团队成员需要频繁的集成他们的工作,每次集成都通过自动化构建(包括编译、构建、自动化测试)来验证,从而尽快地发现集成中的错误。让正在开发的软件始终处于可工作状态,让产品…...
LeetCode —— 复写零(双指针)
题目链接 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目解析 将数组中出现的每个零复写一遍,然后将其他元素向右平移,数组长度不能改变。 法一:使用额外空间的做法 class Solution { public:void duplica…...
【Vue篇】Vue 项目下载、介绍(详细版)
如何创建一个vue项目?首先要有环境,如下: nodejs vue-cli如果有以上的工具就直接跳过安装教程 【Vue篇】mac上Vue 开发环境搭建、运行Vue项目(保姆级) 创建vue项目 选择一个位置,你要存放项目的路径&…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

