1、C++与C的区别
- C++是完全兼容C,只要是合法的C语言程序在C++中都是合法的
- C++比C额外扩充了非常多的内容;
- 编程思想是不一样的;
C是面向过程的结构化程序设计语言:更注重的过程,其实在C中结构体就在面向对象编程了,但是不够彻底
C++是面向对象的编程语言:更注重结果的。整个程序中都是一个一个的对象。
西红柿炒蛋:
面向过程的西红柿炒蛋:每一步都要很清晰,按步骤去实现
面向对象的西红柿炒蛋:不关注过程,我只要结果
C++的应用领域:
- 嵌入式产品的上层的应用系统的开发就是用C++,qt
- 游戏
- 人工智能: 人脸识别---opencv其实就用C++
2、命名空间
作用:解决命名冲突的问题(变量重名、函数重名、自定义的数据类型)
分类:有标准的命名空间
也有自定义的命名空间
格式:namespace{ };
使用:
方法1: 命名空间的名字::变量名等!
方法2: using namespace 命名空间名字;
直接使用:
3、标准输入输出流
C中标准的输入输出:printf和scanf---头文件 stdio.h
什么是流:以字节为单位,连续不断,方向统一的就是流!
C++中输入输出流: iostream using namespace std;
输出流对象Cout: 输出数据到标准输出设备上
输入流对象Cin: 从标准输入设备上输入数据到变量中
好处:在操作的时候不要指定数据的格式
4、引用类型
目的: 弱化指针,因为指针能实现的效果,引用一样也可以实现
减少了临时空间的分配,因为定义指针变量系统是会给分配内存空间的,但是引用类型是不需要分配内存空间的!
引用是什么?
引用就是给一个变量起个别名 ,说明它和变量本身是同一个
如何定义引用呢? 数据类型 &引用名 = 变量名;
Int b=100;
Int &a =b;
特点: 必须初始化,引用不可以改变指向
作用:1.作为函数参数,传参如果在函数内容对变量的值做了修改,外部变量本身的值也会发生变化;
定义常量的方法:
#define NUM 100
Const int a =100;
Const int &a=100;
Const修饰的变量一般都出现在函数的参数上,为了保证数据在传递的过程中,值不被修改,保证数据的安全性!!!
5、函数重载
解决问题:函数功能相似,唯有函数的参数类型不同、个数不同等一组函数
定义: 一组函数功能相似、函数名相同、函数的参数不同(参数的类型不同、个数不同、参数顺序不同),与返回值无关的函数互为重载。
每一个函数在内存中都有对应的地址;调用的时候就是根据这个地址找到对应的函数体,去执行。
谁能够代表函数的地址:函数名,只要函数名不同,地址就不一样了!
同一个.c文件,用gcc编译和g++编译之后,发现:
gcc编译后函数的名字是没有发生变化的
g++编译后函数的名字会发生变化: 重命名之后的函数名是根据参数类型与参数个数+函数名字组成的!
6、参数默认值
解决的问题:当函数重载中出现只有函数参数个数不同的情况下,可以通过给参数设置默认值来减少重载函数的个数,减少代码冗余!
当函数的参数有默认值的情况下,要注意二义性(调用冲突)
7、C++如何引入C的库
<1>c中标准的库直接在C++中是可以使用
<2>C中自定义的库在C++中能否直接使用呢?
验证:
自己制作一个静态库
先创建一个.h和一个.c
然后使用 gcc生成.o的目标文件
- 面向对象编程中的类和对象
面向对象:代码中 由一个一个的对象组成(对象:数据+算法)
面向过程:数据+算法
四大特性:抽象、封装、继承、多态
抽象:C里面结构体里面的成员其实就是在抽象出来的,这个结构体的类型是封装出来的!
什么是结构体:为了描述一类事物的属性而自定义的数据类型;struct
学生:
属性:学号、姓名、性别、成绩、年龄
行为:能学习、能做作业、吃饭、睡觉
链表:
属性: 数据域、指针域
行为: 创建链表、添加节点、删除节点、修改节点中的数据、显示链表中保存的数据
结构体只能描述事物的属性,不能够让事物活灵活现。
面向对象的编程:把属性和行为整合起来,就是封装。