本章记录了C++笔试面试中常问的一些问题,记录自己学习,欢迎大家白嫖
目录
14、vector与list的区别,vector、list、map是什么存储结构
17、访问权限private、protected、public区别
1、指针和引用的区别
1、指针定义的时候用*号,引用定义的时候用的是&
2、指针定义的时候需要给指针分配8字节的内存空间,引用定义时不需要分配内存空间,引用使用的是原本变量的内存空间
3、指针定义时可以不初始化(野指针),引用定义时必须初始化
4、指针初始化之后,可以改变指针的指向,引用初始化之后不能改变目标
5、指针可以是空指针,引用不能是空引用
6、指针取值需要使用*号解引用,引用直接用原本的变量
7、指针进行偏移运算的时候是对内存地址的偏移,而引用进行偏移的时候,就是对目标值的偏移
8、指针有二级指针,引用没有二级引用
9、指针可以有指针数组,引用不能有引用数组
10、指针不能指向右值,但是右值引用的目标可以是右值
2、类和结构体的区别
1、类在创建到时候用的是class关键字,结构体用的是struct
2、类的默认权限为privat,结构体默认权限是public
3、类的默认继承方式为private,结构体的默认继承方式为public
4、类支持继承和多态,意味着一个类可以从另一个类中继承属性和方法,并且可以使用多态性来完成不同形式的方法,而结构体不支持继承和多态
3、C++中static和const作用
static:
1、修饰函数的局部变量时,当前变量独立于整个函数存在,生命周期随整个程序编译产生,终止结束;即使函数没有被调用,静态成员变量的内存空间也已经存在了;初始化后,具有保值功能
2、修饰类中的成员变量,为静态成员变量,不依赖对象而存在,编译时系统分配空间;需要在全局处进行定义;即使没有类对象,也能通过类名直接使用;多个对象共享静态成员变量,即使类对象空间被释放,静态成员变量的空间没结束,随整个程序结束而结束
3、修饰全局变量,表示限制作用域为当前文件,只能在当前文件使用,即使使用extern也不可以使用
4、修饰全局函数,表示限制作用域为当前文件,只能在当前文件使用,即使联合编译也不可以使用
5、修饰类中的成员函数,表示静态成员函数,独立于类体存在,用类名和类对象都能进行调用,在静态成员函数中,只能访问静态成员变量,不能访问非静态成员变量,没有this指针
const:
1、修饰普通变量,表示顶一顶是一个常变量,该变量只可读不可写,定义时必须初始化
2、修饰指针变量,如果放在*前,指针所执行空间中的内容可读不可写;放在*后表示指针的值可读不可写,指针指向不能改变;如果连边都加,表示都不可更改,可读不可写
3、修饰函数形参,表示传过来的数据,可读不可写
4、修饰函数的返回值,表示保护函数的返回结果不被修改(指针函数和引用函数)
5、修饰成员函数,放到函数最后,表示保护成员变量不被修改
4、C和C++的区别
1、C是面向过程的编程语言,而C++是半面向过程半面向对象的泛式编程
2、C中不支持继承,C++中引入了类的概念,支持封装,继承,多态等面向对象的编程特性
3、C不支持异常处理,C++支持异常处理机制,包括try,catch,throw关键字
4、C使用malloc,free进行内存管理,C++支持C风格,同时有new,delete进行内存管理
5、C不支持运算符重载,C++支持
6、C++中的类型检查更加严格
5、什么是构造函数、析构函数
构造函数:
1、是一种特殊的成员函数,在创建类对象时被调用,用于初始化对象的状态
2、当使用实例化对象时,系统自动调用
3、构造函数分有参构造和无参构造,如果提供了构造函数,就不会再提供无参构造函数
4、必须使用初始化列表的情况:形参名和成员变量名同名,有const修饰的成员变量,有引用的成员,有其它类的成员子对象
析构函数:
1、在对象生命周期结束后,用于回收内存空间
2、申明前加上一个 ~
3、如果没有手动定义析构函数,系统会自己提供,如果定义,就不提供默认的析构函数
4、当栈区空间释放后,系统会自动调用;堆区空间使用delete释放空间,自动调用
6、new、delete、malloc、free的区别
1、new和delete是关键字,malloc和free是函数,需要包含相关的库
2、new申请空间时,可以进行初始化,malloc申请空间时不能进行初始化
3、使用new申请空间后,申请什么类型的就是什么类型的地址,而malloc申请的结果是void*需要具体转换
4、new支持连续释放空间,free不支持
5、new申请款空间时以数据类型为单位,malloc申请空间以字节为单位
6、new申请空间时会自动计算所需空间大小,而malloc申请空间时需要手动计算大小
7、new关键字中封装了malloc函数,delete关键字中封装了free
8、new在申请空间时会调用该类的构造函数,malloc不会
9、delete释放空间时会调用该类的虚函数,free不会
7、虚函数的作用
首先虚函数是在函数前加上virtual关键字,这个函数就是虚函数
1、虚函数的作用主要是为了实现多态机制
2、提高了代码的灵活性,当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同子类指针,动态调用子类的该函数(动态联编)
8、对多态的理解、多态的原理
1、父类的指针或者引用可以指向子类的对象,进而调用子类中重写的父类的虚函数
2、通过基类的指针或者引用调用虚函数,被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写
9、为什么在继承中将析构函数定义为虚析构函数
在多态的情况下,基类指针可能指向派生类的对象。如果析构函数不是虚的,那么在删除这样的指针时,只会调用基类的析构函数,而不会调用派生类的析构函数。这可能导致派生类中分配的资源(如动态内存、文件句柄、网络连接等)没有被正确释放
10、构造函数可以定义成虚函数么
不能是虚函数,构造函数是使用类去实例化对象时,为对象进行资源的申请以及初始化使用的,虚函数的调用是在对象创建之后,通过对象的指针或引用进行的;虚函数对应一个指针,如果构造函数是虚函数,就要通过指针去调用,但是此此时对象空间还没有实例化,也就是没有内存空间,就无法找到这个指针
11、深拷贝和浅拷贝的区别
1、浅拷贝在复制对象的时候,只复制对象的值,而不复制对象内部指向动态分配内存的指针指向的内容,速度快,但是如果原对象释放了内存,复制的指针就会变成悬空指针
2、深拷贝在复制对象的时候,不仅复制对象的值,还复制对象内部指向动态分配内存的指针的指向的内容,速度慢,安全,与原对象完全独立
12、This指针的作用
1、This指针是指向当前对象的指针,是成员函数内的一个隐式参数,指向调用该成员函数的对象的内存地址,主要用途是在成员函数内部访问对象的成员变量和调用其他成员函数
2、在类的成员函数中,如果存在与类成员变量同名的局部变量或者函数参数,就可以使用this明确指出成员变量属于当前对象
13、重载、覆盖、隐藏的区别
1、函数重载:函数名相同,形参列表必须不同
1)作用域相同
2)函数名相同
3)参数列表必须不同(个数、类型)
4)有无 virtual 都无所谓
5)跟返回值没有关系
2、函数重写:子类中重写父类的虚函数
1)作用域发生在父子类中
2)函数原型相同(返回值、参数个数、参数类型、函数名)
3)父类中的函数必须要有 virtual 关键字
3、函数隐藏:子类中定义与父类同名的函数
1)作用域发生在父子俩中
2)函数名相同
3)返回值可以不同
4)参数不相同
5)没有virtual修饰
14、vector与list的区别,vector、list、map是什么存储结构
1、vector:
存储结构:是一个动态数组
特点:支持快速随机访问
2、list:
存储结构:是一个双向链表
特点:支持在任何位置高效地插入和删除元素,不支持随机访问
3、map:
存储结构:map是一个基于红黑树实现的关联容器,
特点:元素师键值对的形式,每个键都是唯一的,支持对数时间复杂度的查找、插入和删除操作,可以保持元素有序,不支持随机访问
15、迭代器的作用
迭代器的作用是用来访问容器(用来保存元素的数据结构)中的元素,使用迭代器就可以访问容器中里面的元素
16、智能指针有哪些?
1、uniqu_ptr(独占智能指针)
1)同一时间,只能有一个unique_ptr指向给定的对象,当该指针被销毁时,指向的对象也会随之释放
2)不允许拷贝操作,支持移动操作
2、shared_ptr(共享智能指针)
1)同一时间,允许多个指针共享一个资源,使用计数器机制来跟踪有多少个shared_ptr实例共享同一个资源,当最后一个引用被销毁时,资源会被自动释放
2)可能会出现循环引用问题,导致内存泄漏
3、weak_ptr(弱智能指针,辅助shared_ptr)
1)用来解决shared_ptr可能导致的循环引用问题,weak_ptr不会增加引用计数
17、访问权限private、protected、public区别
1、 private:这是最严格的访问权限,被声明为 private 的成员只能被类的成员函数、友元函数和同一个类的其他实例访问。private 成员在类外部是不可见的,即使是子类也无法访问 private 成员。
2、protected:被声明为 protected 的成员可以被类的成员函数、友元函数和同一个类的其他实例访问,此外,还可以被继承类(子类)访问。但是,protected 成员对于类之外的其他对象(除了继承它的子类)是不可见的。
3、public:这是最宽松的访问权限,被声明为 public 的成员可以被任何对象访问,无论是类内部还是类外部,或者是继承它的子类。public 成员提供了最大的访问自由度。
18、什么是抽象类
1、对于有些类而言,类中的相关成员函数没有实现的意义,主要是让子类完成重写操作的
2、以便于父类的指针或引用指向子类的对象,调用子类中重写的父类的虚函数
就可以将这样的函数设置成纯虚函数
3、定义格式:virtual 返回值类型 函数名(形参列表) = 0
4、包含纯虚函数的类就叫做抽象类,抽象类是不能实例化对象的
5、要求子类中必须对这些虚函数进行重写
6、如果包含虚函数的子类中没有重写其虚函数,那么其子类也是抽象类,子类中的该函数也还是纯虚函数