- 博客(54)
- 资源 (3)
- 收藏
- 关注
原创 已经有了隐式转换和强制转换 为什么还要用static_cast
C++引入static_cast并不是为了增加新的功能,而是为了解决C风格转换的几个严重问题。解决方案:static_cast便于工具分析和重构。解决方案:static_cast提供明确的语义。static_cast在编译时捕获错误。
2025-11-12 10:55:48
278
原创 C++四种类型转换cast及其底层实现
在多继承情况下,上行转换(指向第二个或之后的基类)可能需要调整指针的值,因为第二个基类子对象位于派生类对象内存布局的偏移位置。vptr 和 vtable:任何一个包含虚函数的类的对象,在其内存布局中都有一个隐藏的成员——虚表指针(vptr),它指向一个虚函数表(vtable)。检查 Derived的类型是否与当前对象的类型相同,或者是其基类(对于上行转换,dynamic_cast也可以工作,但通常用 static_cast)。对于类指针的上行/下行转换,在单继承情况下,指针的值通常不需要改变。
2025-11-12 10:24:20
984
原创 右值引用,引用后还是右值吗
在上面的代码中,foo函数的参数 str是一个右值引用,它绑定到了实参 "Hello World"创建的临时字符串。正因为这条规则,我们在希望移动一个有名字的右值引用时,必须使用 std::move将其显式转换回右值。与“有名字的右值引用是左值”相对应,没有名字的右值引用表达式(通常是函数调用的返回值)仍然是右值。右值引用(T&&)在声明时,它绑定的是一个右值(如临时对象、std::move的结果)。简单直接的回答是:不,一个有名字的右值引用,在表达式里被视为左值。核心规则:有名字的右值引用是左值。
2025-11-11 17:01:55
163
原创 虚函数表什么时候有多张
多张虚函数表的出现,根本原因是存在多个需要支持多态的类(在继承体系中),尤其是在多继承下,一个派生类对象内部会集成多个基类子对象,从而关联多张虚函数表。[0]: Derived::func1的地址 (重写了 Base2::func1。如果派生类重写(override) 了基类的某个虚函数,那么派生类的虚函数表中对应的函数指针会被更新为派生类自己的函数地址。[0]: Derived::func1的地址 (重写了,所以覆盖了基类的地址)[2]: Derived::func4的地址 (新增的虚函数,附加在此)
2025-11-11 16:56:12
686
原创 python使用pycharm和conda 设置默认使用清华镜像
将步骤分为Conda配置和PyCharm配置两部分。Conda部分包括添加镜像源、调整优先级、更新环境。PyCharm部分需要根据版本说明如何添加镜像源到项目解释器设置中。同时,需要验证配置是否成功,并提醒常见问题,比如路径错误或缓存问题。需要确保引用正确的网页编号,如等,避免重复引用同一个来源。以下是配置 PyCharm 和 Conda 使用清华镜像源的完整指南:一、Conda 镜像源配置。
2025-05-24 16:38:53
1744
原创 edge设置位IE模式打开网页
打开Edge浏览器->在浏览器工具栏右键->自定义工具栏->外观->选择要在工具栏上显示的按钮->找到“Internet Explorer 模式”按钮->开启,将其添加到工具栏中。
2025-05-12 16:01:22
1114
原创 VS Code 文件定位功能
设置 ->搜索 Explorer: Auto Reveal -> 将配置改为 false。1、取消“当前打开文件”的自动定位功能。
2024-09-09 18:33:42
1669
原创 切换VS Code中Python解释器
如果你想要为特定的VS Code工作空间设置不同的Python解释器,可以在该工作空间的.vscode/settings.json文件中添加或修改"python.pythonPath"设置,指向你想要的Python解释器路径。请注意,切换Python解释器并不会改变VS Code作为编辑器的本质,而是改变了VS Code在执行Python代码时所使用的Python环境。这样,你就可以在不同的项目中使用不同版本的Python或不同的库依赖了。从列表中选择你想要切换到的Python解释器。
2024-09-03 09:23:00
3506
原创 std::bind
分别创建了两个新的可调用对象,它们分别绑定了特定的参数到原始函数。这样,当这些新的可调用对象被调用时,它们会自动使用预设的参数进行调用。是用于将函数(或成员函数)与特定参数绑定在一起,创建一个新的可调用对象的工具。这在处理事件回调、信号槽连接等场合非常有用。
2024-03-21 10:59:35
489
原创 std::bind
可以方便地用来创建回调函数,尤其是在那些需要用户提供一个在未来某个时间点执行,并且可能带有预定义参数的函数的地方。,以及预先设定的参数。这样就创建了一个可以作为回调函数使用的对象。函数,它接受一个无参数的回调函数,并在一个指定的延迟后执行。函数,从而实现了在2秒后通过回调机制调用。在这个例子中,我们首先定义了一个类。
2024-03-21 09:35:01
578
原创 回调函数,类和类之间通信
在C++中,回调函数是一种常见的实现类之间通信的方法。回调函数可以让一个类在其内部方法中调用另一个类提供的函数,从而实现在不同类之间传递消息、触发事件或共享处理逻辑。,实现了类间的通信。使用lambda表达式可以达到同样的目的,而且更为简洁。为了能将类B的非静态成员函数作为回调,可以使用。类型的回调函数,并在触发事件时调用它。绑定到特定对象后传递给。
2024-03-20 14:25:18
409
原创 观察者模式
函数中,我们定义了两个全局函数作为观察者的回调,并将它们注册到具体主题上。当主题状态改变时,这两个回调函数会被调用,显示收到的消息。和lambda表达式以获得更高的灵活性。在C++中,可以使用函数指针实现观察者模式,但现代C++更推荐使用。观察者通过注册函数指针作为回调函数,当主题状态变化时,会遍历并调用所有注册的回调函数。上述代码定义了一个抽象主题。
2024-03-20 14:19:28
421
原创 delete与 delete []区别是什么?
delete 只会调用一次析构函数,而 delete[]会调用每一个成员的析构函数。在 More Effective C++中有更为详细的解释:“当 delete 操作符用于数组时,它为每个数组元素调用析构函数,然后调用 operatordelete 来释放内存。”delete 与 new 配套,delete []与 new []配套...
2022-05-15 10:35:11
331
原创 说说析构函数为什么定义为虚函数?
主要是因为c++的多态性,父类的指针可以指向子类的对象,当直接调用delete该指针时,若析构函数是虚函数,会先调用子类的析构函数,再调用父类的析构函数。若析构函数不是虚函数,则c++会采用静态绑定的方式,因为指针是父类类型的,所以就仅仅调用了父类的析构函数,此时该子类对象就没有得到正常的析构。...
2022-05-15 10:30:18
386
原创 C++中的 new/delete 与 malloc/free 的区别是?
new/delete是c++运算符,malloc/free是c语言标准库函数,new/delete会调用类的构造/析构函数,malloc/free不会,new会自动计算内存大小。
2022-05-15 10:27:50
211
原创 操作系统面试题集1
1、什么是进程?什么是线程?进程线程有什么区别?进程是具有独立功能程序在某个数据集上的一次运行过程。线程是进程内的一个执行实体或执行单元。不同进程具有独立的地址空间,同一进程内的线程共享同一地址空间。一个进程内的线程对另一个进程是不可见的。在引入线程的操作系统中,进程是资源分配和调度的单位,线程是处理机分配和调度的基本单位。资源是分配给进程的,线程只拥有很少的资源,因此线程切换代价比进程低。2、什么是死锁?死锁产生的原因和必要条件是什么?在多道程序设计中,当一组进程中的每个进程均无限期的等待被该组
2022-05-12 12:09:12
203
原创 从已经有序的线性表{a1,a2,...,an}中查找元素值为x的,如果查找失败,则将x插入,并保持有序。要求时间复杂度最低。low=1,high=L.length
从已经有序的线性表{a1,a2,…,an}中查找元素值为x的,如果查找失败,则将x插入,并保持有序。要求时间复杂度最低
2021-10-21 23:41:27
233
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅