大厂常见面试题----C++篇(2)

本文详细解析了C++中的`static`关键字的四种用法,包括局部、全局和类成员的场景。同时,探讨了内存泄漏的概念及预防措施,指针越界的危害。此外,解释了声明与定义的区别,以及静态绑定和动态绑定在多态中的应用。最后,阐述了引用作为函数参数和返回值的优势及其潜在风险。
摘要由CSDN通过智能技术生成

1.关键字static的作用?

(1)函数体内:static修饰的局部变量作用范围为该函数体,不同auto变量,其内存只被分配一次,因此其值在下次调用的时候维持了上次的值。
(2)模块内:static修饰全局变量或全局函数,可以被模块内的所有函数访问,但是不能被模块外的其他函数访问,使用范围限制在声明它的模块内。
(3)类中:修饰成员变量,表示该变量属于整个类所有,对类的所有对象只有一份拷贝
(4)类中:修饰成员函数,表示该函数属于整个类所有,不接受this指针,只能访问类中的static成员变量。
注意:与const的区别,const强调值不能被修改,而static强调唯一的拷贝,对所有类的对象。

2.什么是内存泄漏?面对内存泄漏和指针越界,你有那些方法?

(1)动态分配内存所开辟的空间,在使用完毕后未手动释放,导致一直占据该内存,即为内存泄漏
(2)方法:malloc/free要配套使用,对指针赋值的时候应该注意被赋值的指针是否需要释放;使用的时候记得指针的长度,防止越界。

3.定义和声明的区别?

(1)声明是告诉编译器变量的类型和名字,不会为变量分配空间。
(2)定义需要分配空间,同一个变量可以被声明多次,但是只能被定义一次

4.静态绑定和动态绑定的介绍?

静态绑定和动态绑定是C++多态性的一种特性。
(1)对象的静态类型和动态类型
静态类型:对象在声明时采用的类型,在编译时确定
动态类型:当前对象所指的类型,在运行期决定,对象的动态类型可变,静态类型无法更改。
(2)静态绑定和动态绑定
静态绑定:绑定的是对象的动态类型,函数依赖于对象的动态类型,在运行期确定。
动态绑定:绑定的是对象的动态类型,函数依赖于对象的动态类型,在运行期确定
只有虚函数才使用的是动态绑定,其余的全部是静态绑定。

5.引用作为函数参数以及返回值的好处?

对比值传递,引用传参的好处:
(1)在函数内部可以对此函数进行修改。
(2)提高函数调用和运行的效率(所以没有了传值和生成副本的时间和空间消耗)
值传递:
形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参-》形参),参数 的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者,采用值传递。
指针传递:
形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
引用传递:
形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递的过程,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
用引用作为返回值最大的好处就是在内存中不产生被返回值的副本。
但是仍有以下的限制:
(1)不能反回局部变量的引用。因为函数返回以后局部变量就会被销毁
(2)不能反回函数内部new分配的内存的引用。虽然不存在局部变量的被动销毁问题,可对于这种情况(反回函数内部new分配内存的引用),又面临其它尴尬局面。例如:被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak
(3)可以返回类成员的引用,但是最好是const。因为如果其他对象可以获得该属性的非常量的引用,那么对该属性的单纯赋值就会破坏业务规则的完整性。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些常见C++大厂面试题及其解答: 1. 什么是多态?如何实现多态? 多态是指同一种操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。在C++中,实现多态有两种方式:虚函数和模板。 - 虚函数 在基类中定义虚函数,派生类可以重写该虚函数。当用基类指针或引用调用该虚函数时,实际调用的是派生类中的函数。这种方式称为动态多态。 - 模板 模板是一种编译期多态性,允许类型参数化。通过模板可以实现函数或类的通用性,同时保持代码的安全性和可读性。这种方式称为静态多态。 2. 什么是智能指针?如何使用智能指针? 智能指针是一种封装了指针的对象,可以自动管理内存,避免内存泄漏和空指针引用等问题。C++11中提供了三种智能指针:unique_ptr、shared_ptr和weak_ptr。 - unique_ptr unique_ptr是独占式智能指针,用于管理一个对象的内存。它不能被复制,只能通过移动语义转移所有权。当unique_ptr超出作用域或被显式删除时,它所管理的对象会被自动销毁。 - shared_ptr shared_ptr是共享式智能指针,多个shared_ptr可以共享同一个对象的内存,当最后一个shared_ptr被销毁时,才会释放内存。通过控制块来记录当前有多少个shared_ptr指向同一个对象。 - weak_ptr weak_ptr是弱引用智能指针,它可以用于解决shared_ptr的循环引用问题。weak_ptr不拥有对象的所有权,只是提供了一种安全的访问方式。 使用智能指针时需要注意避免循环引用和空指针引用等问题。 3. 什么是虚函数?虚函数有什么作用? 虚函数是一种动态绑定的函数,用于实现多态。在基类中定义虚函数,在派生类中可以重写该虚函数。当用基类指针或引用调用该虚函数时,实际调用的是派生类中的函数。 虚函数的作用在于实现多态,使得程序可以在运行时根据对象的实际类型来调用适当的函数。这样可以提高代码的灵活性和可扩展性。 4. 什么是纯虚函数?如何使用纯虚函数? 纯虚函数是一种没有实现的虚函数,在基类中定义纯虚函数,派生类必须重写该函数才能使用。纯虚函数用于定义接口,让派生类来实现具体的功能。 定义纯虚函数可以在函数声明后加上`=0`,如下所示: ```cpp virtual void func() = 0; ``` 使用纯虚函数可以强制规定派生类必须实现某些函数,从而实现多态和接口声明的功能。 5. 什么是模板?如何使用模板? 模板是一种泛型编程技术,通过参数化类型和函数来实现通用性。模板可以实现函数或类的通用性,同时保持代码的安全性和可读性。 在C++中,定义模板可以使用关键字template和typename或class。模板可以有多个参数,可以是类型参数或非类型参数。 模板的使用可以通过实例化来完成,即在模板名后加上具体的类型或值。例如: ```cpp template<typename T> void func(T arg) { ... } func<int>(5); ``` 6. 什么是STL?STL中包含哪些容器?如何使用STL容器? STL是标准模板库的缩写,是C++中的一个重要库,提供了一系列容器、算法和迭代器等工具,用于简化程序开发。 STL中包含以下容器: - 序列式容器:vector、list、deque、array、forward_list - 关联式容器:set、map、multiset、multimap、unordered_set、unordered_map、unordered_multiset、unordered_multimap - 容器适配器:stack、queue、priority_queue 使用STL容器可以通过头文件`<container>`和`<algorithm>`来实现。例如: ```cpp #include <vector> #include <algorithm> using namespace std; vector<int> vec = {1, 2, 3, 4, 5}; sort(vec.begin(), vec.end()); ``` 7. 什么是RAII?如何使用RAII? RAII是资源获取即初始化的缩写,是一种C++编程技术,用于自动管理资源的生命周期。RAII的核心思想是:在对象的构造函数中获取资源,在对象的析构函数中释放资源。 使用RAII可以避免资源泄漏和空指针引用等问题,提高代码的可读性和可靠性。一般情况下,RAII可以通过智能指针、文件句柄、锁等方式来实现。 例如,使用智能指针实现RAII可以如下所示: ```cpp class MyObj { public: MyObj() { ... } ~MyObj() { ... } }; void func() { unique_ptr<MyObj> ptr(new MyObj()); // ... } ``` 当`func()`函数执行完毕时,`ptr`指向的对象会被自动销毁,从而释放资源。 以上是一些常见C++大厂面试题及其解答,希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值