面试题 C/C++

笔试题:

  1. 显示输出,

    fun(int a,int &b,int *c,int *d)
    {
      a++;
      b++;
      (*c)++;
      d++
    }
    int a = 1;
    int b = 2;
    int c = 3;
    int d = 4;
    fun(a,b,&c,&d)
    //printf("%d,%d,%d,%d",a,b,c,d)
    

    结果: 1,3,4,4

  2. 显示输出

    void fun(int a[100])
    {
      cout << sizeof(a);
    }
    
    char * b = "abcd";
    cout << sizeof(b);
    
    int c = 1000;
    cout << sizeof(c);
    

    结果:4 4 4

  3. 写出一个类仅建立一个实例的情况的模式,类图,代码

    是单例模式

    一、什么是单例模式 只能创建出一个类对象(只有一个实际的实例)的叫做单例模式。

    注意:

    1. 单例类只能有一个实例。
    2. 单例类必须自己创建自己的唯一实例。
    3. 单例类必须给所有其他对象提供这一实例。

    从具体实现角度来讲就是三点:

    1. 单例模式的类只提供私有的构造函数。
    1. 类定义中含有一个该类的静态私有对象。
    1. 该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

    C++如何实现单例:

    1. 禁止类的外部创建类对象:构造函数设置成私有。
    2. 类自己维护一个唯一的对象:使用静态指针指向。
    3. 提供一个获取实例的方法:静态成员函数获取静态指针。

    二、为什么使用单例模式 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。

    三、单例模式的应用场景

    1. Window系统的任务管器
    1. Linux/Unix系统的日志系统
    1. 网站的访问计数器
    1. 服务端程序的连接池、线程池、数据池。

    四、饿汉模式 饿汉模式:将单例类的唯一实例对象定义为成员变量,当程序开始运行,实例对象就已经创建完成。

    优点:加载进行时静态创建单例对象,线程安全。 缺点:无论使用与否,总要创建,浪费内存。

    class Singleton
    {
    private:
    	Singleton(void) { }
    	static Singleton object;
    public:
    	static Singleton& get_object(void)
    	{
    		return object;	
    	}
    };
    
    Singleton Singleton::object;
    

    五、懒汉模式 用静态成员指针来指向单例类的唯一实例对象,只有真正调用获取实例对象的静态接口时,实例对象才被创建。

    优点:什么时用什么时候创建,节约内存。 缺点:在第一调用访问获取实例对象的静态接口才真正创建,如果在多线操作情况下有可能被创建出多个实例对象(虽然可能性很低),存在线程不安全问题。

    class Singleton
    {
    private:
    	Singleton(void) { }
    	static Singleton* objectp;
    public:
    	static Singleton& get_object(void)
    	{
    		if(NULL == objectp)
    		{
    			objectp = new Singleton;
    		}
    		return *objectp;
    	}
    };
    
    Singleton* Singleton:: objectp;
    

    六、加锁的懒汉模式 相对普通的懒汉模式加锁的懒汉模式能在多线程中很好的工作,但是,效率很低,加锁会影响效率,而且大部分情况下不需要加锁。

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    class Singleton
    {
    private:
    	Singleton(void) { }
    	static Singleton* objectp;
    public:
    	static Singleton& get_object(void)
    	{
    		if(NULL == objectp)
    		{
    			pthread_mutex_lock(&mutex);
    			objectp = new Singleton;
    			pthread_mutex_unlock(&mutex);
    		}
    		return *objectp;
    	}
    };
    
    Singleton* Singleton:: objectp;
    

    原文链接:https://blog.csdn.net/weixin_45372436/article/details/101158885

     

  4. 多态的作用

    1. 多态最直接的表现就是,创建子类对象可以使用父类接收,例如: 父类类型 f = new 子类类型();
    1. 能降低程序的耦合度,就是说,你写一个类不仅用一次,只能被某个类使用,而且,可以被不同的场景使用,只需要继承和重写就可以了
  5. if(0 == a){} 和 if(a == 0)哪个好

    前者更好,在将“==”错写为“=”时能及早发现

  6. 完成1+2+3...+n的计算的代码

    LeetCode题目: https://leetcode-cn.com/problems/qiu-12n-lcof/

  7. TCP三次握手的过程

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers) 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手. 握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers) 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.

  8. Windows动态链接库的使用方法

    Windows动态链接库DLL

    1. 什么是DLL DLL,即动态链接库,是包含若干个函数的库文件,可供其他程序运行时调用。
    1. DLL的优缺点 优点:代码重用,可供多个程序同时调用

      缺点:易发生版本冲突 当新版本的动态链接库不兼容旧版本时,其他使用该DLL的程序可能无法正常工作。 针对这一问题,我们需要在程序中加上一个manifest文件,指明该程序所使用的DLL版本号。 此时,程序将根据manifest加载指定版本的DLL,否则按默认版本加载。

    2. 关于LIB和DLL LIB,是静态链接库,分为静态lib和动态lib。 静态lib:包含函数代码声明和实现,编译后所有代码都嵌入到宿主程序中。不需要再另行调用DLL。 动态lib:相当于一个.h头文件,它是对实现部分(.DLL)的导出部分的声明。编译后宿主程序也只包括声明部分。运行时需调用相应的DLL文件。

      原文链接:https://www.cnblogs.com/endenvor/p/10268549.html

面试官题目:

  1. c++语言有什么特点

    C++是在C语言基础上进行扩展而来的一门面向对象的程序设计语言。相比其他语言,它具有很多优点和特点的,比如:在性能方面,C++代码被最终编译成本地机器码,可直接由CPU执行,相比Javascript,VBScript等由脚本引擎解析执行的脚本语言,或者Java这类生成中间代码再由虚拟机执行的语言,效率就高了很多。

  2. 是否了解过进程间通信

    1. 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

    2. 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

    3. 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

    4. 共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

    5. 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

    6. 套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

    7. 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

      原文链接:https://www.cnblogs.com/LUO77/p/5816326.html

       

  3. 单例模式,工厂模式具体是什么样的。

  4. gcc,g++编译过程

  5. c++11新特性

  6. STL平时用过哪些

  7. 在OpenCV的使用中怎么存储二维矩阵

  8. 是否使用或接触过CMake

posted @ 2020-06-24 13:35  SixSense  阅读(166)  评论(0编辑  收藏  举报