| |
|
开发:
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++ 基础语法 |
目录 ? ? 一、编译环境在虚拟机Ubuntu上使用g++,g++是Linux中C++的编译器,需要安装,g++的使用方法和gcc一样。
C和C++的关系:C是C++的基础,C++是C的扩展,C++的类型检查比C严格,C++完全兼容C 扩展的内容:
?二、头文件C++包含自定义的头文件时不再以.h作为结尾
但是C语言的标准头文件任然可用
一般C标准头文件在C++引用使用如下方式
注意,非标准头文件不支持该语法。自定义头文件和C语言一样引用。? 三、命名空间在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称都将作用于全局作用域中,可能会导致很多命名冲突。命名空间的作用是对标识符和名称进行本地化,以避免命名冲突或名字污染。? 1.命名空间的定义定义命名空间,需要使用到 namespace 关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
同一个工程中允许存在多个相同名称的命名空间,编译器最后会将其成员合成在同一个命名空间中,所以不能在相同名称的命名空间中定义两个相同名称的成员。 注意:一个命名空间就定义了一个新的作用域,命名空间中所有内容都局限于该命名空间中。 2.命名空间的访问①加命名空间名称及作用域限定符? 符号“::”在C++中叫做作用域限定符,通过“命名空间名称::命名空间成员”便可以访问到命名空间中相应的成员。? ②使用using将命名空间中的成员引入 ③使用using namespace 命名空间名称引入 匿名命名空间(不检验使用):如果一个数据不属于任何命名空间,C++编译器就会将其加入到匿名命名空间,可以使用以下语法来访问匿名命名空间中的内容
定义匿名命名空间?
命名空间的嵌套?:
四、输入与输出在C语言中有标准输入输出函数scanf和printf,而在C++中有cin标准输入和cout标准输出。在C语言中使用scanf和printf函数,需要包含头文件stdio.h。在C++中使用cin和cout,需要包含头文件iostream以及std标准命名空间。?
C++的输入输出方式与C语言相比是更加方便的,因为C++的输入输出不需要增加数据格式控制,如:整型为%d,字符型为%c。 五、内存分配在C语言堆内存的管理
C++堆内存的管理
①申请和释放一个类型大小的空间:?
②申请和释放多个同类型大小的连续空间
“()”小括号里面的值表示内存空间的初始值,“[ ]”中括号里面的值表示该类型大小的个数。 注意:new/delete和malloc/free的区别在于申请和释放对象内存时,在C++中不使用malloc/free,而使用new/delete。? 六、引用引用不是定义一个变量,而是为已存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 其使用的基本形式为:
注意:引用在定义时必须初始化,并且引用类型必须和引用实体是同种类型。?一个变量可以有多个引用。引用一旦引用了一个实体,就不能再引用其他实体,引用一旦初始化,引用的对象不能改变。
1.常引用引用类型必须和引用实体是同种类型的,但是仅仅是同种类型,还不能保证能够引用成功,如果用一个普通引用类型去引用其对应的类型,但该类型被const所修饰,那么引用将不会成功。?
可以将被const修饰的类型理解为安全的类型,因为其不能被修改。若将一个安全的类型交给一个不安全的类型(可被修改),那么将不会成功。常量的引用必须用const修饰。 2.引用的使用①引用做参数
a和b是传入实参的引用,将a和b的值交换,也就将传入的两个实参交换。普通变量作为函数的参数只能实现值的单向传递,引用作为函数参数可以实现值的双向传递。 ②引用做返回值? 引用做返回值时,返回的数据不能是函数内部创建的普通局部变量。因为在函数内部定义的普通的局部变量会随着函数调用的结束而被销毁。返回的数据必须是被static修饰或者动态开辟或者全局变量不会随着函数调用的结束而被销毁的数据。
一般函数的返回值只能作为右值,如果希望函数的返回值作为左值就可以使用引用类型。 ③指针引用 引用的地址就是原数据的地址,指针的引用就是指针的别名,通常就是用来代替二级指针。
④数组引用 数组的引用作为函数参数可以保留数组的特性,但是同时丧失了数组传参的灵活性,基本不使用。
?3.指针和引用的区别在语法概念上,引用是一个别名,没有独立的空间,其和引用实体共用同一块空间。?
?但是在底层实现上,引用实际是有空间的 从汇编角度来看,引用的底层实现也是类似指针存地址的方式来处理的。 引用和指针的区别(重要):
?七、函数重载函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,但是同名函数的形参列表必须不同。函数重载常用来处理实现功能类似,而数据类型不同的问题。? 形参列表不同:
?
重载函数的调用:调用重载函数时,根据传递的实参来选择合适的函数调用。因为C++编译函数时不但记录函数名,还会记录参数列表。函数调用时不但匹配函数名,还匹配参数列表 。 函数重载的意义:对于类似功能,在不同的数据下可以用一个函数名实现,大大简化了上层调用的复杂度。 哑元:如果一个形参只有类型,没有形参名,这种参数就叫哑元。
哑元的作用就是实现参数没有区别的函数的重载。 那么为什么C语言不支持函数重载?这是由于C++编译器和C编译器对函数的处理有区别。
在编译阶段会将程序中的每个源文件的全局范围的变量符号分别进行汇总。在汇编阶段会给每个源文件汇总出来的符号分配一个地址(若符号只是一个声明,则给其分配一个无意义的地址),然后分别生成一个符号表。最后在链接期间会将每个源文件的符号表进行合并,若不同源文件的符号表中出现了相同的符号,则取合法的地址为合并后的地址(重定位)。 在C语言中,汇编阶段进行符号汇总时,一个函数汇总后的符号就是其函数名,所以当汇总时发现多个相同的函数符号时,编译器便会报错。而C++在进行符号汇总时,对函数的名字修饰做了改动,函数汇总出的符号不仅有函数的函数名还有其参数的类型和个数以及顺序等信息汇总出 一个符号。所以就算是函数名相同的函数,只要其参数的类型或参数的个数或参数的顺序不同,那么汇总出来的符号也就不同了。 ?八、缺省参数缺省参数是指在声明或定义函数时,为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。?
?全缺省参数:即函数的全部形参都设置为缺省参数。 半缺省参数:即函数的参数不全为缺省参数。 注意: ①半缺省参数必须从右往左依次给出,有默认值的参数必须靠右,一个参数有默认值,其右边的参数必须有默认值。
?②缺省参数只能在函数声明时出现,或者函数定义时出现。 ③缺省值必须是常量或者全局变量 ④使用参数默认值时需要注意不要和函数重载相冲突
?函数参数的默认值的意义:减少传参的个数,提高函数调用的效率 方便函数的调用。 ?九、内联函数以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数的使用可以提升程序的运行效率。
下图左是以正常函数调用的汇编代码,下图右是函数加上inline后的汇编代码? 从汇编代码中可以看出,内联函数调用时并没有调用函数这个过程的汇编指令,而是直接展开。 内联函数的特性
|
|
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 13:01:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |