C++ QT 嘴试题--集锦

1、C++的默认函数都有哪些?

在C++中,默认函数(也称为特殊成员函数)是一组在类定义中不需要显式声明和定义的函数。这些函数在特定的情况下会被编译器自动合成(隐式生成)。以下是C++中的默认函数:

  • 默认构造函数(Default Constructor):当没有提供其他构造函数时,编译器会提供一个默认构造函数。它通常不做任何初始化操作或只执行默认的初始化。
class MyClass {  
public:  MyClass() {  // 默认构造函数  }  
};

如果没有提供任何构造函数,编译器也会生成一个默认的无参构造函数。

  • 拷贝构造函数(Copy Constructor):当用同类的一个对象来初始化另一个对象时,会调用拷贝构造函数。如果没有提供拷贝构造函数,编译器会生成一个默认的拷贝构造函数,执行成员变量的浅拷贝。
class MyClass {  
public:  MyClass(const MyClass& other) {  // 拷贝构造函数  }  
};
  • 拷贝赋值运算符(Copy Assignment Operator):当用一个对象给另一个同类对象赋值时,会调用拷贝赋值运算符。如果没有提供拷贝赋值运算符,编译器会生成一个默认的拷贝赋值运算符,执行成员变量的浅拷贝。
class MyClass {  
public:  MyClass& operator=(const MyClass& other) {  // 拷贝赋值运算符  return *this;  }  
};
  • 移动构造函数(Move Constructor):C++11引入移动语义后,当用一个临时对象或即将销毁的对象来初始化另一个对象时,会调用移动构造函数。如果没有提供移动构造函数,编译器会生成一个默认的移动构造函数,执行成员变量的移动语义初始化。
class MyClass {  
public:  MyClass(MyClass&& other) noexcept {  // 移动构造函数  }  
};
  • 移动赋值运算符(Move Assignment Operator):当用一个临时对象或即将销毁的对象给另一个同类对象赋值时,会调用移动赋值运算符。如果没有提供移动赋值运算符,编译器会生成一个默认的移动赋值运算符,执行成员变量的移动语义赋值。
class MyClass {  
public:  MyClass& operator=(MyClass&& other) noexcept {  // 移动赋值运算符  return *this;  }  
};
  • 析构函数(Destructor):当对象生命周期结束时,会调用析构函数。如果没有提供析构函数,编译器会生成一个默认的析构函数,它执行默认的清理操作。
class MyClass {  
public:  ~MyClass() {  // 析构函数  }  
};
  • 转换构造函数(Converting Constructor):这种函数允许一个类的对象被用作初始化另一个类的对象的构造函数的参数。这种构造函数不是由编译器自动生成的,而是由程序员在类定义中显式声明的。

这些默认函数在大多数情况下都足够使用,但在某些特定场景下,你可能需要自定义这些函数以满足特定的需求,例如执行深拷贝、禁止拷贝、启用移动语义等。此外,C++11之后还引入了= default和= delete语法来显式地要求编译器生成默认实现或删除这些特殊成员函数。

2、C++的虚函数实现机制?

虚函数是实现多态(动态绑定)/接口函数的基础。利用虚表实现。
C++对象的内存布局,对象的前8位(64位系统)为虚表指针(vtpr),指向对象所对应的虚表。虚表是一个指针数组,其元素是虚函数的指针,每个元素对应一个虚函数的函数指针。
同一个类的不同实例共用同一份虚函数表,他们都通过一个虚函数表指针指向该虚函数表。
C++中的虚函数表实现机制以及用C语言对其进行的模拟实现

题目:

  • 讲一下C++的多态? —— 静态多态(函数重载),动态多态(虚函数)
  • 讲一下C++的虚函数的实现机制?
  • 多继承情况下,基类Base1与Base2都有虚函数,继承自Base1和Base2的子类Derived1有几个虚表?
    ----- 1个。Derived1的虚函数表仍然是保存到第1个拥有虚函数表的那个基类的后面的。(详情可见于上文博文链接)

3、C++的智能指针

C++11为C++标准库带来了三个智能指针,分别是shared_ptr,unique_ptr与weak_ptr。
C++智能指针的实现原理为引用计数。引用计数无法处理循环引用的情况。
shared_ptr实现原理是同一个内存空间每多一个指针指向就计数加1,如果计数变为0就释放内存空间。当用普通指针初始化的时候,只能使用一次普通指针。它还可以自定义释放函数。
unique_ptr是计数只能为1,没有拷贝构造函数。
weak_ptr只能指向该内存空间而没有所有权。主要用于辅助第一个指针,防止出现互锁。借助weak_ptr类型指针, 我们可以获取shared_ptr指针的一些状态信息,比如有多少指向相同的shared_ptr指针、shared_ptr指针指向的堆内存是否已经被释放等等。在构建weak_ptr指针对象时,可经常利用已有的shared_ptr指针为其初始化。
Modern C++ 智能指针详解

4、互斥锁、可重入锁、读写锁与自旋锁

  • mutex 互斥量

mutex是睡眠等待类型的锁,当线程抢互斥锁失败的时候,线程会陷入休眠。优点就是节省CPU资源,缺点就是休眠唤醒会消耗一点时间。
依据同一线程是否能多次加锁,把互斥量又分为如下两类:
是:递归互斥量recursive mutex,也称可重入锁,reentrant lock
否:非递归互斥量non-recursive mutex,也称不可重入锁,non-reentrant mutex

  • read-write lock 读写锁

又称“共享-独占锁”,对于临界区区分读和写,读共享,写独占。
读写锁的特性:
当读写锁被加了写锁时,其他线程对该锁加读锁或者写锁都会阻塞。
当读写锁被加了读锁时,其他线程对该锁加写锁会阻塞,加读锁会成功。
适用于多读少写的场景。

  • spinlock 自旋锁

自旋,更通俗的一个词时“忙等待”(busy waiting)。最通俗的一个理解,其实就是死循环。
自旋锁不会引起线程休眠。当共享资源的状态不满足时,自旋锁会不停地循环检测状态(循环检测状态利用了CPU提供的原语Compare&Exchange来保证原子性)。因为不会陷入休眠,而是忙等待的方式也就不需要条件变量。不休眠就不会引起上下文切换,但是会比较浪费CPU。

题目:

  • 讲一下可重入锁?
  • 讲一下自旋锁?自旋锁循环检测状态的时候如何保证原子性?

3、QT信号与槽的原理?

  • Qt信号槽的调用流程

MOC查找头文件中的signal与slots,标记出信号槽。将信号槽信息储存到类静态变量staticMetaObject中,并按照声明的顺序进行存放,建立索引。
connect链接,将信号槽的索引信息放到一个双向链表中,彼此配对。
emit被调用,调用信号函数,且传递发送信号的对象指针,元对象指针,信号索引,参数列表到active函数。
active函数在双向链表中找到所有与信号对应的槽索引,根据槽索引找到槽函数,执行槽函数。

  • 信号槽的实现:元对象编译器MOC

元对象编译器MOC负责解析signals、slot、emit等标准C++不存在的关键字,以及处理Q_OBJECT、Q_PROPERTY、Q_INVOKABLE等相关的宏,生成moc_xxx.cpp的C++文件(使用黑魔法来变现语法糖)。比如信号函数只要声明、不需要自己写实现,就是在这个moc_xxx.cpp文件中自动生成的。

moc的本质就是反射器。

  • Qt信号槽的链接方式(connect的第五个参数)

Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。
Qt::DirectConnection:槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。这个在多线程环境下比较危险,可能会造成奔溃。
Qt::QueuedConnection:槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个。
Qt::BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。
Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接。

题目:

  • Qt connect的第五个参数(信号槽链接方式)?
  • Qt信号槽的调用流程?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

倒计时33天

1.L1-8 静静的推荐 - 2024团体程序设计天梯赛(历年真题)练习集 (pintia.cn) //碎碎念:主要还是理解题意吧,,为什么每一个字我都认识但合起来就看不懂了呢,,(・∀・(・∀・(・∀・*)&#xff0c…

【QT】重载的信号槽/槽函数做lambda表达式

重载的信号槽 函数指针: int fun(int a,long b) int (*funp)(int, long) fun; 实现回调函数就需要函数指针 信号重载 派生类槽函数发送两个信号 派生类给父类发两个信号 void (SubWidget::*mysigsub)() &SubWidget::sigSub;connect(&subw,mysigsub,t…

Linux命令高效的4个shell替代工具

文章目录 前言1.Top1.1 htop1.2 btop1.3 glances 2.df2.1 duf 3.ls3.1 eza 4.cat4.1 bat 前言 Unix系统发展了好多年了,不论是各开源发行版的linux还是封闭商业化的MacOS,上古流传的古董命令依旧在终端发挥着重要作用,但其实使用体验感觉还是…

2024年Android开发进阶课程,面试一路绿灯Offer拿到手软

职业生涯规划 Android系统的市场地位 Android程序开发的技能成长经验 Android程序员为什么需要学习Html5 Android软件工程师为什么不会被前端替代 为什么小程序无法替代原生开发 为什么Html5无法取代NativeAPP Html5在Android中的应用场景 如何成为一名合格的高级Android程序员…

C及C++每日练习(1)

一.选择&#xff1a; 1.以下for循环的执行次数是&#xff08;&#xff09; for(int x 0, y 0; (y 123) && (x < 4); x); A.是无限循环 B.循环次数不定 C.4次 D.3次 对于循环&#xff0c;其组成部分可以四个部分&#xff1a; for(初始化;循环进行条件;调整) …

【QA-SYSTEMS】CANTATA-解决Jenkins中build Cantata报错

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 解决Jenkins中build Cantata测试项目报找不到license server的错误。 2、 问题场景 在Jenkins中build Cantata测试项目&#xff0c;报错“Failed to figure out the license server correctly”。 3、软硬件环…

Numpy教程

文章目录 数组基础文件与字符串多项式分布实战 Numpy绝对可以说是支撑Python地位的最重要的包了&#xff0c;几乎所有能叫出名的Python计算库&#xff0c;都不可避免地调用了Numpy&#xff0c;Numpy官网也列出了一些&#xff0c;大致如下图这样&#xff0c;在科学计算领域&…

Android 13.0 kenel中修改rom系统内部存储的大小

1. 前言 在13.0的系统rom产品开发定制中,在对一些产品开发中的配置需求方面,由于在产品后续订单中,有些产品是出口的,但是硬件方面已经定板,时间比较仓促,所以 就需要软件方面在rom内部存储的大小方面作假,修改rom真实的大小容量,所以就需要在kenel驱动部分来修改这部分…

Spring事务管理与模板对象

1.事务管理 1.事务回顾 事务指数据库中多个操作合并在一起形成的操作序列 事务的作用 当数据库操作序列中个别操作失败时&#xff0c;提供一种方式使数据库状态恢复到正常状态&#xff08;A&#xff09;&#xff0c;保障数据库即使在异常状态下仍能保持数据一致性&#xff…

【探索AI】二十七-计算机视觉(二)图像处理基础

图像处理基础 概述 数字图像表示 数字图像是由像素&#xff08;Pixels&#xff09;组成的&#xff0c;每个像素都有一个或多个数值&#xff0c;这些数值代表了该像素在图像中的颜色和亮度信息。数字图像可以看作是一个二维数组&#xff0c;其中每个元素对应图像中的一个像素…

android开发教程百度网盘,高并发系统基础篇

展望未来 操作系统 移动操作系统的演变过程&#xff0c;从按键交互的塞班功能机到触摸屏交互的Android/IOS智能机&#xff0c;从小屏幕手机到全面屏、刘海屏、水滴屏。任何系统无非干两件事&#xff1a;输入和输出&#xff0c;接收到外部输入信号后经过操作系统处理后输出信息…

史称GPT-4最强劲敌——Claude 3 大模型它来了【附体验教程】

Anthropic 的 Claude 3 Sonnet 模型现已在亚马逊云科技的 Amazon Bedrock 正式可用。 Amazon Bedrock 是目前 第一个 也是 唯一 一个提供 Claude 3 Sonnet 的托管服务 。 Claude 3 免费测试体验者福利&#x1f9e7;&#xff1a;https://mp.weixin.qq.com/s/hszLRa8B5zKsTDg2bmI…

Java两周半速成之路(第七天)

一.多态 3.多态的好处: 提高了程序的维护性(由继承保证) 提高了程序的扩展性(由多态保证) 演示&#xff1a; package com.shujia.day08;public class Animal {String name;int age;public Animal() {}public Animal(String name, int age) {this.name name;this.age age…

【模拟电子电路--指南】

【模拟电路】 模拟电子电路--指南 ■ 模拟电子电路基础课程 ■ 模拟电子电路基础课程 巧学系列——模拟电路

小白优化Oracle的利器”sqltrpt.sql”脚本

SQL调优顾问是Oracle自带的一个功能强大的内部诊断工具&#xff0c;用于对性能不佳的SQL语句给出优化建议。但如果从命令行调用它比较麻烦&#xff0c;幸运的是&#xff0c;Oracle提供了一个方便的内置脚本“sqltrpt.sql”&#xff0c;简化了调用过程。 sqltrpt.sql脚本位于Or…

安装/升级 gcc

文章目录 查看当前 gcc 版本查看 yum 软件库 gcc 版本列表下载最新版本安装 查看当前 gcc 版本 查看 yum 软件库 gcc 版本列表 只有一个4.8的版本&#xff0c;过旧 下载最新版本 wget https://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.gz 安装 ./configure 报错 提示…

2024年Android开发者跳槽指南,超强Android进阶路线知识图谱

一、概述 随着业务的发展&#xff0c;工程的逐渐增大与开发人员增多&#xff0c;很多工程都走向了模块化、组件化、插件化道路&#xff0c;来方便大家的合作开发与降低业务之间的耦合度。现在就和大家谈谈模块化的交互问题&#xff0c;首先看下模块化的几个优势。 模块化的优…

国创证券|645元克!买还是不买?

近日世界金价继续走强。截至记者发稿&#xff0c;纽约商业交易所&#xff08;COMEX&#xff09;黄金主力4月合约突破2100美元/盎司关口&#xff1b;国内方面&#xff0c;SHFE黄金主力合约则摸高498元/克&#xff0c;迫临500元/克的关口。 巨丰投顾高级出资参谋游晓刚对《证券日…

替代TPS7B7701QPWPRQ1/TPS7B7702QPWPRQ1单/双通道 车规级LDO

PC8803具有高输入电压单低压差调节器&#xff08;PC8803SC01/PC8803SCO3&#xff09;/双通道低压差调节&#xff08;PC8803SC02/PC8803SC04&#xff09;&#xff0c;具有精确的电流感测&#xff0c;设计用于在宽输入电压范围内工作 从4.5V到40V。该设备具有45V负载转储电源输入…

微信小程序触屏事件_上划下划事件

一、微信小程序触屏事件 bindtouchstart&#xff1a;手指触摸动作开始 bindtouchmove&#xff1a;手指触摸后移动 bindend&#xff1a;手指触摸动作结束 属性类型说明touchesArray触摸事件&#xff0c;当前停留在屏幕中的触摸点信息的数组 Touch 对象 属性类型说明identi…