首页 > 编程知识 正文

net面试题,c语言面试题

时间:2023-05-05 12:00:24 阅读:145690 作者:2951

1 .基础知识1.Qt信号罐机制优势和不足优势:类型安全、松耦合。 缺点:与回调函数相比执行速度慢。

2 .使用静态和常数1 .使用静态:静态变量声明分为局部静态变量、全局静态变量和类静态成员变量。 可修饰的类成员函数。

局部变量:存储在静态存储中,在程序运行时只初始化一次。 范围仍然是本地范围,对于由变量定义的函数或语句块有效,并且在程序退出时操作系统会回收资源。

静态变量:存储在静态存储区中,静态存储区中的资源在程序结束并由系统回收之前,一直存在于程序运行中。 缺省情况下,未初始化的变量为0,范围在声明的文件中生效。

静态成员变量:由类的所有对象共享,包括子对象。 必须在类外初始化,不能在构造函数内初始化。

静态成员函数:所有对象共享此函数。 没有this指针。 此外,类中的非静态成员不可用。

2.const :常数声明,类常数函数声明。

常数和静态不能同时限定类成员函数。 常数限定成员函数表示无法修改对象的状态,静态限定成员函数表示该函数属于类,不属于对象,这是不一致的。 const表示限定变量时,不能修改变量,限定成员函数表示不能修改任何成员变量。 不好记(我觉得自己像JB,除了面试,在实际工作中完全没有遇到) :

constchar*p=newchar(a ) ) :表示p指示的内容是不可修改的,但p是可修改的。 *p='b '; //错误p=p2; //可以修改正确的指针

char*constp=newchar(a ) ) :表示p是不可修改的,但p指向的内容是可修改的。 *p='b '; //正确的p=p2; //错误

3 .指针与参照的异同指针:是一个变量,但此变量中保存了另一个变量的地址,可以通过访问此地址更改变量。

引用:是别名还是变量本身? 对引用执行的操作是对变量本身执行的操作。

相同点:两者都可以修改变量。

不同之处:指针可以不初始化,引用必须初始化。 指针可以有多个级别,但引用只有一个级别。 (int a不合法,int** p合法。 指针可以在初始化后更改,不能更改引用。 这意味着不能引用同一类型的另一个对象。 sizeof指针可以获得指针自身的大小,而sizeof引用可以获得变量自身的大小。 指针传递、值传递或引用传递的都是变量本身。

4 .如何理解多态性的定义:同一操作作用于不同的对象,产生不同的执行结果。 c多态性意味着调用虚拟成员函数时,会根据所调用类型对象的实际类型执行不同的操作。

实现:通过虚函数实现。 在virtual中声明的成员函数是虚函数,允许重写子类。 可以声明基类指针或引用指向不同子类的对象,然后调用相应的虚函数,以根据指针或引用指向的子类执行不同的操作。

重载:函数名称相同、参数类型和顺序不同的函数构成重载。

Override (重写) :派生类在virtual中声明以覆盖基类的成员函数。

Overwrite (隐藏) :派生类中的函数屏蔽与其同名的基类函数。 派生类函数与基类函数同名,但参数不同,基类函数不可见。 如果参数相同,基类中没有virtual关键字,则会隐藏基类函数。

5 .虚函数表多态性通过虚函数实现,虚函数主要通过虚函数表实现。 如果类包含虚函数,则该类包含虚函数表。 虚函数表中保存的各项是虚函数的地址。 此类中的每个对象都包含虚拟指针。 虚拟指针位于对象的实例地址的开头,以最大限度地提高虚拟函数表的性能。 需要指向虚拟函数表的指针。 注意:对象不包含虚函数表。 仅当需要指针时,类才包含虚函数表,派生类生成与基类兼容的虚函数表。

6 .常用数据结构1.vector :向量、连续存储、可随机访问。

2.deque )双向队列、连续存储和随机访问。

3.list :支持链表、内存不连续、随机访问。

4 .堆栈:堆栈、不可随机访问、只允许向重新开头添加/删除元素。

5 .队列:单向队列,尾部增加,前导删除。

6.set :集合、红黑树实现,可随机访问。 搜索、插入和删除时间的复杂度为o(logn )。

7.map :图片,红黑树实现,可随机访问。 搜索、插入和删除时间的复杂度为o(logn )。

8.hash_set :哈希表,随机访问。 检索、插入、删除时间复杂地读为o(1)。

7.TCP单次握手:要建立TCP连接,客户端服务端必须发送总共三个数据包以确认连接的建立。 在此过程中,客户端通过运行connect触发。 流程如下:

2.4请挥手。 断开一个Tcp连接时,客户端和服务器必须发送总共四个数据包以检查连接端口。 在套接字编程中,此过程是由客户端或服务端执行关闭操作触发的。 流程如下:

2.Qt多线程同步的几种实现方式(1)互斥量: QMutex QMutex

类提供的是线程之间的访问顺序化。QMutex的目的是保护一个对象/数据结构或者代码段在同一时间只有一个线程可以访问。基本使用方法如下:

QMutex mutex;int var;void function(){ mutex.lock(); // 访问var var * var; mutex.unlock();}

  如果使用mutex加锁,却没有使用unlock解锁,那么就会造成死锁,其他线程永远也得不到访问变量的机会,所以为了解决这个问题,Qt引入了QMutexLocker类,二者直接可以配合使用更加方便简洁,示例如下:

QMutex mutex;int var;void function(){ QMutextLocker locker(&mutex); // 访问var var * var;} (2)QReadWriteLock

  QMutex只允许某个时刻有一个线程对共享资源进行访问,如果需要多个线程对共享资源进行读访问,同时只有一个线程进行写访问,这种情况下就可以使用QReadWriteLock。QReadWriteLock主要实现多个线程读资源,一个线程写。写线程执行的时候会阻塞所有的读线程,而读线程之间的运行不需要进行同步。使用示例如下:

int var;QReadWriteLock lock;void function(){ lock.lockForRead(); int x = var; lock.unlock();}void function2(){ lock.lockForWrite(); var = 100; lock.unlock();}

 和QMutexLocker一样,Qt同样提供了QReadLocker和QWriteLocker。

int var;QReadWriteLock lock;void fun(){ QReadLocker(&lock); int x = var;}void fun2(){ QWriteLocker(&lock); var = 1000;}   (3)QSemaphore

  QSemaphore是QMutex的一般化,它可以保护一定数量的相同资源,而QMutex只能保护一个资源。信号量比互斥量具有更好的并发性,我们可以利用信号量实现生产者-消费者模式,如下所示:

const int dataSize = 100000;const int bufferSize = 1024;char buffer[bufferSize];QSemaphore freeBytes(bufferSize);QSemaphore usedButes;void Producer::run(){ for (int i = 0; i < dataSize; ++i) { freeBytes.acquire(); buffer[i % bufferSize] = i; usedBytes.release(); }}void Consumer::run(){ for (int i = 0; i < dataSize; ++i) { usedBytes.acquire(); qDebug() << buffer[i % bufferSize]; freeBytes.release(); }}   

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。