C++基础面试题及答案

C++

  1. C++ 和C的主要区别

    C语言是面向过程编程,C++是面向对象编程,C++ 完全兼容C

  2. C++有哪些特性,简述对他们的理解

    封装、继承、多态

    封装

    将的事物抽象成一个个集合(也就是所说的类),实现代码的模块化

    继承

    子类可以继承父类的方法,实现代码重用

    多态

    子类继承父类之后,父类指针指向子类对象,实现接口重用

  3. 引用和指针的区别

    1. 引用是变量的一个别名,内部实现是只读指针
    2. 引用只能在初始化时被赋值,其他时候值不能被改变,指针的值可以在任何时候被改变
    3. 引用不能为NULL,指针可以为NULL
    4. 引用变量内存单元保存的是被引用变量的地址
    5. “sizeof 引用" = 指向变量的大小 , "sizeof 指针"= 指针本身的大小
    6. 引用可以取地址操作,返回的是被引用变量本身所在的内存单元地址
    7. 引用使用在源代码级相当于普通的变量一样使用,做函数参数时,内部传递的实际是变量地址
  4. 重载和重写的区别

    重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

    重写:是指子类重新定义父类虚函数的方法。

  5. C++ deletedelete[]的区别

    delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数

  6. const#define 相比,有何优点?

    const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性

    const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误

  7. 关键字static的作用

    1. 可以用于全局变量的定义:为该变量分配静态存储区。程序运行结束前不会被释放。
    2. 声明和定义静态成员函数:表示该函数为静态函数,只能在本文件中被调用。
    3. 定义静态局部变量:只被初始化一次,只有程序运行结束才会释放。区别是作用域的范围

C++ - STL

  1. 使用过哪些STL容器

    vector,list,deque,map,multimap,set,multiset

  2. 使用过那些算法

    查找算法、排序算法、消除算法、计数算法、比较算法、变换算法、置换算法和容器管理等

Linux

  1. 使用过哪些linux命令

    文件管理命令 磁盘管理命令 网络通信命令 系统管理命令 备份压缩命令
    cat cd ifconfig ps bzip2
    cp ls iptables free gzip
    rm mkdir netstat kill tar
    find pwd ping yum unzip
  2. linux下多进程和多线程的区别

    线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。

    根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

    资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

    包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

    内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

    影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

    执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

  3. 进程间通信的方式有哪些

    管道

    共享内存

    套接字

    内存映射

    信号(一般不用,优先级太高容易打断程序正常执行,且携带信息量小)

QT

  1. 使用过哪些QT控件

    Widget

    dialog

    Box

    button

    ...

  2. 使用过哪些QT事件

    keyboard 键盘事件

    mouse 鼠标事件

    timer 定时器事件

    ...

  3. QT信号槽机制的优缺点

    优点

    1. QT信号槽机制的引用精简了程序员的代码量 (不用写回调函数)
    2. QT的信号可以对应多个槽(但他们的调用顺序随机),也可以多个槽映射一个信号
    3. QT的信号槽的建立和解除绑定十分自由

    缺点

    1. 信号槽同真正的回调函数比起来时间的耗损还是很大的,所有在嵌入式实时系统中应当慎用
    2. 信号槽的参数限定很多例如不能携带模板类参数,不能出现宏定义等等
  4. QT下UDPTCP的通信流程

    QT下udp通信服务器端和客户端的关系是对等的, 做的处理也是一样的

    1. 创建套接字对象
    2. 如果需要接收数据, 必须绑定端口
    3. 发送数据: writeDatagram
    4. 接收数据: readDatagram

    TCP

    服务器端:

    1. 创建用于监听的套接字
    2. 给套接字设置监听
    3. 如果有连接到来, 监听的套接字会发出信号newConnected
    4. 接收连接, 通过nextPendingConnection()函数, 返回一个QTcpSocket类型的套接字对象(用于通信)
    5. 使用用于通信的套接字对象通信
    6. 发送数据: write
    7. 接收数据: readAll/read

    客户端:

    1. 创建用于通信的套接字
    2. 连接服务器: connectToHost
    3. 连接成功与服务器通信
    4. 发送数据: write
    5. 接收数据: readAll/read

CODE

  1. 写出下列程序执行后的结果

    #include <iostream.h> 
    
    class A
    {
        virtual void g()
        {
            cout << "A::g" << endl;
        }
    private:
        virtual void f()
        {
            cout << "A::f" << endl;
        }
    };
    class B : public A
    {
        void g()
        {
            cout << "B::g" << endl;
        }
        virtual void h()
        {
            cout << "B::h" << endl;
        }
    };
    typedef void( *Fun )( void );
    void main()
    {
        B b;
        Fun pFun;
        for(int i = 0 ; i < 3; i++)
        {
            pFun = ( Fun )*( ( int* ) * ( int* )( &b ) + i );
            pFun();
        }
    }
    /*
    输出结果: 
    B::g 
    A::f 
    B::h
    */
    
  2. 写出下列程序执行后的结果

    #include <iostream.h> 
    
    main()
    {
        int x[]= {10, 20, 30, 40, 50 };
        int *p;
        p=x;
        cout << *(p+2) << endl;
    }
    /*
    运行结果为:
    30
    */
    
原文地址:https://www.cnblogs.com/Doyoung/p/13203034.html