zoukankan      html  css  js  c++  java
  • C++一些知识的整理

    1. C 和 C++ 区别

    C++支持多种编程范式:面向对象编程、泛型编程、过程化编程。支持类、封装、重载等特性。

    c和c++的头文件不同。

    输入输出不同。

    变量的声明定义不同:c语言:变量要放在语句之前定义,否则会报错  c++:变量随用随定义,方便灵巧。

    命名空间:c++:有命名空间:using namespace std(可以防止函数出现相同的情况)。

    兼容性:c++兼容c语言,可以用extern C。

    封装:

    封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。

    封装的意义在于保护或者防止代码(数据)被我们无意中破坏。

    继承:

    继承主要实现重用代码,节省开发时间。

    子类可以继承父类的一些东西。

    多态

    多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

    2. const 有什么用途

        主要有三点:

          1:定义只读变量,即常量 

          2:修饰函数的参数和函数的返回值 

          3: 修饰函数的定义体,这里的函数为类的成员函数,被const修饰的成员函数代表不修改成员变量的值

     

    3. 指针和引用的区别

        1:引用是变量的一个别名,内部实现是只读指针

        2:引用只能在初始化时被赋值,其他时候值不能被改变,指针的值可以在任何时候被改变

        3:引用不能为NULL,指针可以为NULL

        4:引用变量内存单元保存的是被引用变量的地址

        5:“sizeof 引用" = 指向变量的大小 , "sizeof 指针"= 指针本身的大小

        6:引用可以取地址操作,返回的是被引用变量本身所在的内存单元地址

        7:引用使用在源代码级相当于普通的变量一样使用,做函数参数时,内部传递的实际是变量地址

     

    4. C++中有了malloc / free , 为什么还需要 new / delete     

    • malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
    • 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
    • 因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

    5. 编写类String 的构造函数,析构函数,拷贝构造函数和赋值函数

     

    6. 多态的实现

    (1)静态多态(重载,模板)

    是在编译的时候,就确定调用函数的类型。

    (2)动态多态(覆盖,虚函数实现)

    运行的时候,才确定调用的是哪个函数,动态绑定。运行基类指针指向派生类的对象,并调用派生类的函数。

    虚函数实现原理:虚函数表和虚函数指针。

    纯虚函数: virtual int fun() = 0;

    多态的几种方式

    7. 设计模式举几个例子:

    设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

    单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    适用于:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时;当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

    工厂模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

    适用于:当一个类不知道它所必须创建的对象的类的时候;当一个类希望由它的子类来指定它所创建的对象的时候;当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

     

    8. 堆和栈的区别   

    一个由c/C++编译的程序占用的内存分为以下几个部分

    1、栈区(stack)― 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

    2、堆区(heap) ― 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。 注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

    3、全局区(静态区)(static)―,全局变量和静态变量的存储是放在一块的, 初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后有系统释放

    4、文字常量区 ―常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区―存放函数体的二进制代码。

     

    1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;

    2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

    9. STL库

    容器分为两类:序列式容器和关联式容器。

    序列式容器,其中的元素不一定有序,但都可以被排序。如:vector、list、deque、stack、queue、heap、priority_queue、slist;

    关联式容器,内部结构基本上是一颗平衡二叉树。所谓关联,指每个元素都有一个键值和一个实值,元素按照一定的规则存放。如:RB-tree、set、map、multiset、multimap、hashtable、hash_set、hash_map、hash_multiset、hash_multimap。

    举例:

    vector:它是一个动态分配存储空间的容器。区别于c++中的array,array分配的空间是静态的,分配之后不能被改变,而vector会自动重分配(扩展)空间。

    set:其内部元素会根据元素的键值自动被排序。区别于map,它的键值就是实值,而map可以同时拥有不同的键值和实值。

    算法,如排序,复制……以及个容器特定的算法。这点不用过多介绍,主要看下面迭代器的内容。

    迭代器是STL的精髓,我们这样描述它:迭代器提供了一种方法,使它能够按照顺序访问某个容器所含的各个元素,但无需暴露该容器的内部结构。它将容器和算法分开,好让这二者独立设计。

    C++字符串操作详解(整理)

    C++中数组与STL中vector和array的比较

    标准C++中的string类的用法总结

    STL之vector的用法

    10. 关键字static的作用

        1.  函数体内 static 变量的作用范围为该函数体,不同于 auto 变量, 该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值

        2.  在模块内的 static 全局变量可以被模块内所有函数访问,但不能被模块外其他函数访问

        3.  在模块内的static 函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内

        4.  在类的static 成员变量属于整个类所拥有,对类的所以对象只有一份拷贝

        5.  在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的 static 成员变量

        介绍它最重要的一条:隐藏。(static函数,static变量均可) --> 对应上面的2、3项,当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

    参考链接:static类成员,static类成员函数

            

    11. 在c++程序中调用被C编译器编译后的函数,为什么要加extern“C”

         C++语言支持函数重载,C语言不支持函数重载,函数被C++编译器编译后在库中的名字与C语言的不同,

          假设某个函数原型为:

    1.           void foo(int x, inty);
        该函数被C编译器编译后在库中的名字为:  _foo
        而C++编译器则会产生像: _foo_int_int   之类的名字。
        为了解决此类名字匹配的问题,C++提供了C链接交换指定符号 extern "C"。

     

    12. 什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?你通常采用哪些方法来避免和减少这类错误?

    用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元即为内存泄露。

    使用的时候要记得指针的长度。

    malloc的时候得确定在那里free.

    对指针赋值的时候应该注意被赋值指针需要不需要释放.

    动态分配内存的指针最好不要再次赋值.

    13. 线程和进程的联系和区别

          http://blog.csdn.NET/wolenski/article/details/7969908

     

    14. 线程有哪几种状态

         http://blog.csdn.Net/wolenski/article/details/7969908

     

    15. 进程间的通信方式

         管道、有名管道、信号、共享内存、消息队列、信号量、套接字、文件.

     

    16. 线程同步和线程互斥的区别

        http://blog.csdn.net/wolenski/article/details/7969908

     

    17. 线程同步的方式

         Linux:   互斥锁、条件变量和信号量

         http://blog.csdn.net/zsf8701/article/details/7844316

     

    18. 网络七层

        

    19. TCP和UDP有什么区别

         TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。

                     当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。

                     TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

         UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。

                     UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。

                     由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快

     

    20. 编写socket套接字的步骤

     

    21. TCP三次握手和四次挥手, 以及各个状态的作用

         http://hi.baidu.com/suxinpingtao51/item/be5f71b3a907dbef4ec7fd0e?qq-pf-to=pcqq.c2c

    22. HTTP协议

                http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,

         HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。

        TCP 和 HTTP区别: http://blog.csdn.net/lemonxuexue/article/details/4485877

    23. 使用过的 shell 命令

           cp , mv , rm , mkdir , touch , pwd , cd  , ls , top , cat , tail , less , df , du , man , find , kill , sudo , cat 

     

    24. 使用过的 vim 命令

           wq!, dd , dw , yy , p , i , %s/old/new/g , /abc 向后搜索字符串abc , ?abc向前搜索字符串abc

     

    25. 使用过的 gdb 命令

          http://blog.csdn.net/dadalan/article/details/3758025

     

    26. 常见算法

           快速排序、堆排序和归并排序

           堆排序 : http://blog.csdn.net/xiaoxiaoxuewen/article/details/7570621

           快速排序、归并排序: http://blog.csdn.net/morewindows/article/details/6684558

           稳定性分析 http://baike.baidu.com/link?url=ueoZ3sNIOvMNPrdCKbd8mhfebC85B4nRc-7hPEJWi-hFo5ROyWH2Pxs9RtvLFRJL

    选择、冒泡、快速、希尔、归并、堆排等。

    1.快排:是冒泡排序的一种改进。

    优点:快,数据移动少

    缺点:稳定性不足

    2.归并:分治法排序,稳定的排序算法,一般用于对总体无序,但局部有序的数列。

    优点:效率高O(n),稳定

    缺点:比较占用内存

    27. 同步IO和异步IO的区别?

    A. 同步

    所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。

    按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等)。

    但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。

    最常见的例子就是 SendMessage。

    该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。

    当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者。

    B. 异步

    异步的概念和同步相对。

    当一个异步过程调用发出后,调用者不会立刻得到结果。

    实际处理这个调用的部件是在调用发出后,通过状态、通知来通知调用者,或通过回调函数处理这个调用。

     

    28. C库函数实现

     

    29. 静态链表和动态链表的区别

          http://blog.csdn.net/toonny1985/article/details/4868786

    30. 大并发( epoll )

           优点:

                 http://blog.csdn.net/sunyurun/article/details/8194979

           实例:

                 http://www.cnblogs.com/ggjucheng/archive/2012/01/17/2324974.html

           

    31. 海量数据处理的知识点,(hash表, hash统计)

        hash表: http://hi.baidu.com/05104106/item/62736054402852c09e26679b

        海量数据处理方法: http://blog.csdn.net/v_july_v/article/details/7382693

     

    32. 构造函数可以是虚函数吗?

    所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错.
    ------
    子类继承了父类的public方法以后,当然可以在public中添加新的方法和属性(属性一般放在private或者protect里面),这是继承的基本用法哦 

    33. 什么时候要用虚析构函数

           通过基类的指针来删除派生类的对象时,基类的析构函数应该是虚的。否则其删除效果将无法实现。

           一般情况下,这样的删除只能够删除基类对象,而不能删除子类对象,形成了删除一半形象,从而千万内存泄漏。

          原因:

                  在公有继承中,基类对派生类及其对象的操作,只能影响到那些从基类继承下来的成员。

                  如果想要用基类对非继承成员进行操作,则要把基类的这个操作(函数)定义为虚函数。
                  那么,析构函数自然也应该如此:如果它想析构子类中的重新定义或新的成员及对象,当然也应该声明为虚的。

          注意:

          如果不需要基类对派生类及对象进行操作,则不能定义虚函数(包括虚析构函数),因为这样会增加内存开销。

    34. c++怎样让返回对象的函数不调用拷贝构造函数

        拷贝构造函数前加 “explicit” 关键字。

    参考:https://blog.csdn.net/qq_35524916/article/details/58178072

    35. 孤儿进程和僵尸进程

       http://www.cnblogs.com/Anker/p/3271773.html

    36. C++中delete和delete[]的区别

    基本数据类型没有析构函数,所以回收基本类型组成的数组空间用delete和delete[]都是可以的;对于自定义来对象数组,只能用delete[]才能调用所有析构函数,如果是new 的是单个对象,只用delete。

    https://blog.csdn.net/vincentlmeng/article/details/72817258

    37. C++中operator关键字(重载操作符)

    https://www.cnblogs.com/wangduo/p/5561922.html

     

    38. 智能指针的几种常用方法?

  • 相关阅读:
    Java Web 网络留言板2 JDBC数据源 (连接池技术)
    Java Web 网络留言板3 CommonsDbUtils
    Java Web ConnectionPool (连接池技术)
    Java Web 网络留言板
    Java Web JDBC数据源
    Java Web CommonsUtils (数据库连接方法)
    Servlet 起源
    Hibernate EntityManager
    Hibernate Annotation (Hibernate 注解)
    wpf控件设计时支持(1)
  • 原文地址:https://www.cnblogs.com/AndrewYin/p/9213594.html
Copyright © 2011-2022 走看看