C++必背面经

  • 一、 C++的理解,C和C++的区别。
  • 二、 Struct和class的区别
  • 三、 Strlen和sizeof的区别
  • 四、 面向对象的理解
  • 五、 C++内存分布
  • 六、 智能指针
  • 七、 构造函数
  • 八、 默认构造函数
  • 九、 拷贝构造函数
  • 十、 析构函数
  • 十一、 delete与析构函数的区别
  • 十二、 delete与delete[]的区别
  • 十三、 多态与虚函数
  • 十四、 虚函数与纯虚函数的区别
  • 十五、 虚继承
  • 十六、 this指针
  • 十七、 关键字extern
  • 十八、 关键字static
  • 十九、 关键字volatile
  • 二十、 内存对齐
  • 二十一、 指针、引用与数组
  • 二十二、 vector扩容
  • 二十三、 主机字节序
  • 二十四、 联合体Union
  • 二十五、 C++四种类型转换
  • 二十六、 Hash函数
  • 二十七、 海量数据问题

C语言推荐书籍:《C Primer Plus》、《C 和指针》、《C 专家编程》
C++推荐书籍:《C++ Primer》、《Effective C++》、《C++ 标准程序库》、《STL 源码剖析》《深度探索 C++ 对象模型》

一、 C++的理解,C和C++的区别。

  1. C++的概念
    C++是在C语言的基础上开发的一种面向对象的编程语言,应用广泛。C++支持面向过程、面向对象、泛型编程。编程领域广泛,常用于系统开发、引擎开发等领域,是最受程序员喜欢的编程语言之一,支持类、封装、继承、多态重载等特性。
  2. C和C++的区别
    1.、C是面向过程编程,C++支持多种编程范式,例如面向过程,面向对象,泛型编程(模板,STL标准库);
    2.、C和C++内存管理方式不同;
    3.、C++支持重载,C不支持重载;
    4.、C++支持指针和引用,C只支持指针。
  3. 面向过程
    C程序的设计重点在算法和数据结构,首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。
    优点:性能高。单片机,嵌入式和Unix/Linux等。
    缺点:没有面向对象易维护,易复用,易扩展。
  4. 面向对象
    C++是面向对象编程,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
    优点:易维护,易复用,易扩展。
    缺点:性能低。因为面向对象有封装、继承、多态等特性,可以设计出低耦合的系统,使得系统更加灵活易于维护

二、 Struct和class的区别

  1. Struct访问属性默认是public,而Class访问属性可以是public、protected和private;
  2. Class封装了行为和属性。

三、 Strlen和sizeof的区别

  1. Sizeof是运算符,用于计算声明后内存的大小,不是实际大小,可以用类型做参数。
  2. Strlen是函数,用于计算字符串的长度,不包含字符串的结束符’\0’,返回字符个数。参数只能是字符型。

四、 面向对象的理解

面向对象是一种对现实世界理解和抽象的方法、思想,通过将需求要素转化为对象进行问题处理的一种思想。面对对象有三大特性: 封装、继承和多态。

1、封装就是将一个事物的行为和属性抽象为一个类,隐藏实现细节,使得代码模块化。
2、继承则是进一步将一类事物共有的属性和行为抽象成一个父类,而每一个子类是一个特殊的父类,也有自己特有的行为和属性。继承的过程,就是从一般到特殊的过程。这样做扩展了已存在的代码块,进一步提高了代码的复用性。
3、多态是指相同的函数或过程,多种类型对象调用,得到的结果不一样。不同类型的对象,对于相同的消息,有不同的表现。多态是以封装和继承为基础的。多态就是允许父类引用(或接口)指向子类(或实现类)对象。很多的设计模式都是基于面向对象的多态性设计的。
• public 成员:可以被任意实体访问
• protected 成员:只允许被子类及本类的成员函数访问
• private 成员:只允许被本类的成员函数访问

五、 C++内存分布

  1. 内存管理
    内存结构
    内存管理
  2. 内存泄漏与野指针的区别

1、野指针是指向被释放的或者没有访问权限的内存的指针;
2、内存泄露(memory
lock)是指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况;
3、内存覆盖:(strcpy/stract/memcpy)

  1. 扩展
    常见的内存问题
    内存泄漏检测方法
  2. 内存泄漏检测
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
………._CrtDumpMemoryLeaks();
return 0;

六、 智能指针

动态内存管理中,经常会出现两种问题。一种是忘记释放内存导致内存泄漏。另一种是尚有指针引用内存的情况下就释放了内存就会产生非法引用内存问题。C++为了解决这个问题,引入了智能指针的概念。

  1. 智能指针的原理
    智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放。
  2. 常用的智能指针
    shared_ptr,共享指针是基于引用计数的智能指针。引用计数表示同时有多少个指针指向同一块内存。赋值、拷贝使得引用计数加一;析构使得引用计数减一,当内存的引用计数为0时,自动释放内存。
    缺点:循环引用问题会导致内存泄漏。循环引用:类型A中包含类型B的共享指针,类型B中拥有类型A的共享指针,当函数结束时,两个类型对象的引用计数不能递减到0,导致内存无法释放。
    1、构造函数中计数初始化为1;
    2、拷贝构造函数中计数值加1;
    3、赋值运算符中,左边的对象引用计数减一,右边的对象引用计数加一;
    4、析构函数中引用计数减一;
    5、在赋值运算符和析构函数中,如果减一后为0,则调用delete释放对象。
  3. share_prt与weak_ptr的区别
    weak_ptr,弱引用指针基于弱引用计数,和共享指针一起使用。增加一个弱引用,弱引用计数加一,引用计数不变。当弱引用计数和引用计数同时为零时,释放内存。
    unique_ptr拥有对对象的独有权,同一时刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)。当unique_ptr超出作用域时,自动销毁所指对象。

七、 构造函数

  1. 构造函数的特点:函数名和类名相同,在创建对象时初始化成员变量。构造函数可以重载。只有参数列表,没有返回值。
  2. 四种构造函数:默认构造函数、无参构造函数、重载构造函数、拷贝构造函数
  3. 构造函数两个执行阶段:
    1、初始化阶段,所有类类型的成员都会在初始化阶段初始化,即使该成员没有出现在构造函数的初始化列表中。
    2、计算阶段,执行构造函数体内的赋值操作。【已经完成初始化】
  4. 初始化列表:以冒号开头,后接一系列以逗号分隔的初始化字段。
    1、底层效率问题:
    使用初始化列表可以提高程序效率,对于基础类型而言没有差别,对于自定义类型而言,使用初始化列表可以少调用一次默认构造函数。
    原因:因为构造函数初始化类成员变量时,首先调用默认构造函数,在通过拷贝构造函数进行赋值;初始化列表直接调用拷贝构造函数进行赋值,少调用了默认构造函数。
    2、必须使用初始化列表的两种情况
    1)const和引用成员变量:只能被初始化,不能赋值。
    没有默认构造函数的成员类对象:不必调用默认构造函数进行初始化,直接调用拷贝构造函数进行赋值。
    2)成员变量的初始化顺序
    成员变量的初始化顺序按照类中的声明顺序,而不是按照初始化列表的顺序。
  5. 初始化时构造函数的调用顺序:
    1、虚基类的构造函数按照继承顺序调用
    2、非虚基类的构造函数按照继承顺序调用
    3、成员类对象的构造函数按照声明顺序调用
    4、本类的构造函数;
  6. 构造函数的执行:
    1、在派生类构造函数中,虚基类及上一层基类的构造函数调用;
    2、对象的vptr虚指针初始化;
    3、如果有初始化列表,在构造函数中展开;
    4、执行程序员定义的代码。
  7. 构造函数不能是虚函数:
    因为虚指针的初始化和虚表的创建是在构造函数中完成的。先执行构造函数,再创建虚指针和虚函数表,假设构造函数是虚函数,构造函数的调用依赖于虚指针和虚函数表创建,出现矛盾。

八、 默认构造函数

当类中没有显示的定义构造函数,编译器会自动生成一个无参默认构造函数;默认构造函数又分为无用(trivival)构造函数和有用(non-trivival)构造函数。其中无用构造函数不进行初始化,有用构造函数进行初始化。

生成有用默认构造函数的四种情况:

  1. 类中含有包含有用默认构造函数的成员类对象
    编译器就会为我们的类产生nontrivial default constructor. 因为,编译需要显示调用这个类成员对象的nontrivial default constructor. 编译器合成的nontrivial default constructor仅仅调用类成员对象的默认构造函数,而不对我们类里面的其它变量做任何初始化操作。
  2. 派生类的基类中含有有用默认构造函数.
    派生类合成时需要显示的调用基类的默认构造函数。
  3. 如果一个类中隐式的含有虚函数表或者虚函数指针
    虚函数表或虚函数指针需要编译器隐式的合成,合成的动作方法用到了默认构造函数。
  4. 如果一个类虚继承于其他类
    虚基类需要虚函数表和虚指针管理。

九、 拷贝构造函数

类成员变量中有指针类型,且存在动态内存分配时,需要定义拷贝构造函数;拷贝构造函数的参数为类对象自身的引用,否则会陷入无休止的递归。

  1. 浅拷贝与深拷贝
    对于类对象而言,浅拷贝是指只对对象中的数据成员进行简单的赋值,对于指针型变量,只复制指针本身,不复制指针所指向的内容,导致了两个指针指向同一块内存空间,引出了浅拷贝的问题。系统默认的拷贝构造函数就是浅拷贝方式。
    浅拷贝会导致严重的后果:
    1、两个指针A、B指向同一块内存,A指针对内容的修改,会影响B指针。
    2、两次析构对象,会造成同一块内存空间被释放两次必然导致奔溃。
    为了解决浅拷贝的问题,提出了深拷贝的拷贝方式。即在拷贝指针类型变量时,同时分配内存空间存储拷贝的内容,这样就避免了两个指针指向同一块内存的问题。
  2. 何时调用拷贝构造函数
    1、一个对象初始化另一个对象:A a1 = a2;
    2、一个对象以值传递的方式传入函数参数: A a1(a2);
    3、类对象作为函数返回值。

十、 析构函数

析构函数的特点:没有返回值和参数,不能重载,构造函数可以重载。
析构函数什么时候设置为虚函数?
当用派生类对象初始化基类指针时需要将析构函数设置为虚函数,否则在对象消亡时只调用了基类的析构函数,没有调用派生类的析构函数,导致内存泄漏。

十一、 delete与析构函数的区别

  1. 调用析构函数。析构函数用于释放类内部动态分配的内存。
  2. 释放对象空间

十二、 delete与delete[]的区别

1. delete用于释放单个对象指针指向的内存
2. delete[]用于释放对象数组指针指针的内存。

delete释放对象数组会导致内存泄漏,因为只调用了一次析构函数。delete[]首先会获取对象个数,然后调用析构函数。对象数组内存空间的后四个字节用于存储对象个数,
A* p = new A[10];
delete[] p;
执行这两条语句的时候实际上调用operator new分配大小为10*sizeof(Array)+4空间,其中多的四个字节空间用于存放N(10)这个数字以便于delete中调用析构函数析构对象(调用析构函数的次数),空间申请好了之后调用构造函数创建对象。delete[] p执行的时候首先取N(10)对象个数,然后调用析构函数析构对象,最后用operator delete[]函数释放空间。

十三、 多态与虚函数

C++多态性分为静态多态和动态多态。函数重载和运算符重载实现的多态属于静态多态(在编译时就已确定函数类型),动态多态性是通过虚函数实现的(在运行时才确定调用的是哪个函数)。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。虚函数的调用本质上是由虚函数指针和虚函数表决定的。
一个类若存在虚函数,那么编译器就会为这个类生成一个虚表,在虚表里存放的是这个类所有虚函数的地址。当生成类对象的时候,编译器会自动得将类对象的前四个字节设置为虚表的地址,而这四个字节就可以看作是一个指向虚表的指针。虚表里依次存放的是虚函数的地址,每个虚函数的地址占4个字节。

虚表存放地址:类对象的首地址是虚函数指针地址,其次是变量地址

  1. 虚函数表是全局共享的元素,即全局仅有一个.是所有对象共有的。
  2. 虚函数表类似一个数组,类对象中存储vptr指针,指向虚函数表.即虚函数表不是函数,不是程序代码,不可能存储在代码段.
  3. 虚函数表存储虚函数的地址,即虚函数表的元素是指向类成员函数的指针,而类中虚函数的个数在编译时期可以确定,即虚函数表的大小可以确定,即大小是在编译时期确定的,不必动态分配内存空间存储虚函数表,所以不再堆中.
    根据以上特征,虚函数表类似于类中静态成员变量存储于全局变量区
    虚指针:对于虚函数调用来说,每一个对象内部都有一个虚表指针,该虚表指针被初始化为本类的虚表。

虚函数的调用关系:this -> vptr -> vtable ->virtual function

十四、 虚函数与纯虚函数的区别

虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),不能生成对象。因为抽象类包含纯虚函数,纯虚函数在基类(base class)只有声明而没有定义,所以虚函数表不健全,不能实例化。在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义。
虚函数的定义形式:virtual{method body};
纯虚函数的定义形式:virtual {} = 0;
虚函数表的创建和初始化在构造函数中完成。

十五、 虚继承

在多重继承中,存在从不同路径继承同一基类的问题,导致子类中存在多分拷贝,引发两个问题。

  1. 存储空间浪费
  2. 二义性问题
    基类对象在派生类中存在多份拷贝,当基类指针引用派生类中的基类对象时,就会发生二义性问题。
    为了解决上述问题,提出了虚继承。虚继承的实现原理和编译器有关,一般都是由虚基类指针和虚基类表实现的。虚基类指针指向虚基类表,虚基类表存储了虚基类相对于本类的偏移地址。

虚继承下的内存模型
虚继承与虚函数
实现机制都是通过虚指针和虚表完成的。虚指针占用类对象的存储空间,虚表不占用类对象的存储空间(全局变量区),虚函数不占用类对象的存储空间,虚基类在子类中有拷贝,占用存储空间。

十六、 this指针

this指针是存在于类成员函数中,指向类对象的指针。This是一个关键字,同时是一个常量指针。
成员函数调用时,传递了一个隐含的参数,指向了函数所在类对象的地址。

十七、 关键字extern

  1. 修饰变量:变量声明,表明变量在此处引用,在其他源文件中定义。
  2. 修饰函数:表明函数在其他源文件中定义。
  3. extern “C”:编译器用C的命名规范去编译函数,链接器用C的命名规范进行链接。因为C++支持函数重载,而C不支持。

十八、 关键字static

  1. 修饰变量
    修改了变量的作用域和生命周期,存储在静态区域。生命周期和程序相同,作用域分为全局变量和局部变量。局部变量仅在函数内可用,全局变量仅在当前源文件中可用。
  2. 修饰函数
    表明函数的作用域仅在当前源文件中。
  3. 修饰成员变量
    静态成员变量为全局类对象所共享,仅有一份拷贝。类中声明,类外定义和初始化。
  4. 修饰成员函数
    静态成员函数为全局类对象所共享。没有this指针,仅能访问静态成员变量和函数,虚函数不能为静态成员函数。【虚函数运行时绑定,静态成员函数编译时绑定】

十九、 关键字volatile

作用:防止编译器优化将变量装入寄存器。
CPU访问寄存器的速度很快。编译器优化会将常量装入寄存器中。

二十、 内存对齐

内存对齐就是变量在内存中的存储地址与自身数据类型的大小有关。
平台原因:不是所有的硬件都能访问任意地址的任意数据,某些硬件平台只能在某些地址访问特定类型的数据,否则就抛出异常。
性能原因:未对齐的内存,CPU需要进行两次内存访问;对齐的内存,CPU只需一次访问。

内存对齐的规则:

  1. 结构体中每个成员变量相对于起始位置的偏移量是该变量类型大小的整数倍。
  2. 结构体整体的大小是结构体中变量类型最大值的整数倍。
  3. 嵌套结构体的第一个成员变量的偏移量是结构体中变量类型最大值的整数倍。
    默认对齐大小与变量数据类型取最小
    #pragma pack(n)

内存对齐底层解释
内存对齐面试
内存对齐案例

二十一、 指针、引用与数组

  1. 指针与引用
    1、 指针是一个实体,需要分配内存空间。引用只是变量的别名,不需要分配内存空间。【引用本身占用空间,引用所指向的对象不再分配空间】
    2、 引用在定义的时候必须进行初始化,并且不能够改变。指针在定义的时候不一定要初始化,并且指向的空间可变。
    3、 引用访问一个变量是直接访问,而指针访问一个变量是间接访问。
    4、 引用底层是通过指针实现的
    指针和引用的自增运算结果不一样。(指针是指向下一个空间,引用是引用的变量值加 1);sizeof 引用得到的是所指向的变量(对象)的大小,而 sizeof 指针得到的是指针本身的大小;作为参数时也不同,传指针的实质是传值,传递的值是指针的地址;传引用的实质是传地址,传递的是变量的地址。【指针值传递是因为对指针自身的操作不会改变指针指向的内容】
  2. 指针与数组
    1、数组里的数据可以单个修改,但指针的不行
    char str[] = “hello”,数组的大小有6个字符(注意\0),可以通过str[0] = 'X’修改了的个字符,
    而指针char *p = “Word”,p是指向了一串常量的字符串,常量字符串是不可修改的,如 p[0] = ‘X’,编译器编译时不会保存,但执行时会出错.
    2、注意当数组作为函数的参数进行传递时,
    该数组自动退化为同类型的指针,不论数组a的容量是多少,sizeof(a)始终等于sizeof(char *)。

二十二、 vector扩容

二十三、 主机字节序

大端模式:高字节存储在低地址中,低字节存储在高地址中。
小端模式:高字节存储在高地址中,低字节存储在低地址中。

二十四、 联合体Union

联合体是一种节省空间的特殊的类,联合体中可以有多个数据成员,但同一时刻只有一个数据成员有效。当某个数据成员赋值后,其他成员为未定义状态。
Union可以用来测试CPU的大小端模式。

二十五、 C++四种类型转换

转换类型操作符 作用
const_cast 去掉类型的const或volatile属性
static_cast 无条件转换,静态类型转换。基本数据类型转换
dynamic_cast 有条件转换,动态类型转换,运行时检查类型安全(失败返回NULL),多态类之间的类型转换
reinterpret_cast 仅重新解释类型,但没有进行二进制的转换。常用于不同指针类型转换

类型转换详解

二十六、 Hash函数

Hash函数:将任意长度的输入映射为固定长度的输出
五大特点:

1、输入无穷
2、输出有限
3、相同输入,相同输出
4、不同输入,输出可能相同
5、散列性:当输入样本量足够大时,返回值会在输出域上均匀分布。

哈希函数

  1. 直接定址法:哈希函数为线性函数,缺点是浪费空间。
  2. 除留余数法:哈希函数取关键字被不大于哈希表长度的m整除得到的余数作为地址。空间利用率高,但是容易发生冲突。

Hash冲突避免

  1. 开放地址法:以冲突地址为基准,通过寻址的方式寻找下一个地址,直到不冲突为止。
    1、线性探查:以冲突地址为基准,顺序查找下一个地址。
    2、二次探查:以冲突地址为基准,左右跳跃式查找下一个地址。
    3、伪随机探测:以冲突地址为基准,加上一个随机数作为下一个地址。
  2. 再哈希法:同时构造多个哈希函数,发生冲突后,用另一个哈希函数再计算一个地址。
  3. 拉链法:用链表存储发生冲突的值。HashMap、HashSet等。
    一、 优点:原理简单,动态分配空间,易于插入、删除操作,结点规模较大时更节省空间。
    缺点:指针需要额外的空间,当结点规模较小时,开放地址法更节省空间。
  4. 建立一个公共溢出表。

二十七、 海量数据问题

  1. 海量数据
  2. 海量数据重复问题
    1、 利用哈希函数将海量数据分发给每一台机器。
    2、 在每一台机器上还可以继续分流,进行并行处理。

【实习秋招篇之C++面经】相关推荐

  1. 双非渣本的实习秋招路

    大家好,我是阿豪,双非渣本菜鸡一枚,没颜值,没技术,没存款,没对象........ 步入正题: 生活篇: 刚开始,我是在亲戚家住,距离公司比较远,每天上下班都要坐一个多小时的地铁,早上六点多起床,洗漱 ...

  2. 海康威视2019年校园招聘内推码(2019届春招、2020届实习/秋招)

    官宣拥有内推码的同学,同等条件择优录取,在每一个环节都会更加具有优势 海康威视2019年校园招聘内推码(2019届春招.2020届实习/秋招): 5S3QAI (最好复制内推码,不要写错了,写错了可能 ...

  3. 实习秋招linux和网络编程知识点总结

    实习/秋招时按自己需求总结的知识点,内容并不十分详细,建议选择性阅读. 部分图片已失效. git常用命令速查表 git回滚 https://www.jianshu.com/p/f7451177476a ...

  4. 实习秋招C++知识点总结

    实习/秋招时按自己需求总结的知识点,内容并不十分详细,建议选择性阅读. C++基础 如何在main函数之前调用函数 C语言,采用__attribute__关键字,void f()attribute(( ...

  5. 我的2018春招实习+秋招总结【前端开发】

    双非本科,通信工程,算是转到IT行业这边的了.从大二暑期正式开始学习前端,想想已经一年的时间了.期间经历了很多,从迷惘到清晰,从艰难自学到找到实习,从备战秋招到找到工作.能经历的我都经历过了.来说说那 ...

  6. 【前端春招】前端春招实习+秋招心路历程

    想写这篇由来已久了,大抵是自己比较懒惰,所以拖了这么久,从2021的3月份决定走前端然后春招开始,一直在白嫖面经帖子并受益良多,面经帖子很多,但是关于感受感想和一些经历的思考帖子不太多,在春招面试的路 ...

  7. 2018互联网实习秋招回顾(BATM+MS+Intel+NE+DJI)

    先介绍本人在2018年的暑期实习和秋招拿到的offer: 实习:阿里(c++后台研发),微软(c++后台开发),网易游戏(基础架构研发),大疆(测试开发),地平线(嵌入式软件开发),微策略(c++后台 ...

  8. 中科大软件学院硕士:实习秋招百多轮面试总结(上)

    大家好,我是对白. 今天给大家介绍一位我的朋友,他是中科大软件学院的硕士,在去年秋招中斩获了多个互联网大厂的offer,后来他将自己从实习到秋招参加的一百多轮面试进行了总结,希望对即将找工作的大家有所 ...

  9. 校招(春招实习 + 秋招)总结感想

    感谢 感谢Cyc2018, 感谢JavaGuide, 感谢其他给予我帮助的博主 春招 春招投递的基本都是大公司,网申投递了大概50+家公司,四月份拿到了兴业数金的实习offer, 五月份拿到了学而思的 ...

最新文章

  1. java 底层方法_底层方法测试--【Java】
  2. java initcause_initCause()是什么意思
  3. python爬取百度图片(用于深度学习中数据集的收集)
  4. 使用docker-compose配置redis服务
  5. koding.com 使用putty
  6. hihoCoder #1639 图书馆
  7. 如何使用加密的Payload来识别并利用SQL注入漏洞
  8. 全屏显示的包含webview的页面中弹出的软键盘覆盖输入框的问题
  9. SkipList和java中ConcurrentSkipListMap的实现
  10. poj 3074(DLX)
  11. python库手册(官方)python文档
  12. 详解线上线下收单业务(1)
  13. 01-msm8953 单独编译bootloader、kernel和system,以及采用adb fastboot下载镜像的方法
  14. ecmascript2015
  15. JAVA毕业设计健身房信息管理系统计算机源码+lw文档+系统+调试部署+数据库
  16. 大数据的应用场景都有哪些(农业篇)
  17. Tomcat设置登录账号密码
  18. Ada 程序设计语言(The Ada Programming Language)[第一集]
  19. php将文本文件中的内容呈现到一个表格中
  20. 欧洲之星Fotona 4D是什么,欧洲之星Fotona 4和热玛吉哪个好

热门文章

  1. WT2003S MP3解码芯片 语音芯片 KT403A VS1003替代
  2. NanoPi NEO Air内EMMC系统克隆至全新的SD卡
  3. TDSQL | TXSQL 数据库内核与特性
  4. oracle12清理内存,ORACLE 12.1 内存消耗完宕机
  5. 使用adb命令批处理安装卸载apk
  6. 如何卸载Ulead VideoStudio 10 (绘声绘影)
  7. html的flash怎么放大缩小,在flash里怎么设置flash右键不出现放大缩小
  8. 预约中,2022京东云产业融合新品发布会线上开启
  9. 如何发现我所爱?如何做我所爱?
  10. 该如何才能更快且有效的学习?