【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.rhkb.cn/news/126805.html

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

相关文章

【C#项目实战】控制台游戏勇士斗恶龙(1)——游戏初始设置以及开始界面

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;最近开始正式的步入学习游戏开发的正轨&#xff0c;想要通过写博客的方式来分享自己学到的知识和经验&#xff0c;这就是开设本专栏的目的。希望…

jenkins 发布job切换不同的jdk版本/ maven版本

1. 技术要求 因为有个新的项目需要使用jdk17 而旧的项目需要jdk1.8 这就需要jenkins在发布项目的时候可以指定jdk版本 2. 解决 jenkins全局工具配置页面 配置新的jdk 路径 系统管理-> 全局工具配置 如上新增个jdk 名称叫 jdk-17 然后配置jdk-17的根路径即可&#xff08;这…

抓安卓日志命令

临时生成logcat文件 ctrl z 是停止 adb logcat -> /home/log/log.txt 导出全部日志 adb root adb remount 只抓安卓日志 logcat &#xff08;所有保存的日志&#xff0c;中途关机和开机都有&#xff09; adb pull log/android D:\73log\1android 抓全部日志&#x…

八大排序——快速排序

Hello&#xff0c;大家好&#xff0c;今天分享的八大排序里的快速排序&#xff0c;所谓快速排序是一个叫霍尔的人发明&#xff0c;有很多人可能会觉得为什么不叫霍尔排序&#xff0c;其中原因就是因为它快&#xff0c;快速则体现了它的特点&#xff0c;今天我们就来讲一下快速排…

YOLOV7改进-具有隐式知识学习的Efficient解耦头

[解耦头][https://github.com/z1069614715/objectdetection_script/blob/master/yolo-improve/yolov7-DecoupledHead.py] 1、复制这些到yolo.py 2、到这 3、复制下半部分到yolo.py 4、替换这里 5、最后的加到上面的这里 6、添加 7、添加 8、V5大概一个点的提升 9、解…

OpenLdap +PhpLdapAdmin + Grafana docker-compose部署安装

目录 一、OpenLdap介绍 二、PhpLdapAdmin介绍 三、使用docker-compose进行安装 1. docker-compose.yml 2. grafana配置文件 3. provisioning 四、安装openldap、phpldapadmin、grafana 五、配置OpenLDAP 1. 登陆PhpLdapAdmin web管理 2. 需要注意的细节 内容介绍参考…

【GO语言基础】控制流

系列文章目录 【Go语言学习】ide安装与配置 【GO语言基础】前言 【GO语言基础】变量常量 【GO语言基础】数据类型 【GO语言基础】控制流 文章目录 系列文章目录条件语句if-else 结构判断一个字符串是否为空&#xff1a;switch结构 循环结构for 循环&#xff08;C风格&#xff…

ref 操作 React 定时器

秒表 需要将 interval ID 保存在 ref 中&#xff0c;以便在需要时能够清除计时器。 import { useRef, useState } from "react";const SecondWatch () > {const [startTime, setStartTime] useState<any>(null);const [now, setNow] useState<any>…

Vue+elementUI 导出word打印

import JSZipUtils from "jszip-utils"; import JSZip from "pizzip"; import Docxtemplater from "docxtemplater"; npm安装以上依赖 首先维护个word模板 导出方法 //导出wordskipOutWord(row) {var printData rowconst data JSON.parse(JS…

FFmpeg报错:Connection to tcp://XXX?timeout=XXX failed: Connection timed out

一、现象 通过FFmpeg&#xff08;FFmpeg的版本是5.0.3&#xff09;拉摄像机的rtsp流获取音视频数据&#xff0c;执行命令&#xff1a; ./ffmpeg -timeout 3000000 -i "rtsp://172.16.17.156/stream/video5" 报错&#xff1a;Connection to tcp://XXX?timeoutXXX …

PaddleOCR学习笔记1-初步尝试

尝试使用PaddleOCR方法&#xff0c;如何使用自定义的模型方法&#xff0c;参数怎么配置&#xff0c;图片识别尝试简单提高识别率方法。 目前仅仅只是初步学习下如何使用PaddleOCR的方法。 一&#xff0c;测试识别图片&#xff1a; 1.png : 正确文本内容为“哲学可以帮助辩别现…

【关于Java:认识异常】

文章目录 一、1. 异常概念与体系结构1.1 异常的概念1.2 常见的异常1.算数异常2.数组越界异常3.空指针异常 1.3 异常的体系结构1.4 异常的分类1. 编译时异常2. 运行时异常&#xff08;RuntimeException&#xff09; 二、 异常的处理方式2.1 防御式编程2.2 EAFP:&#xff08;异常…

【分类】分类性能评价

评价指标 1、准确率、召回率、精确率、F-度量、ROC ​ 属于各类的样本的并不是均一分布&#xff0c;甚至其出现概率相差很多个数量级&#xff0c;这种分类问题称为不平衡类问题。在不平衡类问题中&#xff0c;准确率并没有多大意义&#xff0c;我们需要一些别的指标。 ​ 通…

pyspark 系统找不到指定的路径; \Java\jdk1.8.0_172\bin\java

使用用具PyCharm 2023.2.1 1&#xff1a;pyspark 系统找不到指定的路径&#xff0c; Java not found and JAVA_HOME environment variable is not set. Install Java and set JAVA_HOME to point to the Java installation directory. 解决方法&#xff1a;配置正确环境变量…

万字C语言之分支语句和循环语句

前言&#xff1a; &#x1f4d5;作者简介&#xff1a;热爱编程的小七&#xff0c;致力于C、Java、Python等多编程语言&#xff0c;热爱编程和长板的运动少年&#xff01; &#x1f4d8;相关专栏Java基础语法&#xff0c;JavaEE初阶&#xff0c;数据库&#xff0c;数据结构和算法…

react-native实现 TextInput 键盘显示搜索按钮并触发回调

<TextInput returnKeyType"search"returnKeyLabel"搜索"onSubmitEditing{e > {toSearch(keyword);}} /><SearchBarref{serachBarEl}placeholder"请输入"onChangeText{handleChangeSearch}value{search}onSubmitEditing{handleSearch…

react16之前diff算法的理解和总结

此篇文章所讨论的是 React 16 以前的 Diff 算法。而 React 16 启用了全新的架构 Fiber&#xff0c;相应的 Diff 算法也有所改变&#xff0c;本片不详细讨论Fiber。 fiber架构是为了支持react进行可中断渲染&#xff0c;降低卡顿&#xff0c;提升流畅度。 react16之前的版本&…

131.【MySQL_基础篇】

MySQL_基础篇 (一)、MySQL 介绍1.MySQL三大阶段(1).基础篇(2).进阶篇(3).运维篇 2.MySQL 概念3.数据模型(1).关系型数据库(RDBMS) 4.数据库三大范式 (二)、SQL 编程语言1.SQL通用语法2.SQL 四大分类3.DDL (数据定义语言)(1).数据库操作 ->(增删改查)(2).表操作 -> (增删改…

IDEA2023隐藏.idea和.iml文件

IDEA2023隐藏.idea和.iml文件 1. 打开file -> setting,快捷键CtrlAlts2. Editor -> File types3. 点击右侧Ignore files and folders一栏4. 添加需要忽略的文件5. 最重要一步 IDEA新建项目会自动生成一个.idea文件夹和.iml文件&#xff0c;开发中不需要对这两个文件修改&…

LeetCode 92. Reverse Linked List II【链表,头插法】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…