面试题目记录
admin
2024-03-05 07:22:39
0

这里写目录标题

    • C++
      • i++/++i
      • emplace
      • 右值引用
      • 智能指针
      • Lambda表达式
        • Lambda使用问题
    • QT
      • 使用qml有哪些问题
      • win32窗口从点击到相应的过程

推荐几款实用的C++ 在线工具
C++、Qt基础面试题

C++

i++/++i

    int i = 1;int a = i++;i = 1;int b = ++i;i = 1;int c = ++i + ++i;

a = 1 b = 2 c = 6

emplace

  • 解释vector.push_back("xyzzy");的过程
    1、"xyzzy"调用string构造函数,得到一个临时右值变量temp
    2、调用push_back的右值重载函数,把temp实参传入给其形参x,然后内部调用vector的移动构造函数,得到一个副本,插入到vector容器中。
    3、temp临时变量析构
    而采用emplace_back则没有第一步,只有第二步,那么当然的第三步也没有。
    参考:https://cntransgroup.github.io/EffectiveModernCppChinese/8.Tweaks/item42.html

右值引用

  • std::move的实现
template                            //在std命名空间
typename remove_reference::type&&
move(T&& param)
{using ReturnType =                          //别名声明,见条款9typename remove_reference::type&&;return static_cast(param);
}
  • 解释下面的代码value(std::move(text)) 是否调用了string的移动构造函数?
class Annotation {
public:explicit Annotation(const std::string text):value(std::move(text)) { … }                       …
private:std::string value;
};

参考:https://cntransgroup.github.io/EffectiveModernCppChinese/5.RRefMovSemPerfForw/item23.html
记住:
第一,不要在你希望能移动对象的时候,声明他们为const。对const对象的移动请求会悄无声息的被转化为拷贝操作。第二点,std::move不仅不移动任何东西,而且它也不保证它执行转换的对象可以被移动。

  • std::forward是怎么知道它的实参是否是被一个右值初始化的?
    std::forward只对实参是右值时才做转换,把形参转为右值(所有的函数参数,都是左值,当实参是左值时,没必要转换)。

智能指针

  • shared_ptr是否线程安全?
    多线程操作同一个shared_ptr对象时,不是线程安全的。多线程操作多个shared_ptr对象(指向一块内存地址),是线程安全的,不需要去管。踏马的,这个不是正常吗,都不是一个对象了,多线程当然是安全的。
    另一个层面就是:shared_ptr对象所管理的那块内存是不是线程安全的。答,不是。多个shared_ptr对象,在多线程中,共同所指的那块内存地址的操作是不安全的。但也不一定都无脑的加锁去判断。有一种解决方式就是,用一个原子变量代表是否要对这块内存做处理,而在回到顺序处理的流程中,通过判断这个原子变量是否是true,来做最终的处理。
    另一个层面就是:shared_ptr初始化时的线程安全性。make_shared是线程安全的。
processWidget(std::shared_ptr(new Widget),  //潜在的资源泄漏!computePriority());
// 解决方法1
processWidget(std::make_shared(),   //没有潜在的资源泄漏computePriority());
// 解决方法2
std::shared_ptr spw(new Widget);
processWidget(spw, computePriority());  // 正确,但是没优化,因为这里spw是一个左值,方法1中是一个右值参数
// 解决方法3
processWidget(std::move(spw), computePriority());   //高效且异常安全

因为std::shared_ptr(new Widget),是两个步骤:1、new Widget 2、shared_ptr的构造函数,而std::make_shared()是一步操作。参考:条款二十一:优先考虑使用std::make_unique和std::make_shared,而非直接使用new
参考:https://blog.csdn.net/bureau123/article/details/121300979
https://zhuanlan.zhihu.com/p/416289479

  • make_shared
// 两次分配内存,一次new Widget,一次shared_ptr构造函数中包含引用计数的控制块
std::shared_ptr spw(new Widget);
// 一次分配,分配的内存同时容纳了Widget对象和控制块
auto spw = std::make_shared();
  • make函数的缺点
    make函数都不允许指定自定义删除器。
    和直接使用new相比,make函数消除了代码重复,提高了异常安全性。对于std::make_shared和std::allocate_shared,生成的代码更小更快。
    不适合使用make函数的情况包括需要指定自定义删除器和希望用花括号初始化。
    对于std::shared_ptrs,其他不建议使用make函数的情况包括(1)有自定义内存管理的类;(2)特别关注内存的系统,非常大的对象,以及std::weak_ptrs比对应的std::shared_ptrs活得更久。

Lambda表达式

Lambda实现原理:参考https://www.zhihu.com/question/57241113/answer/2440288161
Lambda捕获原理,在定义时捕获还是运行时捕获? 运行时,如果是定义时,那么某个捕获的变量如果变化了,那这个变化的值就得不到了。
下面这段代码有什么问题:

    int i = 10;auto f = [=]() {i = 9;};

Lambda使用问题

  • 引用捕获外部的局部变量,此时可能在执行Lambda表达式时,该捕获的局部变量早已脱离作用域而析构了,导致悬空引用。此时需要改用值捕获来解决。
  • 值捕获一个指针变量。需要注意这个指针变量所指的内存是否已经被外面释放了。此时最好值捕获一个shared_ptr,或者使用深拷贝(即重写赋值运算符,里进行深拷贝)。
  • 捕获this问题。如果使用默认捕获,或者值捕获类对象的成员变量,都会存在潜在的问题。即类对象可能会析构了,而lambda表达式中的对成员变量的使用还在继续,这会导致崩溃。
    解决办法:1、捕获一个对这个成员变量的临时赋值的变量,而不是这个成员变量本身。2、使用C++14的广义Lambda 3、C++17增加了新特性可以捕获*this,不持有this指针,而是持有对象的拷贝,这样生命周期就与对象的生命周期不相关,使用上就安全一些。
    参考:Effective Modern C++ 条款31
    参考:c++的lambda使用注意事项,可能导致的崩溃问题分析

QT

使用qml有哪些问题

  • 避免定时轮询,采用信号槽机制通知。
  • 避免频繁的属性访问,如果必要,可以先用一个变量存储这个属性,再去频繁范围这个变量即可。尽量用临时变量替代对属性的访问。
  • 属性绑定时,避免复杂的计算。简单的计算,QML可以直接得出结果,效率比较快。
  • 尽量少用属性绑定(因为被绑定的值一旦变化,属性表达式将重新计算)。用锚布局。
  • 属性设置为异步加载,asynchronous异步属性设置为true,在组件实例化时可以提高流畅性。
  • 避免var的声明,声明为具体的类型,局部变量声明未let
    https://www.jianshu.com/p/e6fcb575f916

win32窗口从点击到相应的过程

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...