cpp八股文系列

weltlgit

Ariston

Posted on December 7, 2023

cpp八股文系列

c++语言基础篇

1.说说智能指针

回答:首先智能指针被发明出来是为了防止内存泄漏,避免程序员忘记释放申请的内存。由于智能指针是一种类,超出了类的作用域,会自动调用析构函数释放资源。因此不需要手动释放内存。

常用的接口

T* get()//获取裸指针
T* operator*()//重载取值运算符
T* operator->()
T& operator=(const T& val);
T* release()//将智能指针内部的裸指针初始为null,不改变指向的内存
void reset (T* ptr = nullptr) //释放指针所指向的内存,如果传了个指针,改智能指针将会内部初始化为改值,记住只能传裸指针,但是不要用reset来进行复制!,因为这不会增加引用计数,两个指针的引用计数是独立的。
Enter fullscreen mode Exit fullscreen mode
1.unique_ptr

不能进行复制得本质是删除了拷贝构造函数和拷贝赋值运算符。
但是是有移动赋值的!

删除器的使用
定义删除器,然后模板中为两个参,第一个是托管的类型名,第二个是删除器类型,指针的参数中也是,(但是这里的第一个参数是指针类型,和直接创建智能指针有些不同)

#include <iostream>
#include <memory>

// 自定义删除器
void myDeleter(int* p) {
    std::cout << "Custom deleter called. Deleting resource.\n";
    delete p;
}

int main() {
    // 创建 unique_ptr,使用自定义删除器
    std::unique_ptr<int, decltype(&myDeleter)> ptr(new int(42), myDeleter);

    std::cout << "ptr points to " << *ptr << std::endl;

    // 当 ptr 超出作用域时,myDeleter 将被调用来删除资源
    return 0;
}

Enter fullscreen mode Exit fullscreen mode
2.shared_ptr

和unptr一样都支持异常安全,只要超出了作用域都会释放资源

会有循环引用问题
A类中有一个b的shared_ptr,B类中有一个a的shared_ptr,
形成了一个闭环,可以想象一下内部布局,当要释放A的时候,A中有一个b的指针计数为1,释放B的时候,B中有一个a的技术为1,所以永远无法释放,解决方法就是把其中一个换位weak_ptr,因为wptr不会增加引用计数,所以也不会阻止对象销毁。

2.const和static的区别

static:
修饰局部变量:static让变量生命周期延长到整个程序结束,但是作用域还是限制在语句块内
修饰全局变量:会把改变量限制在只在该文件内可见
修饰函数:同上
修饰类成员变量和成员函数:让成员变量和成员函数属于类而不是对象。注意 static函数没有this指针,所以也就不能用visual来修饰,this->visual->ctable->virtual function。也只能访问static修饰得成员。
其中私有static和公有也是有区别的,私有只能被类的内部访问,公有可以被外部访问
const:

3.说说类和对象

私有成员不能被继承,公有和保护可以被继承,公有继承不改变变量隐私,保护继承全部变为保护,私有继承全部变为私有

💖 💪 🙅 🚩
weltlgit
Ariston

Posted on December 7, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related