一、基础知识
1、基本知识
说一下C++和C的区别
设计思想上:C++是面向对象的,C是面向过程的
语法上:C++具有封装、继承和多态三种特性;C++相比C,增加了许多类型安全的功能,比如强制类型转换;C++支持范式编程,比如模板类、函数模板等
C++11的新特性
auto关键字、右值引用、初始化列表对类进行初始化、新增容器array和tuple、智能指针
inline函数的作用
加快函数的执行速度吧。因为内敛函数调用,是将调用表达式直接用内敛函数体来替换。
虚函数和纯虚函数的区别
声明不同:纯虚函数后面必须跟=0;
虚函数必须实现,纯虚函数一定没有实现
虚函数在子类里面可以不重载,但是纯虚函数必须重载
虚函数在子类里面也可以不重载的;但纯虚必须在子类去实现
说一下C++中static关键字的作用
1、修饰局部变量:
特点:有默认值0,只执行一次,运行一开始就开辟了内存,内存放在数据段
2、修饰全局函数和全局变量:
特点:只能在本源文件使用
3、修饰类里面的成员变量:特点:和1差不多,定义多个类对象,但共用相同的静态成员变量,不进入类的大小计算,不依赖于类对象的存在而存在(可直接调用,要进行外置声明)(类名或对象直接访问)
4、修饰类的成员函数:特点:f():括号里无this指针,只能调用他的本类静态函数和他的静态变量,即是用static修饰过的不依赖于类对象的存在而存在(可不进行外置声明,直接调用)(类名或对象直接访问)
说一说C++中的四种cast转换
C++中四种类型转换是:static_cast、dynamic_cast、const_cast、reinterpret_cast
1、dynamic_cast
用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。要深入了解内部转换的原理。
向上转换:指的是子类向基类的转换
向下转换:指的是基类向子类的转换
它通过判断在执行到该语句的时候变量的运行类型和要转换的类型是否相同来判断是否能够进行向下转换。
2、static_cast
可以转换相关联的类,可以从子类转换成父类。也能从父类转向子类,但是如果转换的父类指针(或者父类引用)所指向的对象是完整的,那么是没有问题;但是如果所指向的对象并不完整,那么会出现runtime错误。
用于各种隐式转换,比如非const转const,void*转指针等,static_cast能用于多态向上转化,如果向下转能成功但是不安全,结果未知。
3、reinterpret_cast
几乎什么都可以转,比如将int转指针,可能会出现问题,尽量少用。
该操作不会去进行动态类型或者静态类型的检测,它仅仅将值强行赋值过去。从某种意义上对编译器进行了一种欺骗,同时也带来了一定的不安全性
4、const_cast
常量转换,用于将const变量转为非const
指针和引用的区别?
1、指针是一个变量,引用是一个别名
2、指针可以为空,引用不可以为空,创建时候必须初始化
3、指针的值在初始化后可以改变,但是引用不可以改变
4、指针可以多级,但是引用只能一级
左值和右值引用的区别
左值与变量绑定一次,而右值只能和表达式绑定一起,且右值引用只能绑定到一个即将销毁的对象上
左值有持久性,右值一般是个临时变量或者字面常量
为什么要使用智能指针
智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。
请你说一下你理解的c++中的smart pointer四个智能指针
- auto_ptr(C++11已抛弃)
采用所有权模式,使用
=
将会给所有权传给对方。auto_ptr< string> p1 (new string ("I reigned lonely as a cloud.”)); auto_ptr<string> p2; p2 = p1; //auto_ptr不会报错.
此时不会报错,p2剥夺了p1的所有权,但是当程序运行时访问p1将会报错。所以auto_ptr的缺点是:存在潜在的内存奔溃问题!
- unique_ptr(独占的智能指针)
unique_ptr实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。它对于避免资源泄露(例如“以new创建对象后因为发生异常而忘记调用delete”)特别有用。
unique_ptr<string> p3 (new string ("auto")); //#4 unique_ptr<string> p4; //#5 p4 = p3;//此时会报错!!
编译器认为
p4=p3
非法,避免了p3不再指向有效数据的问题。因此,unique_ptr
比auto_ptr
更安全。另外unique_ptr
还有更聪明的地方:当程序试图将一个 unique_ptr 赋值给另一个时,如果源unique_ptr
是个临时右值,编译器允许这么做;如果源unique_ptr
将存在一段时间,编译器将禁止这么做,比如:unique_ptr<string> pu1(new string ("hello world")); unique_ptr<string> pu2; pu2 = pu1; // #1 not allowed unique_ptr<string> pu3; pu3 = unique_ptr<string>(new string ("You")); // #2 allowed
注:如果确实想执行类似与#1的操作,要安全的重用这种指针,可给它赋新值。C++有一个标准库函数
std::move(