| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> c++中和c语言不相同的地方 -> 正文阅读 |
|
[C++知识库]c++中和c语言不相同的地方 |
? ? ? ?c++糅合了c语言的语法,并且在c语言的基础上进行了改进,并且具有向下兼容的特性; ? ? ? ? 但是c++改进了什么东西呢?今天就来学习一下吧; 命名空间 (namespace)?在使用c语言写代码的时候,我们有时候会碰到这种报错: 有时候是因为代码过长,忘记自己已经定义了这个变量,有时候兴许是某处的域没注意到; 就会出现这种状况; 而c++针对这种情况推出了一个新的语法——命名空间;?
我们看看实例:
?我们可以看到,编译器没有报错,并且成功的输出了结果; ? 而c++中我们用的最多的命名空间就是std了; 那么std又是什么命名空间呢? 这里我们就不得不提一下c++专用的输入输出语句了; cout与cin与endlc++中,更新了新的输入输出方式:cout与cin; 其使用方式是:
正如上面所写,所谓cin和cout实际上也是在一个命名空间中有的,大家可能很疑惑,cout和cin按理说应该是函数一类,为何会在命名空间中呢? 实际上命名空间中不仅可以设置变量,你还可以设定函数,结构体等一系列东西; ? 那么这两个输入输出语句有什么特别之处,能够胜过scanf和printf呢? 这就不得不聊到c++中新添加的几个运算符了 流插入符与流运算符
在c语言中提到的流只有在文件中用到过,比如 fgetc 或者 fgets 是从文件流中提取字符或者字符串; 而c++则可以利用cin和cout直接提取流用来输入或者输出,并且会自动辨别变量的类型; ?可以自动辨别!这可是一个好东西啊,以后要多用,当然也有人觉得 std:: 这个前缀很麻烦,我们可以在使用 cin 和 cout 之前写下 "using namespace std;"就可以了; 提到了using namespace std;之后,就不得不提到命名空间这个用法的缺陷了; using namespace (命名空间名)的缺陷之前提到过,命名空间的最大的好处是可以避免重命名的错误,但是当我们使用这条语句后,这个好处就没有了; 就好像原本紧闭的大门被开了一个洞,大家都能随便进出了; 因此是否使用这条语句,还得看实际场景; 当然,这个缺陷c++的创始人当然也发现了,于是他有一个好点子——局部展开;
这样大部分都能避免重定义,并且可以指展开常用的; 命名空间的嵌套和合并命名空间虽然内部的变量不能直接使用,但是其实内部变量全部都是全局变量; 只是因为namespace限定了这些变量的访问方式; 因此,命名空间又有一个骚操作——合并 ?命名空间的合并只有一个条件——空间名相同; 就像这样:
?就像这样; 而命名空间既然只是将域限定了,那么命名空间内部能不能再限定一个域呢? 答案是肯定的,这就是命名空间的第二个骚操作之——嵌套;
?实际上这个嵌套不过是在命名空间内再搞一个命名空间罢了,大家了解一下就可以了; ? 引用在c语言中,我们如果需要用函数将两个变量的值交换的时候,我们需要用到指针才能将数据成功交换; 但是指针比较难,因此c++对此进行了改进,那就是引用;
?我们可以看到,变量 a 的值确实改变了,这就是引用的作用; 有的同学就会问了,这有什么,我们指针也能改变 a 的值啊,有什么用啊?
? 既然知道了引用和指针的区别,我们就来继续了解一下引用的规则;
了解后,我们再来了解引用的一些奇奇怪怪的错误; 常引用?如图上所示,我们设了一个常变量a,并且用 ra? 引用 a,却显示错误; 这就涉及了权限的放大和缩小了; 我们这张图就是典型的权限放大;
但是如果我们反过来 ? 这样就可以了;
?当然,若是两边权限相同当然是可以的
? 做返回值当用引用返回的时候,有一个需要注意的地方,那就是那个引用的实体地址不在栈区; 又或者说,引用的实体的地址没有被销毁; ?就像这样,途中a的值已经修改成a了,但是输出依旧是0; 这是因为返回的n的空间已经被销毁了,可以随意访问,那么自然a的值就会被随机改变了; 因此我们需要给n加个修饰符; ?这样就没出错了; 引用做返回值的好处对比:
?我们发现,引用做返回值的时候,其实还是很好用的,对性能消耗是非常小的; 引用和指针的对比
别看引用和指针有这么多不同,其实引用和指针在底层设计都是类似的; ?当我们转到反汇编看汇编代码的时候,我们发现,这两个在底层逻辑是一样的; 重载函数在c语言中,不能够有相同名字的函数,但是在c++中,有一个新的概念名叫函数的重载; 可以使得我们的函数可以名字相同而不报错; 我们可以看看 ?我们可以看到确实是运行了起来,那么为什么呢? 我们知道,代码需要经过 预编译——编译——汇编——链接几个阶段才能生成可执行文件; 而c++正是在这之中动了手脚; 它在编译的时候,会根据函数名称,形参个数,形参类型以及不同环境下的名字修饰规则,生成不同的函数名,随后编译器链接的时候,就会到对应的地址使用对应的函数了; 因此就能够实现函数重载;
? ?缺省函数c++中,我们的函数可以不给值,而在函数中直接给值; 就像这样; 缺省函数又分为全缺省和半缺省; 上图就是全缺省,即所有参数都有值; 接下来就是半缺省; ? ?半缺省就是有的值有初始值,有的没有; 那么缺省函数有什么需要注意的呢? 那是当然有的;
只有注意了以上几点,才能够正确的使用缺省函数,还请注意; ? ? 内联函数在讲这个之前,请大家回忆一下,大家还记得宏函数是什么吗? 宏函数在使用的时候,编译器会直接将函数内部的代码直接替换掉宏所在位置; 没有栈帧的消耗; 而内联函数也是类似的;
接下来我们直接看看内联函数是怎么用的吧; ?那么内联函数和普通的函数有什么不同呢? 这就要去看看底层代码了; ? ?我们先看看普通函数的底层代码,发现Add前面有一个call指令,也就是调用Add函数的指令; 我们再来看看内联函数的底层代码; ? 我们发现,此处并没有call指令,而是直接利用 eax寄存器将数据放到函数内部; 这就是内联函数的作用; 内联函数的特点
之前用宏来引入内联函数,那么内联函数和宏有什么不同呢?
关键字auto在c++中还有这样一个关键字:auto; 那么auto是干什么的呢? 用于将那些类型名特别长容易写错的类型推导出来;
?那么auto怎么用呢?
这样,就声明了int类型的b变量,char类型的c变量; ?但是auto虽然好用,但是也有很多限制;
?实例
这样就是auto的使用方法了; 范围for循环c++中有一个范围的for循环,可以直接来循环遍历数组内部的所有元素; 使用方法:
? 我们可以看到,我们不仅可以访问内部的数据,也可以改变内部的数据; c++的nullptr在c++中,NULL并不是所谓的空指针; 实际上c++中的NULL是数据0; nullptr才是空指针; 这点需要注意; 总结以上就是c++和c语言不同的地方,希望大家了解。 ? |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/11 11:38:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |