【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<<" ";
}

 

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

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

相关文章

数据结构与算法-----顺序表(链表篇)

目录 前言 顺序表 链表 概念 与数组的不同 单链表 1. 创建节点 2.插入节点 尾插节点&#xff08;形成链表结构&#xff09; 向指定位置插入节点&#xff08;链表已有&#xff09; ​编辑 3.遍历链表数据 4.获取链表长度 5.删除节点 删除尾节点 删除指定节点 …

MyBatis的逆向工程

文章目录 前言MyBatis的逆向工程创建逆向工程的步骤添加依赖和插件创建MyBatis的核心配置文件创建逆向工程的配置文件执行MBG插件的generate目标 QBC查询增改 总结 前言 MyBatis的逆向工程 正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表…

微信支付-Native支付(网页二维码扫码微信支付)简单示例

目录 概述 界面展示 & 前端代码&#xff08;Vue&#xff09; 后端实现&#xff08;SpringBoot&#xff09; Maven依赖 下单接口&#xff08;主要功能代码&#xff09; 支付成功回调接口 测试&#xff08;后端线上环境&#xff09; 概述 本篇博文主要演示和说明网页扫…

腾讯云新用户有哪些优惠政策和专属活动?

腾讯云作为中国领先的云计算服务提供商&#xff0c;一直在为用户提供优质、高效且具有竞争力的服务。对于新用户&#xff0c;腾讯云更是诚意满满&#xff0c;推出了一系列优惠政策和专属活动。本文将详细介绍腾讯云新用户的优惠政策和专属活动&#xff0c;帮助大家更好地了解如…

【算法专题突破】滑动窗口 - 长度最小的子数组(9)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;209. 长度最小的子数组 - 力扣&#xff08;Leetcode&#xff09; 要注意的是&#xff0c;题目给的是正整数&#xff0c; 而题目要求并不难理解&#xff0c;就是找最短的…

Python批处理(一)提取txt中数据存入excel

Python批处理&#xff08;一&#xff09;提取txt中数据存入excel 问题描述 现从冠层分析软件中保存了叶面积指数分析的结果&#xff0c;然而软件保存格式为txt&#xff0c;且在不同的文件夹中&#xff0c;每个文件夹的txt文件数量不固定&#xff0c;但是txt文件格式固定。现需…

PPT 架构师三板斧

PPT 架构师三板斧 目录概述需求&#xff1a; 设计思路实现思路分析1.多节点上PPT 架构师三板斧2.几张框框组合有组织3.专业词汇4.切记点要点 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;ski…

Android扫码连接WIFI实现

0&#xff0c;目标 APP中实现扫WIFI分享码自动连接WIFI功能 1&#xff0c;前提条件 设备需要有个扫码器&#xff08;摄像头拍照识别也行&#xff09;&#xff0c;APP调用扫码器读取WIFI连接分享码。 2&#xff0c;增加权限 在AndroidManifest.xml中增加权限 <uses-permissi…

接入 NVIDIA A100、吞吐量提高 10 倍!Milvus GPU 版本使用指南

Milvus 2.3 正式支持 NVIDIA A100&#xff01; 作为为数不多的支持 GPU 的向量数据库产品&#xff0c;Milvus 2.3 在吞吐量和低延迟方面都带来了显著的变化&#xff0c;尤其是与此前的 CPU 版本相比&#xff0c;不仅吞吐量提高了 10 倍&#xff0c;还能将延迟控制在极低的水准。…

golang flag 包的使用指北

说起 golang 的 flag 个包&#xff0c;我们第一反应的是什么呢&#xff1f;至少我曾经第一次看到 flag 包的时候&#xff0c;第一反应是想起写 C 语言的时候咱们用于定义一个表示的&#xff0c;我们一般会命名为 flag 变量 实际上 golang 的 flag 包是用于处理命令行参数的工具…

pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1+cu118 源码编译笔记【2】验证cuda安装 成功

接上篇 pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1cu118 源码编译笔记_hkNaruto的博客-CSDN博客 由于采用/usr/local/bin/gcc编译&#xff0c;先设置LD_LIBRARY_PATH&#xff0c;再启动python3 export LD_LIBRARY_PATH/usr/local/lib64:/usr/local/lib:/usr/lib64:/usr/…

TrOCR – 基于 Transformer 的 OCR 入门指南

多年来,光学字符识别 (OCR) 出现了多项创新。它对零售、医疗保健、银行和许多其他行业的影响是巨大的。尽管有着悠久的历史和多种最先进的模型,研究人员仍在不断创新。与深度学习的许多其他领域一样,OCR 也看到了变压器神经网络的重要性和影响。如今,我们拥有像TrOCR(Tran…

图论-01-图的基本表示-邻接矩阵和邻接表-Java

文章目录 邻接矩阵邻接表邻接表的问题和改进总结 邻接矩阵 import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner;public class AdjMatrix {private int V;private int E;private int[][] adj;// 构造函数&#xff0c;从文…

App线上网络问题优化策略

在我们App开发过程中&#xff0c;网络是必不可少的&#xff0c;几乎很难想到有哪些app是不需要网络传输的&#xff0c;所以网络问题一般都是线下难以复现&#xff0c;一旦到了用户手里就会碰到很多疑难杂症&#xff0c;所以对于网络的监控是必不可少的&#xff0c;针对用户常见…

鸿蒙系列-如何使用DevEco分析app的性能

如何使用DevEco分析app的性能 性能优化、启动优化、内存优化、FPS监测、性能分析&#x1f9d0; 在鸿蒙OpenHarmony开发过程中&#xff0c;开发者开发的代码&#xff08;Stage 模型&#xff09;通常以调用 ArkUI 框架的代码为主&#xff0c;主要优化的代码部分也在其中&#x…

使用GPU虚拟化技术搭建支持3D设计的职校学生机房(云教室)

背景 学校为职业学校&#xff0c;计算机教室需要进行Maya、Adobe Illustrator、Adobe Dreamweaver、Adobe PhotoShop等软件的教学。每个教室为35用户。资源需求为4核、8G内存、80G硬盘。 基于桌面虚拟化VDI技术的机房在成本、可管理性方面&#xff0c;相对于传统胖终端的机房…

华为认证系统学习大纲及课程

前言 任何学习过程都需要一个科学合理的学习路线&#xff0c;才能够有条不紊的完成我们的学习目标。华为认证网络工程师所需学习的内容纷繁复杂&#xff0c;难度较大&#xff0c;所以今天特别为大家整理了一个全面的华为认证网络工程师学习大纲及课程&#xff0c;帮大家理清思…

更健康舒适更科技的照明体验!书客SKY护眼台灯SUKER L1上手体验

低价又好用的护眼台灯是多数人的需求&#xff0c;很多人只追求功能性护眼台灯&#xff0c;显色高、无频闪、无蓝光等基础需求。但是在较低价格中很难面面俱到&#xff0c;然而刚发布的SUKER书客L1护眼台灯却是一款不可多得的性价比护眼台灯&#xff0c;拥有高品质光源&#xff…

前端实现展开收起的效果 (react)

需求背景&#xff1a;需要实现文本的展开收起效果&#xff0c;文本是一行一行的&#xff0c;数据格式是数组结构。 如图所示&#xff08;图片已脱敏&#xff09; 简单实现&#xff1a;使用一个变量控制展开收起效果。 展开收起逻辑部分&#xff08;react&#xff09; const […

国际版腾讯云阿里云免费开户:全站加快 DCDN 重磅发布!打造新一代加快引擎

腾讯云全站加快 DCDN 重磅发布&#xff01;打造新一代加快引擎 在数字化转型革新逐渐深化的当下&#xff0c;安全高效成为企业上云、全球化布置的要害需求。 跟着运用场景复杂度不断提高、事务需求差异化开展&#xff0c;为了给企业供给更完善的安全加快服务&#xff0c;阿里云…