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

【C++入门】C语言的不足之处

概要

C++入门主要讲的是C语言的一些不足,C++作为补充,来补充C的不足之处

C++的关键字有63个,C语言有32个(作为了解,不需要专门记)

 

变量的命名规则:

  1. 变量名必须以字母或下划线开头。
  2. 变量名只能包含字母、数字和下划线。不允许使用其他特殊字符。
  3. 不能与关键字重名

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语言的一些不足&#xff0c;C作为补充&#xff0c;来补充C的不足之处 C的关键字有63个&#xff0c;C语言有32个&#xff08;作为了解&#xff0c;不需要专门记&#xff09; 变量的命名规则&#xff1a; 变量名必须以字母或下划线开头。变量名只能包含字…...

【已解决】oracle获取最近2学年的数据

已解决 &#xff1a;oracle获取最近2学年的数据 SELECT * FROM (SELECT * FROM xx.JWXT_XSKB WHERE AND xn IN (‘2023-2024’,‘2022-2023’)); 问题 某某系统课表数据过大&#xff0c;要求只获取最近2学年的数据&#xff0c;不能写死。 思路 mysql 在子查询的WHERE子句中…...

【图卷积神经网络】1-入门篇:为什么使用图神经网络(下)

为什么使用图神经网络? 在本书中,我们将重点介绍图学习技术中的深度学习家族,通常称为图神经网络。GNNs是一种新的深度学习架构类别,专门设计用于处理图结构化数据。与主要用于文本和图像的传统深度学习算法不同,GNNs明确地用于处理和分析图数据集(见图1.4)。 图1.4 - …...

AIGC(生成式AI)试用 2 -- 胡言乱语

小时候曾希望做个科学家&#xff0c;才师笑着说&#xff1a;努力、加油&#xff0c;一定会实现的。 也曾说要做个发明家&#xff0c;家人一笑了之&#xff1a;你那笨手笨脚的&#xff0c;想啥呢。 也曾幻想自己要成为英雄&#xff0c;被朋友嘲笑&#xff1a;连架都不敢…...

爬虫逆向实战(30)-某查查股东关联公司(HmacSHA512)

一、数据接口分析 主页地址&#xff1a;某查查 1、抓包 通过抓包可以发现数据接口是api/people/getRelatCompany 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无 请求头是否加密&#xff1f; 通过查看“标头”可以发现&#xff0c;请求头中有一个key和value都是…...

多态(个人学习笔记黑马学习)

多态分为两类 静态多态: 函数重载和 运算符重载属于静态多态&#xff0c;复用函数名动态多态: 派生类和虚图数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早绑定 编译阶段确定函数地址动态多态的函数地址晚绑定 运行阶段确定函数地址 1、基本语法 #include &…...

线程中future/atomic/async及nlohmann json的学习

1)std::future的其他成员函数 wait_for()成员函数&#xff0c;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下载链接&#xff1a;https://www.mongodb.com/download-center MongoDB安装教程&#xff1a;https://juejin.cn/post/6844903912000978952 不要安装最新的高版本MongoDB&#xff0c;因为配置方法可能会有差别&#xff0c;比如7.0一直失败的话就换5.0及以下版本试试&am…...

基于Java+SpringBoot+Vue前后端分离高校专业实习管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…...

E. Hanging Hearts

Problem - E - Codeforces 思路&#xff1a;我们考虑用树形dp&#xff0c;用f[i][0]表示以i为根&#xff0c;并且当前节点不在最长上升子序列中&#xff0c;用f[i][1]表示以i为根&#xff0c;当前节点在最长上升子序列中&#xff0c;那么f[i][0]max(f[j][0],f[j][1])&#xff0…...

docker安装RabbitMQ教程

可以通过Docker来安装RabbitMQ&#xff0c;具体步骤如下&#xff1a; 安装Docker&#xff1a;请参考官方文档进行安装。 拉取RabbitMQ镜像&#xff1a;通过以下命令拉取最新版本的RabbitMQ镜像。 docker pull rabbitmq:latest运行RabbitMQ容器&#xff1a;通过以下命令运行Rab…...

Java虚拟机整型数加载指令学习

JVM中 int 类型数值&#xff0c;根据 取值范围将 入栈的 字节码指令 就分为4类&#xff1a; 取值 -1~5 采用 iconst 指令&#xff1b; 取值 -128~127 采用 bipush 指令&#xff1b; 取值 -32768~32767 采用 sipush指令&#xff1b; 取值 -2147483648~2147483647 采用 ldc 指令。…...

Docker 实现 MySQL 一主一从配置

1、新建主服务器容器实例&#xff0c;端口&#xff1a; 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:避免重复

本练习将创建一个程序&#xff0c;从用户处读取单词&#xff0c;直到用户输入空行&#xff0c;在用户输入空行之后&#xff0c;程序应该显示一次用户输入的每个单词。单词应该按照他们最初的输入顺序显示。例如如果用户输入&#xff1a; first second first third second …...

线上 udp 客户端请求服务端客户端句柄泄漏问题

本题分别从如下三个方面来分享&#xff1a; 问题描述 自定义连接池的编写 common_pool 的使用 问题描述 线上有一个业务&#xff0c;某个通服务通知 udp 客户端通过向 udp 服务端&#xff08;某个硬件设备&#xff09;发送 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 来源&#xff0c;表示这个资源被谁引用过&#xff0c;可以用来做防盗链。 我们新建文件 no-referer.js const fs require("fs"); const path require("path"); const url require("url"); const http require("http");h…...

App自动化测试持续集成效率提高50%

持续集成是一种开发实践&#xff0c;它倡导团队成员需要频繁的集成他们的工作&#xff0c;每次集成都通过自动化构建&#xff08;包括编译、构建、自动化测试&#xff09;来验证&#xff0c;从而尽快地发现集成中的错误。让正在开发的软件始终处于可工作状态&#xff0c;让产品…...

LeetCode —— 复写零(双指针)

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 将数组中出现的每个零复写一遍&#xff0c;然后将其他元素向右平移&#xff0c;数组长度不能改变。 法一&#xff1a;使用额外空间的做法 class Solution { public:void duplica…...

【Vue篇】Vue 项目下载、介绍(详细版)

如何创建一个vue项目&#xff1f;首先要有环境&#xff0c;如下&#xff1a; nodejs vue-cli如果有以上的工具就直接跳过安装教程 【Vue篇】mac上Vue 开发环境搭建、运行Vue项目&#xff08;保姆级&#xff09; 创建vue项目 选择一个位置&#xff0c;你要存放项目的路径&…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理&#xff1a;检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目&#xff1a;RankRAG&#xff1a;Unifying Context Ranking…...