智能指针:
避免程序员申请的的空间在结束时候忘记释放,造成内存泄漏这种情况的发生,指针是个类超出他的作用域,类会自己调用析构函数释放资源,不需要手动释放
内存分配情况:(四大区)
代码区:存放程序的二进制代码
全局区:存放全局变量和静态变量以及常量,如果没有被初始化会自动初始化
栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等,函数执行结束时栈自动被释放。
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收 new malloc delete free
ps: 【常量存储区: 放常量字符串 不允许修改】【五部分的话 加 常量存储区】
符号表:(程序编译成可执行文件后,文件中会有一个专门的表用来保存函数名,变量名,段名和代码或者数据的对应关系,这个表就是符号表(编译阶段产生的)。
1.被c++11抛弃auto_ptr,
2unique_ptr
构造函数:
作用:初始化对象的 属性
默认构造函数:自动生成,参数为空, 不使用这个的话要手动生成
一般构造函数:可以有多个,类似重载关系,各个函数之间的参数个数 类型不同
拷贝构造函数:默认就有, 参数为 一个对象的引用 , 将旧对象的值 全复制到新的对象中,但有属性是指针的,最好用自己定义的深拷贝构造函数
类型转换构造函数:explict的 ,
析构函数:对象销毁前 自动调用,执行一些清理工作 格式在构造前~ ,不可以有参数只能是空参,不能发生重载
class 和 struct的唯一区别是 属性的访问权限 struct默认全是public , class默认全是 private
友元
友元的目的就是让一个函数 或 类 访问另一个类中私有成员 (给一些特殊函数 特殊的权限)
友元的关键字为 friend
指针和引⽤的区别
指针是⼀个实体,引⽤只是⼀个别名。在程序编译的时候,将指针和引⽤添加到符号表中。
【符号表:(程序编译成可执行文件后,文件中会有一个专门的表用来保存函数名,变量名,段名和代码或者数据的对应关系,这个表就是符号表(编译阶段产生的)。】
指针的内容 是所指向的内存的地址,指针包含的内容是可以改变的,允许拷⻉和赋值; sizeof 指针得到的是指针类型的⼤⼩。
在 引用 添加到符号表的时候,是将"引⽤变量名-引⽤对象的地址"添加到符号表中,符号表⼀经完成不能改变,
所以,也不能为空,也没有 const 和⾮ const 区别。sizeof 引⽤得到代表对象的⼤⼩。
⽽ sizeof 指针得到的是指针本身的⼤⼩。另外在参数传递中,指针需要被解引⽤后才可以对对象进⾏操作,⽽直接对引⽤进⾏的修改会直接作⽤到引⽤
对象上。
作为参数时也不同,传指针的实质是传值(传递的值是指针的地址);传引⽤的实质是传地址,传递的是变量的地址。
**定义一个指针可以不用初始化,但是在使用指针时一定要确定它是否被初始化即是否指向了某一个确定的可访问的内存位置。*以防止指向是不确定的指向系统中某一重要的内存位置。
如:int p;//定义一个整型指针此时可以不初始化,但它的指向是不确定的可能指向了系统中某一重要的内存位置。
int a;
p=&a;//将p指向变量a,此时p的指向是确定的
当对p进行解引用时如*p=20此时就要看看p的指向是否已确定。由于上面我们将p指向了a变量所在内存位置,所以上面的操作是正确的。
3、C++ 中的指针参数传递和引⽤参数传递
指针参数传递本质上是值传递,它所传递的是⼀个地址值 操作的是一个实参的副**本
值传递过程中,会在栈中开辟内存空间以新建并且存放实参的⼀个副本(替身)
值传递的特点是,被调函数对形式参数的任何操作都是作为局部变量进⾏的,不会影响主调函数的实参变量的值(形参指针变了,实参指针不会变)。
C++ 的四种强制转换
C++ 的四种强制转换包括:static_cast, dynamic_cast, const_cast, reinterpret_cast
static_cast:明确指出类型转换,⼀般建议将隐式转换都替换成显示转换,因为没有动态类型检查,上⾏转换(派⽣类->基类)安全,下⾏转换(基类->派⽣类) 不安全,所以主要执⾏⾮多态的转换操作;
dynamic_cast:专⻔⽤于派⽣类之间的转换,type-id 必须是类指针,类引⽤或 void*,对于下⾏转换是安全的,当类型不⼀致时,转换过来的是空指针,⽽static_cast,当类型不⼀致时,转换过来的事错误意义的指针,可能造成⾮法访问等问题。
const_cast:专⻔⽤于 const 属性的转换,去除 const 性质,或增加 const 性质, 是四个转换符中唯⼀⼀个可以操作常量的转换符。
reinterpret_cast:不到万不得已,不要使⽤这个转换符,⾼危操作。使⽤特点: 从底层
对数据进⾏重新解释,依赖具体的平台,可移植性差; 可以将整形转 换为指针,也可以
把指针转换为数组;可以在指针和引⽤之间进⾏肆⽆忌惮的转换。
引⽤参数传递过程中,被调函数对形参的任何操作都会影响实参变量。
从编译的⻆度来讲,程序在编译时分别将指针和引⽤添加到符号表上,
符号表中记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,⽽引⽤在符号表上对应的地址值为引⽤对象的地址值(与实参名字不同,地址相同)。符号表⽣成之后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),⽽引⽤对象则不能修改。
函数传递参数的⼏种⽅式
值传递:形参是实参的拷⻉,函数内部对形参的操作并不会影响到外部的实参。值传递过程中,会在栈中开辟内存空间以