一.C++基础

1.C++虚函数

虚函数的实现是由两个部分组成的,虚函数指针与虚函数表。

1.1虚函数指针

虚函数指针 (virtual function pointer) 从本质上来说就只是一个指向函数的指针。它指向用户所定义的虚函数,具体是在子类里的实现,当子类调用虚函数的时候,实际上是通过调用该虚函数指针从而找到接口。

虚函数指针是确实存在的数据类型,在一个被实例化的对象中,它总是被存放在该对象的地址首位,这种做法的目的是为了保证运行的快速性。与对象的成员不同,虚函数指针对外部是完全不可见的,除非通过直接访问地址的做法或者在DEBUG模式中,否则它是不可见的也不能被外界调用。只有拥有虚函数的类才会拥有虚函数指针,每一个虚函数也都会对应一个虚函数指针。所以拥有虚函数的类的所有对象都会因为虚函数产生额外的开销,并且也会在一定程度上降低程序速度。与JAVA不同,C++将是否使用虚函数这一权利交给了开发者。

1.2虚函数表

每个类的实例化对象都会拥有虚函数指针并且都排列在对象的地址首部。而它们也都是按照一定的顺序组织起来的,从而构成了一种表状结构,称为虚函数表 (virtual table)

基类的虚函数表,在对象的头部

我们可以看到下面几点:

1)虚函数按照其声明顺序放于表中。

2)父类的虚函数在子类的虚函数前面。

首先基函数的表项仍然保留,而得到正确继承的虚函数其指针将会被覆盖,而子类自己的虚函数将跟在表后。

多重继承的时候,表项将会增多,顺序会体现为继承的顺序,并且子函数自己的虚函数将跟在第一个表项后。

下面是对于子类实例中的虚函数表的图:

多重继承。有虚函数覆盖

下面是对于子类实例中的虚函数表的图:

C++中一个类是公用一张虚函数表的,基类有基类的虚函数表,子类是子类的虚函数表,这极大的节省了内存。虚函数的声明与定义要求非常严格,只有在子函数中的虚函数与父函数一模一样的时候(包括限定符)才会被认为是真正的虚函数,不然的话就只能是重载。这被称为虚函数定义的同名覆盖原则,意思是只有名称完全一样时才能完成虚函数的定义。

2.多态

关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术。

3.安全问题

3.1通过父类型的指针访问子类自己的虚函数

子类没有重载父类的虚函数是一件毫无意义的事情。因为多态也是要基于函数重载的。任何妄图使用父类指针想调用子类中的未覆盖父类的成员函数的行为都会被编译器视为非法,所以,这样的程序根本无法编译通过。但在运行时,我们可以通过指针的方式访问虚函数表来达到违反C++语义的行为。

3.2 访问non-public的虚函数

如果父类的虚函数是private或是protected的,但这些非public的虚函数同样会存在于虚函数表中,所以,我们同样可以使用访问虚函数表的方式来访问这些non-public的虚函数,这是很容易做到的。

大佬解释c++虚函数_de林儿的博客-CSDN博客_c++ 虚函数

1.移动构造函数和拷贝构造函数的区别

C++11之前,对象的拷贝控制由三个函数决定:拷贝构造函数(Copy Constructor)、拷贝赋值运算符(Copy Assignment operator)和析构函数(Destructor)。C++11之后,新增加了两个函数:移动构造函数(Move Constructor)和移动赋值运算符(Move Assignment opera)。构造函数在创建或初始化对象的时候调用,而赋值运算符在更新一个对象的值时调用。

移动语义,指的就是以移动而非深拷贝的方式初始化含有指针成员的类对象,就是将其他对象(通常是临时对象)拥有的内存资源“移为已用”。优点:减小临时变量资源的申请与销毁。因此在使用临时对象初始化新对象时,我们可以将其包含的指针成员指向的内存资源直接移给新对象所有,无需再新拷贝一份,这大大提高了初始化的执行效率。

如果使用临时对象初始化当前类的对象,编译器会优先调用移动构造函数来完成此操作。只有当类中没有合适的移动构造函数时,编译器才会退而求其次,调用拷贝构造函数。当用户利用右值初始化类对象时,会调用移动构造函数;使用左值(非右值)初始化类对象时,会调用拷贝构造函数。

#include <iostream>
using namespace std;
class demo{
public:demo():num(new int(0)){cout<<"construct!"<<endl;}demo(const demo &d):num(new int(*d.num)){cout<<"copy construct!"<<endl;}//添加移动构造函数demo(demo &&d):num(d.num){d.num = NULL;cout<<"move construct!"<<endl;}~demo(){cout<<"class destruct!"<<endl;}
private:int *num;
};
demo get_demo(){return demo();
}
int main(){demo a = get_demo();return 0;
}

左值与右值的区别

  1. 左值持久,右值短暂(右值要么是字面值常量,要么是表达式求值过程中创建的临时变量)
  2. 左值是变量,右值不能被赋值

左值引用与右值引用

右值引用是为了支持移动操作,通过&&来获得右值引用

左值引用是相对于右值引用的,通过&来获得

int i = 42;
int &r = i;       //正确,r引用i
int &&rr = i;     //错误,不能将一个右值绑定到一个左值(变量)上
int &r2 = i*42;   //错误,不能将一个左值绑定到一个右值上
const int &r3 = i*42; //正确,可以将一个const的引用绑定到一个右值上
int &&rr2 = i*42;    //正确,将rr2绑定到一个乘法结果上
int &&rr2 = 42;    //正确,字面值常量是一个右值

拷贝构造函数与移动构造函数的区别:

拷贝构造函数的形参是一个左值引用,而移动构造函数的形参是一个右值引用

拷贝构造函数完成的是整个对象或变量的拷贝,而移动构造函数是生成一个指针指向源对象或变量的地址,接管源对象的内存,相对于大量数据的拷贝节省时间和内存空间。

拷贝构造函数与移动构造函数_青山绿水-CSDN博客_移动拷贝构造函数

移动构造函数与拷贝构造函数_马斯尔果的博客-CSDN博客_移动构造函数和拷贝构造函数

拷贝构造函数和移动构造函数_jisuanji198509的博客-CSDN博客_移动构造函数和拷贝构造函数

2.深拷贝和浅拷贝的区别

当类中有指针成员时,若不实现深拷贝构造函数,默认的拷贝构造函数就会实现浅拷贝。即不同指针指向同一块内存。

浅拷贝的坏处:1.拷贝到的对象有内存泄漏;2.二者指向同一块内存,改动任何一方均会影响另一方;3.析构时会析构两次,造成崩溃。

#include <iostream>
#include <string.h>
using namespace std;class Test {
public:Test():ptr(new char[1]) { // 带参数的构造函数cout << "Test():ptr(new char[1])" << endl;}Test operator=(const Test& obj){if (this == &obj) { // s=sreturn *this;}delete[] ptr;ptr = new char[strlen(obj.ptr) + 1];strcpy(ptr, obj.ptr);cout << "Test& operator=(const Test& obj)" << endl;return *this;}Test& operator=(const char *s){delete[] ptr;ptr = new char[strlen(s) + 1];strcpy(ptr, s);cout << "Test& operator=(const Test& obj)" << endl;return *this;}~Test() { // 析构函数delete[] ptr;}
private:char* ptr;
};int main() {Test a;a= "test";Test b;b= a;Test d;getchar();return 0;
}

3.空类有哪些函数?空类的大小

. 缺省构造函数。
. 缺省拷贝构造函数。
. 缺省析构函数。
. 缺省赋值运算符。
. 缺省取址运算符。
. 缺省取址运算符 const

空类的大小是1。

子类继承空类后,子类如果有自己的数据成员,而空基类的一个字节并不会加到子类中去。

class Empty {};
struct D : public Empty {int a;};

sizeof(D)为4

class Empty {};
class HoldsAnInt {int x;Empty e;
};

由于编译器会自动内存对齐,所以大小不为5,sizeof(HoldsAnInt)为8。

4.struct和class的区别

struct能包含成员函数吗? 能!

struct能继承吗? 能!!
struct能实现多态吗? 能!!!

1、c++中的struct的默认访问限定是public,而class的默认访问限定是private

2、c++中的struct的默认继承权限是public,而class的默认继承权限是private;
当然,到底默认是public继承还是private继承,取决于子类而不是基类。我的意思是,struct可以继承class,同样class也可以继承struct,那么默认的继承访问权限是看子类到底是用的struct还是class。如下:

struct A{};class B : A{}; //private继承
struct C : B{}; //public继承

struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体

5.内存分区:栈区、堆区、自由存储区全局/静态存储区、常量存储区

1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。

2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)

int* p = new int[5;

看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operatornew分配内存,然后返回这块内存的首地址,放入栈中。

6.智能指针的使用shared_ptr, unique_ptr, weak_ptr

智能指针在C++11版本之后提供,包含在头文件<memory>中,shared_ptr、unique_ptr、weak_ptr

1.shared_ptr

shared_ptr使用引用计数,shared_ptr内部的引用计数是线程安全的,但是对象的读取需要加锁。

初始化。智能指针是个模板类,可以指定类型,传入指针通过构造函数初始化。也可以使用make_shared函数初始化,不能将指针直接赋值给一个智能指针,一个是类,一个是指针。拷贝使得对象的引用计数增加1,赋值使得原对象引用计数减1,当计数为0时,自动释放内存。后来指向的对象引用计数加1,指向后来的对象。get函数获取原始指针。不要用一个原始指针初始化多个shared_ptr,否则会造成二次释放同一内存。注意避免循环引用。

        int a = 10;std::shared_ptr<int> ptra = std::make_shared<int>(a);std::shared_ptr<int> ptra2(ptra); //copystd::cout << ptra.use_count() << std::endl;int b = 20;int *pb = &a;//std::shared_ptr<int> ptrb = pb;  //errorstd::shared_ptr<int> ptrb = std::make_shared<int>(b);ptra2 = ptrb; //assignpb = ptrb.get(); //获取原始指针

2.unique_ptr

unique_ptr 独享被管理对象指针所有权的智能指针。unique_ptr对象包装一个原始指针,并负责其生命周期。当该对象被销毁时,会在其析构函数中删除关联的原始指针。unique_ptr具有->和*运算符重载符,因此它可以像普通指针一样使用。unique_ptr对象始终是关联的原始指针的唯一所有者。我们无法复制unique_ptr对象,它只能移动。由于每个unique_ptr对象都是原始指针的唯一所有者,因此在其析构函数中它直接删除关联的指针,不需要任何参考计数。

std::unique_ptr<Task> taskPtr(new Task(22));

std::make_unique<>() 是C++ 14 引入的新函数

std::unique_ptr<Task> taskPtr = std::make_unique<Task>(34);

在 unique_ptr 对象上调用reset()函数将重置它,即它将释放delete关联的原始指针并使unique_ptr 对象为空。

taskPtr.reset();

由于 unique_ptr 不可复制,只能移动。因此,我们无法通过复制构造函数或赋值运算符创建unique_ptr对象的副本。

// 编译错误 : unique_ptr 不能复制
std::unique_ptr<Task> taskPtr3 = taskPtr2; // Compile error// 编译错误 : unique_ptr 不能复制
taskPtr = taskPtr2; //compile error

转移 unique_ptr 对象的所有权,无法复制 unique_ptr 对象,但我们可以转移它们。这意味着 unique_ptr 对象可以将关联的原始指针的所有权转移到另一个 unique_ptr 对象。

// 通过原始指针创建 taskPtr2
std::unique_ptr<Task> taskPtr2(new Task(55));
// 把taskPtr2中关联指针的所有权转移给taskPtr4
std::unique_ptr<Task> taskPtr4 = std::move(taskPtr2);
// 现在taskPtr2关联的指针为空
if(taskPtr2 == nullptr)std::cout<<"taskPtr2 is  empty"<<std::endl;// taskPtr2关联指针的所有权现在转移到了taskPtr4中
if(taskPtr4 != nullptr)std::cout<<"taskPtr4 is not empty"<<std::endl;// 会输出55
std::cout<< taskPtr4->mId << std::endl;

std::move() 将把 taskPtr2 转换为一个右值引用。因此,调用 unique_ptr 的移动构造函数,并将关联的原始指针传输到 taskPtr4。在转移完原始指针的所有权后, taskPtr2将变为空。

释放关联的原始指针。在 unique_ptr 对象上调用 release()将释放其关联的原始指针的所有权,并返回原始指针。这里是释放所有权,并没有delete原始指针,reset()会delete原始指针。

std::unique_ptr<Task> taskPtr5(new Task(55));
// 不为空
if(taskPtr5 != nullptr)std::cout<<"taskPtr5 is not empty"<<std::endl;
// 释放关联指针的所有权
Task * ptr = taskPtr5.release();
// 现在为空
if(taskPtr5 == nullptr)std::cout<<"taskPtr5 is empty"<<std::endl;

C++ 智能指针 unique_ptr 详解与示例_彼此当年少,莫负好时光-CSDN博客_c++ unique_ptr

3.weak_ptr

weak_ptr解决shared_ptr循环引用的问题。weak_ptr本身也是一个模板类,但是不能直接用它来定义一个智能指针的对象,只能配合shared_ptr来使用,可以将shared_ptr的对象赋值给weak_ptr,并且这样并不会改变引用计数的值。查看weak_ptr的代码时发现,它主要有lock、swap、reset、expired、operator=、use_count几个函数,与shared_ptr相比多了lock、expired函数,但是却少了get函数,甚至连operator* 和 operator->都没有。

weak_ptr虽然是一个模板类,但是不能用来直接定义指向原始指针的对象。
weak_ptr接受shared_ptr类型的变量赋值,但是反过来是行不通的,需要使用lock函数。
weak_ptr设计之初就是为了服务于shared_ptr的,所以不增加引用计数就是它的核心功能。
由于不知道什么之后weak_ptr所指向的对象就会被析构掉,所以使用之前请先使用expired函数检测一下。

智能指针(三):weak_ptr浅析_AlbertS Home of Technology-CSDN博客_weakptr

7.std::move函数

在C++11标准库<utility>中,std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);

std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝所以可以提高利用效率,改善性能。

//摘自https://zh.cppreference.com/w/cpp/utility/move
#include <iostream>
#include <utility>
#include <vector>
#include <string>
int main()
{std::string str = "Hello";std::vector<std::string> v;//调用常规的拷贝构造函数,新建字符数组,拷贝数据v.push_back(str);std::cout << "After copy, str is \"" << str << "\"\n";//调用移动构造函数,掏空str,掏空后,最好不要使用strv.push_back(std::move(str));std::cout << "After move, str is \"" << str << "\"\n";std::cout << "The contents of the vector are \"" << v[0]<< "\", \"" << v[1] << "\"\n";
}
After copy, str is "Hello"
After move, str is ""
The contents of the vector are "Hello", "Hello"

c++ 之 std::move 原理实现与用法总结_学之知之的博客-CSDN博客_std::move

8.左值、右值,左值引用和右值引用

1、左值和右值的概念

左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体;
         右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。
         一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址

2、引用

引用是C++语法做的优化,引用的本质还是靠指针来实现的。引用相当于变量的别名。

引用可以改变指针的指向,还可以改变指针所指向的值。

引用的基本规则:

  1. 声明引用的时候必须初始化,且一旦绑定,不可把引用绑定到其他对象;即引用必须初始化,不能对引用重定义
  2. 对引用的一切操作,就相当于对原对象的操作。

3、左值引用和右值引用

3.1 左值引用
         左值引用的基本语法:type &引用名 = 左值表达式;

3.2 右值引用

右值引用的基本语法type &&引用名 = 右值表达式;

右值引用在企业开发人员在代码优化方面会经常用到。

右值引用的“&&”中间不可以有空格。

9. static的作用

  1. 修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见;全局变量可以被其他文件使用。
  2. 修饰局部变量时,表明该变量的值不会因为函数终止而丢失。
  3. 修饰函数时,表明该函数只在同一文件中调用。
  4. 修饰类的数据成员时,该类所有对象都共享这一个实例。
  5. 修饰类的成员函数时,静态成员之间可以互相访问,包括静态成员函数访问静态成员变量和静态成员函数;非静态成员函数可以访问静态成员函数和静态成员变量;静态成员函数无法访问非静态成员函数和非静态数据成员。

类的非静态数据成员与对象有关,只有对象初始化之后,非静态成员函数和非静态成员变量才有意义,有this指针。

静态数据成员属于整个类,与类的对象无关,存储在全局数据区。可以先于类的对象存在,无this指针。

10.引用

引用只可以初始化,不可以被赋值,声明一个引用,不是新定义了一个变量,只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用不占用存储单元,系统不给引用分配存储单元,不能建立数组的引用

传递引用给函数与传递指针的效果一样;操作函数中用引用传递的参数,相当于操作实参本身。当传递对象作为函数参数时,传引用的效率更高。

常引用,既要利用引用提高传递效率,又要保护传递给函数的参数不被改变,可以考虑常引用。引用型参数应该在能被定义为const的情况下,尽量定义为const。

将引用作为函数返回值类型的好处,内存中不产生被返回值的副本。函数中不能返回局部变量的引用,不能返回函数内部new分配内存的引用,可以返回类成员的引用,但最好是const。

流操作符重载返回值声明为引用的作用,流操作符<<和>>可以被连续使用。若返回流对象和流指针,则连续两个<<操作符实际上针对的是不同的对象,流指针则不可以继续使用<<流操作符。

当类中含有const,reference成员变量时,基类构造函数都需要使用初始化列表。

引用和指针的区别:

  • 引用必须被初始化,指针不必。
  • 引用初始化之后不可改变,指针可以改变所指的对象。
  • 不存在指向空值的引用,但存在指向空值的指针。

11. C++不是类型安全的,两个不同类型的指针之间可以强制转换(用reinterpret cast)

12.main函数执行前,还会执行什么代码?

全局对象的构造函数会在main函数之前执行。

13.内存分配方式以及它们的区别

  • 从静态存储区域分配。内存在程序编译的时候已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量、static变量。
  • 从栈上创建。执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
  • 从堆上分配,也叫动态内存。程序运行时用malloc和new申请的任意多少内存,程序员自己负责在何时用free和delete释放内存。生命周期灵活。

14.const和#define区别

const:修饰常量,函数参数,函数返回值。被const修饰的东西受到强制保护,可以防止意外变动。

const常量有数据类型,宏常量没有。编译器对前者进行类型安全检查,对后者只是字符替换,没有类型检查。

15.数组与指针的区别

数组要么在静态存储区创建(全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。

sizeof可以计算出数组的容量(字节数),对指针而言得到的是一个指针变量的字节数。当数组作为函数的参数传递时,数组自动退化为同类型的指针。

16. int(*s[10])(int)表示函数指针数组,每个指针指向一个int func(int param)的函数

17.将程序跳转到指定内存地址

对绝对地址0x100000赋值,可以用(unsigned int*)0x100000 = 1234;

如果想让程序跳转到绝对地址0x100000去执行,应该怎么做?

*((void(*)())0x100000)();

首先要将0x10000转换成函数指针,即:(void(*)())0x100000

然后调用它:*((void(*)())0x100000)()

用typedef看即是

typedef void(*)() voidFuncPtr;

*((voidFuncPtr)0x100000)();

二.STL中的容器

1.顺序容器:vector,list,deque

2.关联容器:二叉树结构:map,set,multimap,multiset。还有一个比较函数,默认升序排列map中的count和find可以查找某个键是否存在,不会插入键。所有操作均是logN时间复杂度(查找、删除、插入)。set中通过find获取元素,若有返回相应的迭代器,否则返回end()。

3.容器适配器:适配器是容器的接口,本身不直接保存元素,它保存元素的机制是调用另一种书匈奴容器去实现。三种适配器:栈stack,队列queue和优先队列priority_queue(采用堆实现)

vector相当于数组,把所有对象保存在一块连续的内存块中。初始大小可以预先指定,也可以默认。当存储的数据超过分配的空间vector会重新分配一块内存块,但这样很耗时。

vector底层实现,采用一块连续的数组,有三个迭代器(指针)start、finish、end_of_storage,分别指向数据开始、结束位置和开辟空间的末尾。push_back时会将finish后移,同时将数据拷贝入地址。当finish和end_of_storage重合时,即vector开辟的空间已满,程序会从系统中找一块溶剂更大的连续内存,将当前数据拷贝过去,并修改三个迭代器的值。

deque,采用多个连续的内存块,并在一个映射结构中保存对这些块及其顺序的跟踪,向deque两端添加或删除元素的开销很小,不需要重新分配空间。

list是一个线性链表结构,它的数据由若干个节点构成,每个节点包括一个信息块、一个前驱指针和后驱指针。无需分配指定的内存大小,且可以任意伸缩,它存储在非连续的内存空间中,并且由指针将有序的元素连接起来。

set,multiset,map,multimap都是采用红黑树实现。平衡检索二叉树。

hashtable,hashset,hashmap,unordered_map,unordered和set,map的根本区别在于底层实现不同,前者底层都是由hashtable来提供的,后者是由红黑树提供的。前者查询复杂度O(1),但前者查询时间不一定比后者短,还要考虑数据量,而且hash函数的构造速度也没那么快。后者保证了一个稳态的操作时间。查询、插入、删除都是O(logN),最坏和平均都是

unordered_map和unordered_set在C++11引入的。

C++ STL中容器的使用全面总结_算法改变人生-CSDN博客_c++ 容器

C++面试知识总结-C++基础知识相关推荐

  1. 数据分析面试之统计的基础知识(持续更新)

    数据分析面试系列 统计的基础知识-1 1.概率知识点回顾 概率: 发生事件A的概率 P(A) = 发生事件A的数目 / 所有结果的数目 概率= 用数值来表示某件事发生的可能性 先验概率与后验概率: [ ...

  2. 公共基础知识计算机,公共基础知识计算机基础知识试题

    计算机基础知识是公共基础知识考试的组成成分之一,以下是由学习啦小编整理关于共基础知识计算机基础知识试题的内容,希望大家喜欢! 公共基础知识计算机基础知识试题 1.CPU的主要功能是进行( ). A.算 ...

  3. 【基础知识】RMAN基础知识-Part2

    接上一篇[基础知识]RMAN基础知识-Part1 利用两篇将之前学的内容整理出来,又做了一遍实验,常用不常用的都有.有很多可以深挖的点,后面慢慢搞再 一.配置备份集-备份片-压缩-加密 1.配置备份集 ...

  4. python基础知识下载_python基础知识(实用)

    文档来源为 : 从网络收集整理 .word 版本可编辑 . 欢迎下载支持 . 1 Python 基础知识 目录 Python 基础知识 ................................ ...

  5. 计算机应用基础的知识探索,计算机应用基础知识探索

    计算机应用基础知识探索Tag内容描述: 1.计算机应用基础知识计算机应用基础知识点计算机应用基础知识话题计算机应用基础知识计算机基础知识电子商务单击第一章计算机基础知识1.1946年2月15日世界上第 ...

  6. 计算机知识txt,计算机基础知识txt.doc

    计算机基础知识txt 计算机基础知识txt 1计算机基础知识 本章将介绍计算机的发展与应用,信息处理的基本知识,计算机硬件系统和软件系统的基本知识,微机的使用,多媒体技术知识及计算机病毒的知识等内容, ...

  7. 计算机软件硬件基础知识,计算机软硬件基础知识

    计算机软硬件基础知识 ▲电脑硬件基础知识 ★1.了解电脑的基本组成 一般我们看到的电脑都是由:主机(主要部分).输出设备(显示器).输入设备(键盘和鼠标)三大件组成.而主机是 电脑的主体,在主机箱中有 ...

  8. 知识图谱从入门到应用——知识图谱的基础知识

    分类目录:<知识图谱从入门到应用>总目录 相关文章: · 知识图谱的基础知识 · 知识图谱的发展 · 知识图谱的应用 · 知识图谱的技术结构 知识图谱是有学识的人工智能 早期的人工智能有很 ...

  9. 关于学习密码学知识的一些基础知识( trapdoor function)

    关于学习密码学知识的一些基础知识( trapdoor function) trapdoor function 陷门函数:正向计算是很容易的,但若要有效的执行反向计算则必须要知道一些secret/key ...

  10. 内网安全学习从入门到入狱-知识-内网基础知识

    内网安全学习从入门到入狱-知识-内网基础知识 文章目录 内网安全学习从入门到入狱-知识-内网基础知识 内网渗透基础 基本的名词介绍 工作组 域 活动目录(AD) DC 域控制器(DC) DNS域名服务 ...

最新文章

  1. 不说12306你会Die啊?当然不会,但会憋死
  2. C++中的参数传递方式:传值、传地址、传引用总结
  3. seaborn可视化绘制双变量分组条形图(Annotating Grouped Barplot: Side-by-side)、添加数值标签进行标记
  4. JavaScript的方法和技巧
  5. 用Flash MX 2004自制调色版和配色组件(一)
  6. hpuoj--校赛--与学妹滑雪(最短路+精度判断)
  7. SQL 在表中建立索引的作用
  8. (二)html常用标签
  9. es中对标mysql group by的teams聚合类型
  10. PHP图片验证码制作(上)
  11. 统计学习导论_统计学习导论 | 读书笔记15 | 广义可加模型
  12. 月薪30K大佬源码阅读的经验总结,干货不容错过
  13. SpringMVC 访问html页面乱码
  14. U盘安装fedora 9
  15. 第三章:logback 的配置
  16. 使用easypoi导出excel设置表头样式
  17. op 圣诞节活动_圣诞节到了–这是我们精选的IT饼干笑话
  18. PHP获取上周一,获取指定日期的上周日期,上周一
  19. 图片如何在线生成GIF动画?轻松三步在线制作GIF动画
  20. 菜鸟教程之html5学习,Canvas画布、渐变,数学公式、符号的书写

热门文章

  1. excel mysql数据同步_将 Excel 数据导入 MySql
  2. Java网课|apiscanner
  3. 基于Huffman编码的C语言解压缩文件程序
  4. csv文件用excel打开乱码问题
  5. GOOGLE翻译算法解析,最新google谷歌免费翻译算法
  6. 粥佐罗时间管理课学习笔记
  7. asp.net师电子化信息库的设计与实现(源代码+论文)ASP.NET汽车销售管理系统的设计与开发(源代码+论文)
  8. Unity赛车码表原理
  9. 电路板元件符号及名称概述
  10. 三方协议中的服务器,手把手教你三方协议怎么填