细节汇总:
基础部分:
1.引用与指针的区别:
1.1 引用是变量的别名,引用必须初始化,且类型与其所指代的变量类型一致,但是引用不分配内存空间。指针不声明初始化,但在初始化的时候会分配内存空间。
1.2 两个变量不能有同一个别名,但同一个变量可以有多个别名,引用初始化后不能改变。但是指针可以指向不同的变量
1.3 引用不能指向空值,但是指针可以指向空值。
2.C++中重写与重载的区别:
重载:是指同一可访问内存空间内,形参列表不同的同名函数,重载也不关心返回值。
重写:是指除了函数体外都相同的函数
二者区别:1.范围:重写与被重写的是在不同的类中,而重载与被重载的是在同一个类中。
2.参数列表:重载和被重载的参数列表一定不同,而重写与被重写参数列表一定相同。
3.重写的基类得有virtual关键字修饰,而重载可以有,也可以没有。
3.c++面向对象的三大特征分别是:
1.封装:
所谓封装是将客观事物抽象成一个类,并且这个类的属性和函数只让信任的类或对象访问,对不信任的进行隐藏。在⼀个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种⽅式, 对象对内部数据提供了不同级别的保护,以防⽌程序中⽆关的部分意外的改变或错误的使⽤了 对象的私有部分。
2.继承
主要体现的思想是代码复用,它可以使⽤现有类的所有功能,并在⽆需᯿新编写原来的类的情况下对 这些功能进⾏扩展。
继承概念的实现⽅式有两类: 实现继承:实现继承是指直接使⽤基类的属性和⽅法⽽⽆需额外编码的能⼒。 接⼝继承:接⼝继承是指仅使⽤属性和⽅法的名称、但是⼦类必需提供实现的能⼒。
3.多态
多态比如说听同时听到上课铃声,老师和同学会做出不同的反应。多态与⾮多态的实质区别就是函数地址是早绑定还是晚绑定的。如果函数的调⽤,在编译器编 译期间就可以确定函数的调⽤地址,并产⽣代码,则是静态的,即地址早绑定。⽽如果函数调 ⽤的地址不能在编译器期间确定,需要在运⾏时才确定,这就属于晚绑定。
4.什么是智能指针?野指针与悬空指针?空指针?指针常量?常量指针?
智能指针:实际是管理指针的一个类,当超出了类的作用域时就会调用析构函数释放空间,所以智能指针的作⽤原理就是 在函数结束时⾃动释放内存空间,不需要⼿动释放内存空间
野指针:指针指向的区域是提前没有声明并初始化的区域,不可以操作,会报错。
空指针:初始化为NULL值为0的指针,0~255地址空间不可操作。
悬空指针:即指原来指向的内存空间已经被释放
⽆论是野指针还是悬空指针,都是指向⽆效内存区域(这⾥的⽆效指的是"不安全不可控")的指 针。 访问"不安全可控"(invalid)的内存区域将导致"Undefined Behavior"。 如何避免使⽤野指针?在平时的编码中,养成在定义指针后且在使⽤之前完成初始化的习惯或 者使⽤智能指针。
指针常量指向的地址不可修改,但值可以改变。
常量指针指向的值可以修改地址不可修改。
5.指针与数组
//数组的数组名就是数组的首地址
int arr[3] = {1,2,3};
int * p = arr;
//一个指针是4个字节(32位系统及x86)在64位系统中是8个字节。
6.C++的四区
//代码区 存放二进制代码 特点是:共享 只读;
//全局区 存放 常量 全局变量 静态变量
//栈区 存放局部变量和形参 局部变量在函数执行结束后自定释放 因此不要返回局部变量的地址(会出错!)
//堆区 由程序员管理 程序结束后回收
7.引用
//引用必须初始化 初始化后不可以修改
//函数传参的两种方式 {值传递(形参不会影响实参) : 地址传递 (形参会影响实参)}
//引用与原变量共享内存
/**
引用的本质是指针常量
*/
8.函数
/**
函数的默认参数
从初始化的那个开始 从左向右 都得初始化
函数的声明中初始化了 实现中不可再初始化了
*/
8.1函数的占位参数(参数只有类型 没有变量名)
8.2函数重载(相同作用域下 函数名相同 形参列表不同)
函数重载时尽量不要写默认参数 否则会产生二义性 报错
9.类class
9.1 c++中的struct和class的区别 :
struct 默认公有 class 默认私有
9.2 c++中的构造函数与虚构函数的特点:
相同点:都是程序会自动调用 没有返回值 也不用写void
不同点:构造函数可以重载 析构不可以
9.3 拷贝构造函数
实现方式有3种(传参 返回值 使用一个已经存在的对象克隆一个新的)
9.4 深拷贝 与 浅拷贝
浅拷贝使用的程序默认拷贝函数 会出现堆区内存被重复释放 因为他们的指针所存的地址值相同
使用深拷贝 自定义拷贝函数可以解决浅拷贝存在的问题 因为重新在堆中开辟了内存空间
10 .静态成员函数
静态成员函数只能访问静态成员变量 静态成员函数可以通过对象或类::直接访问。
10.1空对象占用1字节
静态变量 类内声明 类外初始化
只有非静态成员变量才属于类上 成员函数与成员变量是分开存储的。
10.2 this 指针的作用
区别同名 函数返回对象本身
10.3常函数
相当于 const int * const test 常函数中的值不可修改 但如果加了mutable 关键字可修改
常对象只能调用常函数
10.4 全局函数做友元 类做友元 成员函数做友元 friend 关键字 相当于钥匙
11 .运算符重载
自定义数据类型的运算操作 自定义函数实现 但函数名使用系统提供 关键字operator
12.继承
三种继承非静态成员都会被继承只是私有的被隐藏了。
13.多态
分为静态多态和动态多态 区别在于地址是早绑定还是晚绑定
静态多态就是通常的函数重载 运算符重载 (运算符重载就是让自定义数据类型也可以实现运算操作)
动态多态的实现条件:
1.要有父子类继承关系
2.地址晚绑定在函数上加关键字virtual 变成虚函数。
动态多态重写了父类的虚函数 重写即返回值 函数名 形参列表都相同 仅仅函数体不同
抽象类无法实例化对象 new 不new的区别对象是在堆上还是栈上。
子类继承抽象函数 必须继承父类的纯虚函数
虚析构和纯虚构函数是为了解决父类指针释放子类对象不干净的问题。
14.STL
存在意义 提高代码复用性
大的分类 容器 算法 迭代器
六组件:仿函数 适配器 空间配置器 容器 算法 迭代器