1.c语言与c++的区别
C语言:面向过程的结构化程序设计语言, 中级语言
例如:我想吃西红柿炒鸡蛋
面向过程的西红柿炒蛋:按步骤一步一步的去做(买番茄,鸡蛋,炒),才有可能得到最终的结果,注重的是过程,只有过程对了,才有好的结果!
C++语言:面向对象的编程语言
面向对象的西红柿炒蛋:点外卖, 坐着等,不需要关注你怎么做出来! 注重的是结果
1)编程思想的不同:C++的面向对象的编程思想更接近于我们自然界的发展规律的!
C语言中的也有面向对象编程的影子:结构体—》只是简单的描述属性,并不能被一个学生描述的活灵活现的;缺少动态的内容;
C++: 属性+行为整合。
2)C++是完全兼容C, 只要是合法的C语言程序在C++中也是合法的;
3)C++多了2个+,因为C++比C扩充了非常多的内容;不管是关键字、数据类型等都有扩充!
应用领域:
QT—》嵌入式产品的UI设计
人工智能领域: 图像处理—opencv—C++/C
游戏开发
2.命名空间---3W1H
1)解决问题:命名冲突(变量名、函数名、自定数据类型)
在C语言中,同一个作用域中是不允许出现同名的变量、同名的函数的,同名的数据类型。
实际生活中:一定会有这样子的情况发生,例子:有个班级中可以有相同名字的学生呀!
如何区分呢:就是在变量或者是函数名的前面加上作用域或者 归属。
命名空间:
格式: namespace 命名空间的名字{变量, 函数、自定义的数据类型};
访问:
分类:有自定义命名空间 ,也有标准的命名空间(std)
例如:using namespace std;
3.标准的输入输出流
C语言中标准的输入输出函数: printf、scanf、getchar、putchar、gets、puts
什么流:以字节为单位,连续的方向统一的就是流!
输入流: cin >> a; 就是从标准输入流中输入数据到 a
输出流: cout << a; 就是把a输出到标准的输出流中
好处:不需要什么格式命名,输入也不需要关注要不要加&符号!使用方便简单!
4.引用类型-----指针对比
目的:弱化指针;因为这个引用可以实现和指针一样的效果;C++
减少临时空间的开辟; 指针定义变量的时候,会给分配4字节或者是8字节的内存空间存地址;但是我们的引用是不需要的,因为已经存在了,引用是用来起别名的!
引用是什么: 就是给变量起别名 int a=10; int &b =a;
格式: 数据类型 &引用名字 = 变量名;
指针与引用有什么区别? 是什么? 特点? 应用场景?
1)指针用来保存地址;引用是给变量起别名的;
2)定义不同: 指针变量是需要分配内存空间的;引用不需要额外的分配内存空间,他和变量指向同一块内存空间;
3)初始化不同: 指针变量可以不给初始化,建议给初始化为null;引用是必须给初始化的;
4)使用上: 指针变量指向的地址是可以变化的;引用一旦初始化了就不可以改变
使用引用比使用指针安全
5)应用:函数的参数设计上;在C++中尽量少使用指针传参,因为引用可以实现和指针一样的效果!
5.函数重载
函数: 函数类型 函数名(参数列表){执行语句;}
作用·:减少代码冗余、可维护可扩充的、功能单一、高内聚低耦合。
同样的一个.c文件,使用gcc编译和g++编译后发现,得到的可执行文件中调用的函数的名字是不同的!
使用gcc编译,函数名没有发生变化
使用g++编译,函数名发生了变化,根据函数名+形参的个数以及类型进行的重命名!一旦函数名不同,那么函数对应的地址就不一样的!
函数重载的原理:
就是因为使用g++编译后,函数名会根据函数参数以及参数个数进行重命名,名字不同对应的函数地址也就不一样,从而就可以很好的区分执行哪一个函数!
6.参数默认值
就是在函数定义的时候给函数的参数初始值!
调用的时候 可以给值也可以不给值;如果调用的时候有给值,就按给的值参与运算,如果没有给值,就按默认值参与运算!
注意:
1)当函数的参数有默认值的时候,进行函数重载时要注意调用冲突—二义性。
2)函数参数默认值给的顺序是 从右向左的顺序依次去给;调用的时候实参与形参的匹配顺序是从左向右的。
3)当函数的声明和定义同时存在的时候,参数的默认值只能出现一次,并且我们建议在声明的地方写函数参数的默认值,定义中就不要写了!
7.c++中如何引入c的库
C++中可以直接使用C中提供的标准的库函数头文件
在C++中引入 我们自定义的C 的库:
制作静态库
如何解决:
目标是:C的库仍然是可以在gcc使用同时也可以g++使用!
唯一不一样的是: Gcc编译函数名不变
G++编译的时候函数名变化
解决的问题: 如何判断什么时候函数名需要变化,什么时候不需要变化
换句话说只要判断编译器就可以了!判断此时的编译器是gcc呢还是g++? 那如何判断呢?
8.动态分配内存
Malloc Free 是C中标准的库函数!!!
如果分配的不是连续的空间:new和delete是运算符!!!!
New 数据类型;
Delete 变量名即可!!!!
s = new int[3](); 进行初始化(为0)
new和malloc的区别
1)malloc和free是c中标准的库函数;new和delete是运算符。
2)它们都可以用来动态分配内存空间
3)使用上malloc要指定开辟空间的大小,需要进行强制类型转换,申请到的空间没有初始化,需要memset进行初始化,必须要用free进行释放。
4)使用new开辟空间,书写简单直接跟数据类型,不需要指定开辟多大的空间,不需要强制类型转换,new开辟的空间可以进行初始化在后面加()即可初始化,必须要用delete进行释放。
9.面向对象编程中的类和对象
面向对象编程:关注的是结果,其实内部也有过程的!
面向对象编程:对象(数据+算法)+对象+对象组成。
C语言中面向对象编程:结构体
什么是结构体:为了描述一类事物的属性而自定义的数据类型
例如:
学生:属性:学号、姓名、出生日期、性别、成绩
行为:能上课、能做作业、能吃饭、能睡觉。
C++的面向对象: 希望能够把属性和行为给整合起来,来描述一类事物!
C++中的结构体与C中的结构体有什么区别?
1)C中的结构体里面不可以有函数;C++中的结构体中是可以有函数!
2)空的结构体,在C语言中占0字节;在C++中占1个字节;
C++中为了更好的表达面向对象的,引入了类!自定义的数据类型!
什么是类: 为了描述一类事物的属性和行为而自定义的一种数据类型,就是类!
关键字: class
格式: class 类名{属性和行为};
什么是对象:类这个数据类型定义的变量,我们称为对象!
C++中的类与C++中结构体的区别?
1)结构体的关键字:struct,类的关键字是 class;
2)结构体中的成员默认权限是 public;类中的成员默认权限是 private!
3)结构体的初始化方式和类的初始化方式不同
类中的访问权限有3种
Public: 公有的 类的内部和类的外部都可以访问
Private: 私有的 类的外部是不可以访问
Protected:受保护的 类的外部是不可以访问
什么是类的内部: {};里面
什么是类的外部: {};外面
C++面向对象编程特性:4大特性
抽象、封装、继承、多态!
抽象:提取共性:共同的属性和行为
什么是封装:就是把共同的行为和属性组成在一起,这个概念就是封装!在对只需提供对应的接口—函数即可!
例如:空调上的按钮
总结封装: 把一类事物的属性和行为用外壳(自定义的数据类型)类包起来,该隐藏的隐藏,该暴露的暴露的。
什么是需要隐藏的?属性,放在private私有区域
什么是需要暴露的?行为,放在public 公有区域
类定义的格式:
Class 类名
{
Public:
成员函数;
Private:
数据成员;
Protected:
};
以手机为例子:
属性:品牌、型号、运行内存、内存、颜色、价格、像素等
行为:开机、关机、打电话、拍照、上网等
类和对象的关系:类是对象的抽象;对象是类的具体实例!
在内存中的关系中:类的成员函数是这个类所有对象共用一份;这个类的每一个对象都拥有一份属于自己的数据成员
10.this指针
类的所有的成员函数都有一个隐藏的参数,是当前这个类类型的指针变量,当调用这个成员函数的时候,这个指针变量保存的是当前对象的地址!
通过this指针来区分访问的是谁的数据成员!谁调用成员函数,this指的就是谁的地址!
建议大家:类的成员函数中要访问数据成员,记得加this指针;因为当类的成员函数的参数的名字和数据成员的名字一样的时候,不加this的话,是没法区分谁是谁!
不管是类的内部还是类的外部,要访问类的成员,必须通过对象的方式去访问:
如果是普通的类对象,访问成员用.+成员;
如果是指针类型的对象,访问成员用->成员;