C++八股
·
**失败的秋招体验,我要开始好好学习,记录我的八股。
文章目录
静态变量和全局变量、局部变量的区别?在内存上是怎么分布的
- 作用域
静态变量:静态全局变量的作用域仅限于定义它的文件内部,静态局部变量的作用域则与普通局部变量相同,只在定义它的函数或代码块内部可见。
全局变量:在整个程序中都是可见的,从定义处开始到文件结束,甚至可以通过extern在其他文件中使用。
局部变量:只在定义它的函数或代码块内部可见。 - 生命周期
静态变量:静态全局变量从程序开始到程序结束;静态局部变量在第一次进入函数时被创建,在程序结束时销毁。* 静态局部变量只被初始化一次,即使函数被多次调用,它也会保持上一次的值。
全局变量:在程序开始时被创建,在程序结束时销毁。生命周期贯穿整个程序运行期间。
局部变量: 在进入函数或代码块时被创建,在离开时销毁。每次函数调用都会重新创建和销毁。 - 存储位置
静态变量:存储在全局/静态存储区(也称为数据段)。
全局变量:存储在全局/静态存储区(也称为数据段)。
局部变量:通常存储在栈(除非被特别指定为静态或动态分配)。 - 初始化
静态变量:如果没有显式初始化,基本数据类型会自动被初始化为0,指针型会自动被初始化为空。
全局变量:如果没有显式初始化,基本数据类型会自动被初始化为0,指针型会自动被初始化为空。
局部变量: 必须使用前显示初始化,否则值为未定义。 - 链接属性
静态变量:静态全局变量具有内部链接,只能在其定义的文件内使用;静态局部变量无链接,因为只在定义它们的函数或代码块内可见。
全局变量:具有外部链接,可以在其他文件中使用(通过extern声明)
局部变量: 无链接,因为只在定义它们的函数或代码块内可见。 - 使用场景
静态变量:静态全局变量用于限制变量只在当前文件内使用,避免命名冲突;静态局部变量,可以在需要保持函数调用之间状态的情况,例如计数器、单例模式等。
全局变量:当需要在多个函数或文件之间共享数据时使用,但应谨慎使用,因为它会增加程序的耦合性。
局部变量:用于函数内部,避免函数间的相互影响。
指针和引用的区别
- 概念上:指针是一个存储另一个变量地址的变量,指向内存中的一个位置;引用是变量的另一个别名,不可变,必须初始化。
- 空状态:指针可以被初始化为NULL或nullptr,表示不指向任何地址;而引用定义时必须被初始化,不能引用NULL或不存在的内存地址。
- 可变性:指针可以指向一个变量地址后可以改变,指向不同内存地址;引用一旦被初始化,将一直引用同一个对象,不能改变绑定。
- 操作:指针可通过解引用操作符 * 访问指针指向的变量的值,可通过地址运算符 & 获取变量的地址。而引用在声明时被初始化,并在整个生命周期一直引用同一个变量,本身就是变量的别名,不用别的操作符。
- 使用场景:指针可用在动态内存分配、数组操作以及函数参数传递等场景;引用可用在函数参数传递、操作符重载以及创建别名等场景。
static关键字和const关键字的作用
- static:用于控制变量和函数的生命周期、作用域和访问权限。
- 声明静态变量:静态变量的生命周期直到程序结束。当在函数内部声明静态变量时,即使函数执0行完了也不会释放它,下次调用该函数时会保留上次的状态。
- 在类中,被static声明的成员被称为静态成员。
- 静态成员变量:在类中使用static关键字修饰的成员变量,表示该变量属于类而不是类的实例,所有实例共享同一份数据
- 静态成员函数:在类内使用static关键字修饰的成员函数,所有对象共享同一个函数;静态成员函数只能访问静态成员变量;静态成员函数调用可以不需要通过创建类的实例,而是直接通过类名调用。
- static 变量如果被多个线程访问,需要特别注意线程安全问题。
- const:关键字用于定义常量,即一旦初始化后其值不能被修改。const 变量由于其不可变性,天然具有线程安全性。
- 常量变量:声明变量,使变量的值不能修改(只读)
- 常量成员函数:表示该函数不会修改对象的成员变量
- 常量指针:可以指向一个 const 类型的值,或者是一个指向 const 值的指针,表明指针指向的值不能通过这个指针被修改。
- static跟const有时可以组合使用,如 static const 变量,表示一个静态的常量。
总结来说,static 关祙键字用于创建类的静态成员,而 const 关键字用于定义常量。
常量指针和指针常量之间有什么区别
- 常量指针:指针指向的数据是一个常量,不能通过指针修改该常量的值,但是指针本身的值(即它所指向的地址)是可以改变的;
- 指针常量:指针本身的值是一个常量,即指针一旦被初始化,所指向的地址不可以修改,但是地址所存放的变量值可以修改。
结构体和类的区别
- struct 在C语言只能包含成员变量,不能包含成员函数。而在C++中,struct 类似于 class既可以包含成员变量,又可以包含成员函数。class 可以用于定义模板函数,而struct 不行。
- struct的成员默认是public,而class默认是private;
- struct继承默认是public,而class默认是private;
实际使用中,struct 我们通常用来定义一些 POD(plain old data)类型,它是用来描述一种数据类型的特性,主要用于在内存中表示简单的数据结构。
什么是智能指针,C++有哪几种智能指针
智能指针是为了防止内存泄漏而产生的,会自动调用析构函数对内存进行释放。
有独占指针,共享指针和弱指针。
智能指针是C++中用来自动管理动态分配内存的一种模板类,维护着一个指向动态分配对象的指针,并在智能指针对象被销毁时,自动释放该内存,从而避免内存泄漏。C++有以下几种智能指针:
std::unique_ptr:独占式拥有指针,保证同一时间只有一个 unique_ptr 指向特定内存,适用于不需要共享所有权的场景,如栈上对象的管理。
std::shared_ptr:多个 shared_ptr 可以共享同一内存,使用引用计数机制来管理内存的生命周期,适用于多个对象需要共享同一个资源的场景。
std::weak_ptr:弱引用,用于解决 shared ptr 可能导致的循环引用问题,它不拥有所指向的对象。
智能指针的实现原理是什么
- std::unique_ptr:独占所有权的智能指针。它确保同一时间只有一个智能指针可以指向该对象。当unique_ptr被销毁时,它所指向的对象也会被销毁。实现上,unique_ptr通常包含一个原始指针,并在析构时删除该指针。
原理:禁止拷贝,只允许移动
实现关键:删除拷贝构造函数和赋值运算符,实现移动语义 - shared_ptr:共享所有权的智能指针。多个shared_ptr可以指向同一个对象,并通过引用计数来管理对象的生命周期。每多一个shared_ptr指向该对象,引用计数就增加1;每销毁一个shared_ptr,引用计数就减少1。当引用计数变为0时,对象被删除。shared_ptr的实现通常包含两个指针:一个指向管理的对象,另一个指向控制块(control block)。控制块中存放引用计数、弱引用计数等。注意,引用计数的增加和减少必须是原子操作,以保证线程安全。
- weak_ptr:弱引用的智能指针。它不增加引用计数,不管理对象的生命周期,但可以知道对象是否还活着。weak_ptr通常用于打破shared_ptr的循环引用问题。weak_ptr的实现也是通过控制块,但只增加弱引用计数,不增加强引用计数。当强引用计数为0时,对象被销毁,但控制块仍然存在,直到弱引用计数也为0才被释放。
更多推荐


所有评论(0)