1.纯虚函数如何定义,为什么对于存在虚函数的类中析构函数要定义成虚函数
为了实现多态进行动态绑定,将派生类对象指针绑定到基类指针上,对象销毁时,如果析构函数没有定义为析构函数,则会调用基类的析构函数,显然只能销毁部分数据。如果要调用对象的析构函数,就需要将该对象的析构函数定义为虚函数,销毁时通过虚函数表找到对应的析构函数。
2.析构函数不能抛出异常
(1)如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄露的问题。
(2)通常异常发生时,c++的机制会调用已经构造对象的析构函数来释放资源,此实若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。
3.指针和引用的区别
(1)指针保存的是所指对象的地址,引用是所指对象的别名,指针需要通过解引用间接访问,而引用时直接访问;
(2)指针可以改变地址,从而改变所指的对象,而引用必须从一而终;
(3)引用在定义的时候必须初始化,而指针不需要;
(4)指针有指向常量的指针和指针常量,而引用没有常量引用;
(5)指针更灵活,危险性比较大,引用比较死板,也比较安全。
4.常量指针和指针常量
(1)指针常量(int*const p)
本质上是一个常量,在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址,但是解引用的值可以变换。在定义的时候必须初始化。
(2)常量指针(const int *p, int const *p)
常量指针本质上是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。在常量指针中,指针指向的内容是不可更改的,指针指向一个常量。即指针自身的值可以改变,可以指向其他地址,但是解引用的值不能变化。
int main() {
int m = 10;
const int n = 20; // 必须在定义的同时初始化
const int *ptr1 = &m; // 指针指向的内容不可改变
int * const ptr2 = &m; // 指针不可以指向其他的地方
ptr1 = &n; // 正确
ptr2 = &n; // 错误,ptr2不能指向其他地方
*ptr1 = 3; // 错误,ptr1不能改变指针内容
*ptr2 = 4; // 正确
int *ptr3 = &n; // 错误,常量地址不能初始化普通指针吗,常量地址只能赋值给常量指针
const int * ptr4 = &n; // 正确,常量地址初始化常量指针
int * const ptr5; // 错误,指针常量定义时必须初始化
ptr5 = &m; // 错误,指针常量不能在定义后赋值
const int * const ptr6 = &m; // 指向“常量”的指针常量,具有常量指针和指针常量的特点,指针内容不能改变,也不能指向其他地方,定义同时要进行初始化
*ptr6 = 5; // 错误,不能改变指针内容
ptr6 = &n; // 错误,不能指向其他地方
const int * ptr7; // 正确
ptr7 = &m; // 正确
int * const ptr8 = &n;
*ptr8 = 8;
return 0;
}
5.数组名作为参数传递给函数时,退化为指针
作为参数时传递的是数组的首地址。
6.智能指针https://blog.csdn.net/flowing_wind/article/details/81301001
除了静态内存和栈内存外,每个程序有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,必须销毁它们。
在C++中,动态内存的管理是由new和delete完成,new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete:指向一个动态独享的指针,销毁对象,并释放与之相关联的内存。
动态内存管理经常会出现两种问题:一种是忘记释放内存,造成内存泄露;一种是尚有指针引用内存的情况下就释放了它,产生引用非法内存的指针。
为了更加容易的使用动态内存,引入了智能指针的概念。智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。标准库提供两种智能指针的区别在于管理底层指针的方法不同,shared_ptr允许多个指针指向同一个对象,unique_ptr则“独占”所指向的对象。标准库还定义了一种名为weak_ptr的伴随类,它是一种弱引用,指向share_ptr所管理的对象,这三种智能指针都定义在memory头文件中。
shared_ptr类
make_shared用其参数来构造给定类型的对象。每个shared_ptr都有一个关联的计数器,通常称其为引用计数,无论何时我们拷贝一个shared_ptr,计数器都会递增。当我们给shared_ptr赋予一个新值或是shared_ptr被销毁时,计数器就会递减,一旦一个shared_ptr的计数器变为0,他就会自动释放自己所管理的对象。
auto r = make_shared<int>(42);//r指向的int只有一个引用者
r=q;//给r赋值,令它指向另一个地址
//递增q指向的对象的引用计数
//递减r原来指向的对象的引用计数
//r原来指向的对象已没有引用者,会自动释放
shared_ptr自动销毁所管理的对象
当指向一个对象的最后一个shared_ptr被销毁时,shared_ptr类会自动销毁此对象。
7.auto
auto是一个c++语言存储类型,仅在语句块内部使用,初始化可为任何表达式。
8.程序使用动态内存的原因:
(1)程序不知道自己需要使用多少对象
(2)程序不知道所需对象的准确类型
(3)程序需要在多个对象间共享数据