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的特性
命名空间
命名空间格式:
namespace 命名空间的名字{可以有变量,也可以有函数,还可以有自定义的数据类型};
使用:
命名空间名字::变量等!
使用using namespace命名空间名字; 切换到对应的范围中,直接使用即可!
标准输入输出流
C语言中标准的输入输出头文件 stdio.h
库函数 Scanf、 printf在C++中是可以直接使用的!
除此之外,C++中也有提供专门用来做输入输出流!
什么是流: 以字节为单位,连续不断,方向一致的称为流!
输入流对象: cin
使用: cin>> 变量;
输出流对象: cout
使用:<< 变量;
好处: 输入输出不需要做格式的限制,使用简单
引用类型-----引用与指针的区别(面试常问的题目)
什么是指针: 保存地址,得到地址,可以对地址中的内容做修改、访问!
应用在: 函数参数设计
引用: 可以实现和指针一样的效果。
目的:
弱化指针,能用指针实现的可以替换成引用!
减少临时空间的分配: int *p;就需要给p分配内存空间;引用是不需要分配内存空间。
什么是引用: 就是给变量起别名,变量是已经存在的,别名和变量指的是同一块内存空间!
定义的格式: 数据类型 &引用名 = 变量名;
Int p = 10;
Int &pt = p; // 这里的pt就是给p起的别名
函数重载
函数名的设计比较困难
两数求和或者交换封装函数:
Int sum(int a,int b); //只能实现两个int类型数的求和
Double sum_double(doublea, double b);
char sum_char(chara, char b);
参数默认值
什么是参数默认值:就是在函数定义的时候给了形参一个初始值。
当我们在调用函数的时候,可以选择性的给这个参数值,可以给它值也可以不给它值!如果不给它值,按默认值参与函数体中的运算;如果给了它值,就按给的值参与函数体中的运算!
当函数参数有默认值,可以解决函数重载中 只有参数个数不同的而造成的代码冗余!
如何在C++中引入C的库
C中的标准库在C++中使用:直接 #include<>即可!
C中自定义的库如何在C++中使用呢?
gcc : 编译完之后函数名不变
g++: 编译完之后函数名变化
8、动态内存分配
C中的动态内存分配:
malloc库函数
free库函数
C++中有提供另外的动态内存分配的方法:
New运算符 –开空间
Delete运算符—释放空间
书写格式:
数据类型 *指针变量 = new 数据类型;==》 delete 指针变量;
数据类型 *指针变量 = new 数据类型[个数]; ==》 delete [] 指针变量;
new和malloc的区别?
New是C++中的运算符,malloc是C中标准的库函数;
书写: new后面只要跟数据类型即可,并且开空间后不需要进行强制类型转换;
Malloc开空间:要给开空间的大小,并且开空间后要进行强制类型转换;
New开的空间用delete去释放; malloc开的空间free去做释放;
New开的空间可以让做初始化,malloc开的空间初始化要自己用memset去做;
对于类类型来说,new的方式去创建对象,会自动的调用构造函数;delete释放对象的时候会自动调用析构函数;
Malloc是不会执行构造函数的,free是不会执行析构函数的!!!
面试题目:
为什么有了malloc和free还需要new和delete?
9、面向对象编程中的类和对象
面向过程编程:一步一步的去实现;
面向对象编程:点外卖,坐等着吃
在整个程序都是由一个一个的对象组成
对象是由数据结构+算法组成的,这个其实就是通过面向过程实现的!
C++中的结构体与C中结构体的区别?
<1>.c结构体中不能有函数;而C++结构体中是可以有函数的!
C++中的类与C++中结构体的区别?
<1>.关键字不同: 类是用class 结构体用struct
<2>.初始化的方式是不一样的:
结构体的初始化是数据类型 变量名 = {};
但是类变量的初始化是不能按结构体的方式去做;
<3>.成员默认的权限是不同的:
结构体中成员的默认权限是 公共的 public
类中成员的默认权限是私有的 private
<4>结构体定义出来的变量就是变量;
类数据类型定义出来的变量叫 对象
10、This指针
This:是这个的意思,它指的就是类对象的地址。
哪个类对象的地址:谁去调用成员函数,this指针的就是谁的地址!
11.类中特殊的成员函数--构造函数
本质:是函数;
作用:在创建对象的时候,给对象分配内存空间并对数据成员进行初始化的。
何时调用:在创建对象的时候被调用的
谁调用: 系统自动调用
如果我们自己没有定义构造函数的话,系统会帮我们自动的创建一个空的构造函数;如果我们自己有写,走我们自己定义的构造函数!
12.类中特殊的成员函数--析构函数
本质:函数
作用:在对象生命周期结束的时候,做资源释放回收的!特别是在堆区分配的空间一定要通过free或者delete去做释放!
何时调用:在对象生命周期结束的时候
谁去调用:系统自动去调用
析构函数如果我们自己没有定义,系统会帮我们自动生成一个空的析构函数;如果我们自己写了,会调用我们自己写的析构函数!
13.static修饰类的成员
回顾一下C中的static的作用
<1>static修饰全局变量:限制全局变量的作用域
<2>static修饰局部变量:延长局部变量的生命周期
<3>static修饰函数: 限制了函数的作用域
const修饰的类对象(常对象),不能调用非const修饰的成员函数;只能调用const修饰的成员函数!
常对象只能调用常函数!
mutable关键字
作用:解决const修饰的成员函数中没法修改数据成员值的问题
使用: 就是在数据成员声明的前面加上 mutable
友元
友元就是朋友的意思!
关键字: friend
什么时候选择用友元:多次频繁的访问或者修改类的数据成员的时候
14.运算符重载
函数重载:函数名相同、函数功能相似、参数不同(个数、类型、顺序)、与返回值类型无关的一组函数!
15.继承
为什么要使用继承,解决什么问题?
减少代码冗余,新写的代码中可以直接使用已经有了的代码,提高开发效率!
qq版本更新:
其实就是在原有的代码的基础上新增一些功能代码或者是完善一个功能!
面向对象编程:
原有类的基础上创建新的类出来,新的类中可以直接使用原来类中的内容,新的类中可以增加新的数据成员和成员函数!
继承的好处:
减少代码冗余、提高开发效率、减少出错!
16.静态(绑定)多态和动态(绑定)多态!!!
什么是静态(静态库):
在编译阶段会链接到可执行文件中
什么是动态(动态库):
在运行阶段会链接到可执行文件中
总结:
静态和动态的区别: 链接的时刻不同
什么是静态多态:调用一个函数,在编译阶段就知道要执行的函数是哪一个
体现在:函数重载、运算符重载
G++去编译的时候,会根据函数的参数类型以及参数个数对函数进行重命名,调用的时候不同的函数名对应不同的函数体!
什么是动态多态:调用一个函数,在运行阶段才知道要执行的函数是哪一个
体现在:继承、虚函数
17.Explicit
作用: 防止构造函数单参数时进行类型转换
18.Final关键字
作用:就是用来修饰类以及类的成员函数的
特点: <1>final修饰类,这个类不能被继承
<2>Final修饰虚函数的时候,虚函数是不可以被重写的!
19.Inline关键字
作用:用来修饰函数,类的成员函数用inline,变成了内联函数!
内联函数的设计的规则:
代码量少---3~5行
逻辑简单: while、for等语句
频繁使用的
为什么要设计内联函数?
调用函数要进行出入栈,出入栈就需要时间,也会占内存的开销。
如何发挥作用的:
调用函数的地方,把函数体在调用的地方直接展开去执行!