C++与C的区别
各自是什么?特点?不同地方?
<1>字面上: 第一个词是一样,C++是完全兼容C,只要是合法的C的程序在C++中都是合法的!C++是C的增强版本
<2>. C++比C多了两个+,C++中扩展了很多内容,数据类型:引用、类类型、布尔类型等!关键字:friend、class、bool、public等!
<3>.编程思想是不一样的,C语言是面向过程的结构化的程序设计语言,中级语言。
C++是面向对象的编程语言,更接近自然界的发展规律!
什么是面向过程:
注重的是过程,只有过程对了,才有可能得到正确的结果;
C语言中其实也有面向对象,只不过不够彻底;
什么是面向对象:
注重的是结果
学生{静态的属性和行为整合在一起;
例子:红烧鱼: 自己做—按步骤一步一步的去实现
点外卖:不关注店家是怎么做的,我只要结果
C++应用场景:
QT:嵌入式产品的图形界面UI设计- C++实现的
人工智能:图像处理—opencv框架 C++去实现
游戏方向
C++中的不同于C的特性
命名空间
在C语言中,同一个作用域中能不能出现同名的变量?出现同名的函数?自定义同名的数据类型?
答案是不可以的!
在实际生活中,一定会出现同名的!
例如:一个班级中有同名的学生!一个校区的不同班级中也可以有同名的学生!
是什么? 作用范围
解决问题:解决命名冲突的问题!变量、函数、自定义的数据类型
什么时候用?
一个老师带A班,B班;A班有张三,B班也有张三;
老师叫张三的时候,有可能来的是A班的,也有可能来的是B班,如何区分?
叫人的时候加上归属(作用域):A的张三
怎么用:
命名空间格式:
namespace 命名空间的名字{可以有变量,也可以有函数,还可以有自定义的数据类型};
使用:
命名空间名字::变量等!
使用using namespace命名空间名字; 切换到对应的范围中,直接使用即可!
![](https://i-blog.csdnimg.cn/blog_migrate/6a893a6b74ca964cabe8e366139e38c8.png)
标准输入输出流
C语言中标准的输入输出头文件 stdio.h
库函数 Scanf、 printf在C++中是可以直接使用的!
除此之外,C++中也有提供专门用来做输入输出流!
什么是流: 以字节为单位,连续不断,方向一致的称为流!
输入流对象: cin
使用: cin>> 变量;
输出流对象: cout
使用:<< 变量;
好处: 输入输出不需要做格式的限制,使用简单
代码实现:
![](https://i-blog.csdnimg.cn/blog_migrate/473e39ae909c6691d886d50119557f6e.png)
引用类型-----引用与指针的区别(面试常问的题目)
什么是指针: 保存地址,得到地址,可以对地址中的内容做修改、访问!
应用在: 函数参数设计
引用: 可以实现和指针一样的效果。
目的:
弱化指针,能用指针实现的可以替换成引用!
减少临时空间的分配: int *p;就需要给p分配内存空间;引用是不需要分配内存空间。
什么是引用: 就是给变量起别名,变量是已经存在的,别名和变量指的是同一块内存空间!
定义的格式: 数据类型 &引用名 = 变量名;
Int p = 10;
Int &pt = p; // 这里的pt就是给p起的别名
![](https://i-blog.csdnimg.cn/blog_migrate/38772a44487aaa7ebd0419100c5e711c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d758caf7de6bf27332a67023c5bab149.png)
应用:在函数参数设计上
案例: 两数交换
![](https://i-blog.csdnimg.cn/blog_migrate/3e1f554a6792c356c9b2d28b363000e6.png)
整理一下:引用与指针的区别:
引用是给变量起别名;指针是用来保存地址;
定义指针变量系统会给分配内存空间,定义引用不会额外的分配内存空间;
指针变量定义完之后可以不进行初始化,但是一般为了避免野指针,会初始化为NULL;
引用定义完必须进行初始化
![](https://i-blog.csdnimg.cn/blog_migrate/dc6855e265500d49b13df2a606a3edd6.png)
指针变量是可以改变指向,但是引用一旦初始化之后不可以改变指向。使用引用比使用指针安全!
应用:都可以设计成函数的参数类型。
说明一个常量的方法:
使用宏定义
使用const修改引用---通常应用在函数参数设计上!
![](https://i-blog.csdnimg.cn/blog_migrate/5f4ff9aacd7d466be3a05f2a95deacbd.png)
函数重载
函数名的设计比较困难
两数求和或者交换封装函数:
Int sum(int a,int b); //只能实现两个int类型数的求和
Double sum_double(doublea, double b);
char sum_char(chara, char b);
解决问题:函数功能相似,参数不同(参数类型不同)的一组函数,解决函数名命名困难的问题!(在C语言中不能出现同名函数)
函数重载定义: 函数名相同,函数功能要相似,参数不同(参数类型不同、参数个数不同、参数类型的顺序不同),与返回值类型无关的一组函数!
![](https://i-blog.csdnimg.cn/blog_migrate/0b9a685168a1387c93c536901c4cc6ea.png)
函数调用的原理:
函数定义完之后在内存中是有一块空间,编译成2进制文件,调用函数的地方存的就是函数在内存中的地址;根据地址找到对应的代码块去执行(函数名指的就是函数的地址),执行完之后再反回到调用的地方继续往下执行!
![](https://i-blog.csdnimg.cn/blog_migrate/20d125bb3c13a3e43e8354cbdd6eda58.png)
验证为什么在C中不可以有同名函数,而C++中允许有
使用gcc和g++分别去编译了同一个.c源文件,观察了可执行二进制文件,发现:
使用gcc编译完之后,函数名没有发生变化
![](https://i-blog.csdnimg.cn/blog_migrate/913f6764e879e0a9d3061b481626d900.png)
使用g++去编译的时候,函数名发生变化了,函数名字根据函数参数类型以及个数进行重命名!
![](https://i-blog.csdnimg.cn/blog_migrate/5052af1dd2e69610147662cf3c99c307.png)
函数名不同,函数在内存中的地址就不同!
总结:
函数重载的原理:使用g++进行编译的时候,函数名会根据参数类型以及参数个数进行重命名,函数名字不一样,函数在内存中的地址就不同,调用的时候执行的就是不同的函数体!
![](https://i-blog.csdnimg.cn/blog_migrate/78fb274a24828547a75822e21e176ee6.png)
参数默认值
什么是参数默认值:就是在函数定义的时候给了形参一个初始值。
当我们在调用函数的时候,可以选择性的给这个参数值,可以给它值也可以不给它值!如果不给它值,按默认值参与函数体中的运算;如果给了它值,就按给的值参与函数体中的运算!
当函数参数有默认值,可以解决函数重载中 只有参数个数不同的而造成的代码冗余!
![](https://i-blog.csdnimg.cn/blog_migrate/d608170bd6e376aa876bc3c43a160a6b.png)
在设计函数参数默认值的时候要注意:
1.参数默认值给的顺序是从右向左的;调用函数的时候参数匹配的顺序是从左向右的
![](https://i-blog.csdnimg.cn/blog_migrate/88fd6e3f60ab92e2661a21d65f470d6e.png)
2.在函数重载中,当函数参数有默认值的时候要注意二义性,不然就会出错!
![](https://i-blog.csdnimg.cn/blog_migrate/9eb7834d0ea2c37f16436dcc34021ef0.png)
解决方案:
![](https://i-blog.csdnimg.cn/blog_migrate/2a5a98c70873b9c2cb49540e8134bb3b.png)
3.当函数声明和函数定义同时存在的时候,参数的默认值只能出现一次,建议放在函数声明的地方!
![](https://i-blog.csdnimg.cn/blog_migrate/2e6e596b659fe7be7f148324304aa46a.png)
如何在C++中引入C的库
C中的标准库在C++中使用:直接 #include<>即可!
C中自定义的库如何在C++中使用呢?
gcc : 编译完之后函数名不变
g++: 编译完之后函数名变化
验证:
制作C的自定义的库 .h .c 生成静态库
![](https://i-blog.csdnimg.cn/blog_migrate/32d9cdf75f2a3075f0285891aaacbf90.png)
![](https://i-blog.csdnimg.cn/blog_migrate/919fa3cae7178232d7dbe9c3bda68c9e.png)
如何解决:
目标:C的库既能在C中使用,也能在C++中使用!
先要明确当下使用的编译器是g++还是gcc?
如何判读编译器是g++还是gcc?
方法1:
![](https://i-blog.csdnimg.cn/blog_migrate/7268df7ed2c5f8f38724df5afece653c.png)
方法2:计算一个字符占的内存大小,也可以来区分!!!
最终的解决方案:
Extern“C”{} 告诉C++编译器按照C的规则去处理即可
![](https://i-blog.csdnimg.cn/blog_migrate/7901cb148d6d06937aecc4b2145a7309.png)
验证ok!
![](https://i-blog.csdnimg.cn/blog_migrate/61e009b855792d921ee4b549af8d8388.png)
8、动态内存分配
C中的动态内存分配:
malloc库函数
free库函数
C++中有提供另外的动态内存分配的方法:
New运算符 –开空间
Delete运算符—释放空间
书写格式:
数据类型 *指针变量 = new 数据类型;==》 delete 指针变量;
数据类型 *指针变量 = new 数据类型[个数]; ==》 delete [] 指针变量;
![](https://i-blog.csdnimg.cn/blog_migrate/9be345e6c0f1c48baa09f5a29379be4c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4c34e4f9a991090361bb52f1bd5803ba.png)
整理面试题目: new和malloc的区别?
New是C++中的运算符,malloc是C中标准的库函数;
书写: new后面只要跟数据类型即可,并且开空间后不需要进行强制类型转换;
Malloc开空间:要给开空间的大小,并且开空间后要进行强制类型转换;
New开的空间用delete去释放; malloc开的空间free去做释放;
New开的空间可以让做初始化,malloc开的空间初始化要自己用memset去做;
对于类类型来说,new的方式去创建对象,会自动的调用构造函数;delete释放对象的时候会自动调用析构函数;
Malloc是不会执行构造函数的,free是不会执行析构函数的!!!
面试题目:
为什么有了malloc和free还需要new和delete?