C++ 知识点/面试题目总结 (八股文)

2023-11-05

C++ 知识点/面试题目总结 (八股文)

持续更新,欢迎纠正~
有需要的同学可以看目录找到相应的知识点


1. C和C++的区别

设计思想上:

C++是面向对象的语言,而C是面向过程的结构化编程语言。

语法上:

C++具有封装、继承和多态三大特性。
C++相比较C,增加了许多类型安全的功能,比如强制类型转换、智能指针。
C++支持泛型编程,比如模板类,函数模板等。


2. 构造函数后面的冒号有什么用

构造函数后面加冒号,表示冒号后面接构造函数初始化列表(constructor initialize list),主要有三种应用场景:

  • 对基类进行初始化
  • 对类成员进行初始化
  • 对类的const成员变量进行初始化
    由于const成员变量的值无法在构造函数内部初始化,因此只能在变量定义时赋值或者使用初始化列表赋值。
class thread_guard {
	std::thread& t;
    int b;
public:
    explicit thread_guard(std::thread& x,const int a) : t(x), b(a) {}
    ~thread_guard();
}


3. 函数后面 = default和= delete有什么用?

https://blog.csdn.net/lixiaogang_theanswer/article/details/81090622
https://blog.csdn.net/weixin_38339025/article/details/89161324?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.base&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.base
= default:

当我们编写一个类时,若不显著写明,则类会默认为我们提供如下几个函数:构造函数、析构函数、拷贝构造函数、拷贝赋值函数(operator=)、移动构造函数。
简单来说:=defalut是使得函数为编译器默认的形式。
= default只能用于(类的)特殊的成员函数(默认构造函数,复制构造函数,析构函数等)。例如,当我们声明了一个有参构造函数时,编译器就不会创建默认构造函数(无参)。这个时候声明对象时不带参就会出错,此时我们就要自己声明一个无参构造函数。但是自己声明默认构造函数就会失去编译器对于默认构造函数的一些优化,跟POD有关,所以我们可以在自己声明的无参构造函数后面加上=defalut来说明为默认构造函数,这样他就会做默认构造函数会做的一些事情。

= delete:

= delete就是禁用该种函数使用,比如
① 禁用拷贝构造函数
{A& operator=(const A&) = delete}
A a1, a2, a3;
a1 = a2;//错
② 禁用不需要用的参数转换
{A(int) {}
A(double) {}}
A a1(1);//正确
A a2(2.2);//错误,被禁用了

总结:
=defalut使得被修饰的函数为编译器默认的形式。=delete使得编译器禁止该类型的成员函数生成。
对特殊成员函数使用以上修饰符使得代码更容易阅读。


4. 类的大小和什么有关系?

类的大小计算没那么简单,涉及到虚函数成员、静态成员、虚继承、多继承以及空类等,不同情况有对应的计算方式,在此对各种情况进行总结。
首先明确一个概念,平时所声明的类只是一种类型定义,它本身是没有大小可言的。我们这里所说的大小,其实指的是类的对象所占的大小。因此,如果用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。
记住以下几点:

  • 首先,类的大小遵循结构体的对齐原则
  • 类的大小与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数、静态成员函数、静态数据成员、静态常亮数据成员均对类的大小无影响。
  • 虚函数对类的大小有影响,是因为虚函数表指针带来的影响
  • 虚继承对类的大小有影响,是因为虚基表指针带来的影响
  • 空类的大小是一个特殊情况,空类的大小为

解释:

  • 静态数据成员之所以不计算在类的对象大小内,是因为类的静态数据成员被该类的所有对象共享,并不属于哪个对象。

https://blog.csdn.net/fengxinlinux/article/details/72836199


5. struct和typedef struct什么区别

在C中定义一个结构体类型要用typedef:

typedef struct student {
    int a;
}Stu;

这时声明变量就可以:Stu stu1;
如果上面没有加typedef就必须用struct Student stu1来声明。这里的Stu实际上就是struct Student的别名。
另外这里也可以不写Student(typedef struct {}Stu;那声明变量的时候就不能struct Student stu1;了只能Stu stu1;)
而C++中,直接struct name {}就行了。
另外,在C++中加了typedef又会不一样
① struct name {int a;}stu; 这里stu是一个变量。
② typedef struct name{int a;}std;这里的stu是一个结构体类型。


6. 函数后面加const

const只能加在类的成员函数后面(普通函数不可以),也就是说这些成员函数是只读函数。
1、非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误)
2、加了cosnt的成员函数,表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用)
费静态成员函数后面加const和mutable是反义词

加了const的成员函数可以被非const**对象**const对象调用。注意是对象。
但不加const的成员函数只能被非const对象调用。

函数前面加cosnt表示返回值是const,函数后面加const表示不可以修改class的成员。
什么时候用?
当不改变数据成员的函数都加上cosnt关键字,提高程序的可读性,提高程序的可靠性,保护数据。比如函数为get_a, get_b, get_sum;


7. 共享数据的保护

1、常引用:所引用的形参不能被更新

void display(const double& a);

2、常对象:在生存期内不能被更新,但必须被初始化

A const a(3, 4);

3、常成员函数:不能修改对象中数据成员,也不能调用类中没有被const修饰的成员函数(常对象唯一的对外接口)。如果声明了一个常对象,则该对象只能调用它的常函数!另外,可以用于对重载函数的区分。

void print();
void print() const;

4、extern int a;使得其他文件也能访问该变量

声明一个函数或定义函数时,冠以static的话,函数的作用域就被限制在了当前编译单元,当前编译单元内也必须包含函数的定义,也只在其编译单元可见,其他单元不能调用这个函数(每一个cpp文件就是一个编译单元)


8. 运算符重载注意

  • 单目运算符最好重载为成员函数,双目最好为友元函数。
  • =、[]只能重载成员函数,<<和>>只能重载为友元函数。

9. 程序内存分配方式以及它们的区别

内存分配大致上可以分成5块:

  1. 栈区(stack)。栈,就是那些由编译器在需要时分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。(由编译器管理)
  2. 堆区(heap)。一般由程序员分配、释放,若程序员不释放,程序结束时可能由系统回收。注意,它与数据结构中的堆时两回事,分配方式类似于链表。
  3. 全局区(静态区)(static)。全局变量和静态变量被分配到同一块内存中。程序结束后由系统释放。
  4. 常量存储区。常量字符串就是放在这里的,不允许修改,程序结束后由系统释放。
  5. 程序代码区。存放函数体的二进制代码。

10. 全局变量、全局静态变量、静态变量、静态函数

10.1 全局静态变量和全局变量的区别

  1. 若程序由一个源文件构成时,全局变量与全局静态变量没有区别。
  2. 若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的原文见所独享,即全局静态变量对组成改程序的其他源文件时无效的。
  3. 具有外部链接的静态,可以在所有源文件里调用,除了本文件,其他文件可以通过extern的方式引用。

—静态变量只被所属源文件使用。

10.2 请说一下static的作用

static关键字有如下几种作用:
1、全局静态变量
在全局变量前加上关键字static,全局变量就被定义成一个全局静态变量。
存放区:存放在静态存储区,在整个程序运行期间一直存在。
初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非它被显式初始化)
作用域:全局静态变量在声明它的文件之外是不可见的,准确来说作用域是从定义之处开始,到文件结尾。
2、局部静态变量
在局部变量前加上关键字static,局部变量就被定义成一个局部静态变量。
存放区:静态存储区。
初始化:未经初始化的局部静态变量会被自动初始化为0(自动对象的值是任意的,除非它被显示初始化)
作用域:作用域仍然是局部作用域,当定义它的语句块结束时,作用域结束。但是当局部静态变量离开作用域后,并没有被销毁,而是仍然驻留在内存当中,只不过我们不能对其进行访问,除非该函数再次被调用,并且该局部静态变量值不变。
3、静态函数
在函数返回类型前加static,函数就被定义为静态函数。函数的定义和声明在默认情况下都是extern的,但静态函数只在声明它的文件当中可见,不能被其他文件所用。
这个函数只可以被本cpp内使用,不会和其他cpp中的同名函数引起冲突。
warning:(没懂)不要在头文件中声明static的全局函数,不要在cpp内声明非static的全局函数,如果你要在多个cpp中复用该函数,就把它的声明提到头文件中去,否则cpp内部声明需加上static修饰。
4、类的静态成员
在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会被破坏隐藏的原则,也就是保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。对多个对象来说,静态数据成员只存储一处,供所有对象共用。
5、类的静态函数
静态成员函数和静态成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名,可以直接使用class_name::static_func()就可以访问。

10.3 静态成员函数与普通成员函数的区别

静态成员函数没有this指针,只能访问静态成员(包括静态成员变量和静态成员函数)
普通成员函数有this指针,可以访问类中的任意成员(普通成员变量和静态成员变量,好像静态成员函数没有this指针不能通过this访问,但是可以通过类名::访问);而静态成员函数没有this指针。


11. new delete 与 malloc free的联系与区别

  • new delete 和 malloc free都是释放申请的堆上的空间,都是成对存在的,否则将会造成内存泄漏或者二次释放。
  • 不同的是,new delete是C++中定义的操作符,new除了分配空间外,还会调用类的构造函数来完成初始化工作,delete除了释放空间外还会调用类的西沟函数。而malloc和free是C语言中定义的函数

12. explicit

explicit关键字只能用于类的构造函数的声明上。
它的作用是防止构造函数进行的隐式转换。

在C++中,一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数),承担了两个角色。
① 第一是构造
② 第二是默认且隐含的类型转换操作符。即如果构造函数接收到的参数会默认进行隐式转换。
隐式转换看起来很方便,但是某些情况下违背了程序员的本意。这个时候就要加上explicit修饰,指定这个构造器只能被明确的调用/使用,不能进行隐式转换。

class A
{
public:
    explicit A(int a, int b) : m_a(a), m_b(b) {};
private:
    int m_a;
    int m_b;
}

int main()
{
    A test(1, 2); //正确
    A test1(2.2, 2); // 错误,存在double->int的隐式转换。
}

13. C/C++中指针和引用的区别:

待更新


14. c++的四中cast转换

四中cast转换是C++的强制转换。
cast-name<target_type>(expression);
1、const_cast
唯一一个可以改变const性质的转换
2、static_cast
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast
3、dynamic_cast
用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果时非法的对于指针返回null,对于引用抛出异常。要深入理解内部转换的原理
向上转换:指的是子类向基类的转换。
向下转换:指的是基类向子类的转换。
它通过判断在执行到该语句的时候变量的运行时类型和要转换的类型是否相同来判断是否能够进行向下转换。
4、reinterpret_cast
几乎什么都可以转,可能会出问题,尽量少用。
5、为什么不用C的强制转换?
C的强制转换表面上看起来功能强大什么都能转,但是转化不够明确,不能进行错误检查,容易出错。
C的强制转换 (type_name) expression


15. mutable关键字

mutable的中文意思时可变的、易变的,跟constant(即C++里的const)是反义词。在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量(mutable只能用于修饰类的非静态数据成员),将永远处于可变的状态(可以修改成员数据之类的),即使在一个const函数中。


16. 用const修饰函数的返回值

如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能修改,且该返回值只能被赋给加const的同类型指针。一般只在返回值为引用或指针时使用,返回其他值时没有必要。

const char* get_string(void);
char *str = get_string();//编译报错
const char *str = get_string();//正确

17. 宏、const、enum

  1. #define不被视为语言的一部分(#define属于预处理器)。对于单纯常量,最好用const对象或者enum替换#define。
  2. 对于类似函数的宏,尽量使用内联函数替换掉#define

  1. 编译器处理方式不同
    define宏是在预处理阶段展开。
    const常量是在编译运行阶段使用
  2. 类型
    define宏没有类型,不做任何类型检查,仅仅是展开。
    const常量没有具体的类型,在编译阶段会执行类型检查。
  3. 起作用的方式
    #define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以别面一些低级的错误。正因为define只是简单的字符串替换,会导致边界效应,很容易犯错。具体可以参考以下代码
#define N 2+3
const double a = N/2; //结果是2+3/2 = 2+1 = 3
const double b = (double)N / (double)2;
//我们预想的答案是2.5,可实际输出的值是2 + 3 / 2 = 3.5
  1. 占用空间
    define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。占用代码段空间
    const常量会在内存中分配(可以是在堆中也可以是在栈中) 占用数据段空间
  2. 调试角度
    const常量是可以进行调试的,#define不能进行调试,因为在预编译阶段就已经替换掉了。
  3. 作用域
    const变量是由作用域的,define在没有遇到#undefine之前是没有作用域限制的

在C++程序中一般只使用const常量而不是用宏常量,即const常量完全取代宏常量。
宏可以提高程序的易读性,比如数组大小,模式mode


18. stack的生存期

C++中的static对象是指存储区不属于stack和heap、“寿命”从被构造出来直至程序结束为止的对象。这些对象包括全局对象,定义于namespace作用域的对象,在class、function以及file作用域中被声明为static的对象。其中,函数内的static对象成为local static对象,而其他static对象成为non-local static对象。
这两者在何时初始化(构造)的问题上存在细微的差别:

  • 对于local static对象,在其所属的函数被调用之前,该对象并不存在,即只有在第一次调用对应函数时,local static对象才被构造出来。
  • 而对于non-local static对象,在main()函数开始前就已经被构造出来,并在main()函数结束后被析构。

建议:

  1. 对内置对象进行手动初始化,因为c++不保证初始化它们。
  2. 构造函数最好使用成员初值列,而不要在构造函数本体中使用赋值操作。初值列中列出的成员变量,其排序次序应该和它们在class中的声明次序相同(初始化顺序与声明变量顺序一致)。
  3. 为免除“跨编译单元的初始化次序问题”,尽量以local static对象替换non-local static对象。

19. STL相关

  1. STL被组织成12个头文件。algorithm, deque, functional, iterator, vector, list, map, memory, numeric, queue, set, stack, utility。
  2. STL时C++通用库,由容器,算法,迭代器,仿函数,内存配置器构成。
  3. 容器
    作为STL最主要的组成部分——容器,分为向量(vector),双端队列(deque),表(list),队列(queue),堆栈(stack),set,multiset,map,multimap

关联式容器:map,multimap,set,multiset(代表允许重复元素)
中包含pair<typename T1, typename T2>这种对组的结构体。
函数get_allocator()用于获取map或multimap的内存配置器,内存配置器类似于指针的首地址
没写文,更多请看原文

  1. 算法
    算法部分主要由头文件,组成。(numeric,数字,数值,分数。是用于数值计算的小库)。是所有STL头文件中最大的一个,它是由一大堆模板函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到:比较、交换、遍历操作、复制、修改、移除、反转、排序、合并等等。numeric体积很小,只包括几个在序列上面进行简单数字运算的模板函数,包括加法和乘法在序列上的一些操作。XX中则定义了一些模板类,用以声明函数对象。

auto_ptr只能对new分配的内存使用,不能对new[]的使用
algorithm中的for_each(T.begin(), T.end(), function); find(T.begin(), T.end(), value)
T.reserve(x):预留空间。实际空间小于它则扩充。

  1. 迭代器
    在头文件iterator中,迭代器类型:输入型迭代器,输出型迭代器,前向迭代器(前两者结合),双向迭代器(可回头),随机存取迭代器。

没写完,更多请看原文。

  1. 仿函数
    就是函数对象,类重载了操作符();
  2. 适配器
    适配器时用来修改其他组件接口的STL组件,是带有一个参数的类模板(这个参数是操作的值的数据类型)。STL定义了3种形式的适配器:容器适配器,迭代器适配器,函数适配器。
  • 容器适配器:包括栈(stack)、队列(queue)、优先队列(priority_queue)。使用容器适配器,stack就可以被实现为基本容器类型(vector、dequeue、list)的适配。可以把stack看做是某种特殊的vector、deque或者list容器,只是其操作仍然收到stack本身属性的限制。queue和priority_queue与之类似。容器适配器的接口更为简单,只是受限比一般容器更多。

容器适配器也是同样的道理,简单的理解容器适配器,其就是将不适用的序列式容器(包括vector、deque和list)变得适用。容器适配器的底层实现和模板A,B的关系也是完全相同的,即通过封装某个序列式容器,病重新组合该容器中包含的成员函数,使其满足某些特定场景的需要。

容器适配器本质上还是容器,只不过次容器模板类的实现,利用了大量其他基础容器模板类中已经写好的成员函数。当然,如果必要的话,容器适配器中也可以自创新的成员函数。

需要注意的时,STL中的容器适配器,其内部使用的基础容器并不是固定的,用户可以在满足特定条件的多个基础容器中自由选择。

  • 迭代器适配器:修改为某些基本容器定义的迭代器的接口的一种STL组件。反向迭代器和插入迭代器都属于迭代器适配器,迭代器适配器扩展了迭代器的功能。
  • 函数适配器:通过转换或者修改其他函数对象使其功能得到扩展。这一类适配器由否定器(相当于“非”操作)、帮顶起、函数指针适配器。函数对象适配器的作用就是使函数转化为函数对象,或者将多参数的函数对象转化为少参数的函数对象。
  1. 空间/内存配置器(allocator)
    分为一级配置器和二级配置器。没写完

STL的分配器(allocator)用于封装STL容器在内存管理上的底层细节。在C++中,其内存配置和释放如下:

  • new运算分两个阶段:① 调用::operator new配置内存;② 调用对象构造函数构造对象内容
  • delete运算分两个阶段:① 调用对象析构函数;② 调用::operator delete释放内存。
    为了精密分工,STL allocator将两个阶段操作区分开来:内存配置由alloc::allocate()负责,内存释放由alloc::deallocate()负责;对象构造由::construct()负责,对象析构由::destroy()负责。
  • 同时为了提升内存管理的效率,较少申请小内存造成的内存碎片问题,SGI STL采用了两级适配器,当分配的空间大小炒作128B时,会使用第一级空间配置器;当分配的空间大小小于128B时,将使用第二级空间配置器。第一级空间配置器会直接使用malloc(),realloc(),free()函数进行内存空间的分配和释放,而第二级空间配置器采用了内存池技术,通过空闲链表来管理内存。

20. 程序编译

程序编译是指将源文件翻译成二进制目标代码的过程。主要是检查语法错误,正确的源程序文件经过编译后在磁盘上生成目标文件。便已产生的目标文件是可重定位的程序模块,不能直接运行。链接则是把目标文件和其他分别进行编译生成的目标程序模块以及系统提供的标准库函数链接在一起,生成可运行的可执行文件。


21. class和struct的区别

c++中,class和struct都可以定义一个类。它们有以下两点区别:
1、默认继承权限,如果不指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理。
2、成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。
以上两点(权限)是struct和class最基本的差别,也是最本质的差别
但是语义上一般倾向于把struct昂做C时代的struct来用,即只有成员变量,没有逻辑(或只有极其简单的数据存入读取逻辑),用来把多个变量打包成一个类型,而不用struct来做面向对象变成意义上的class。这个是编码风格的范畴,为的是方便代码阅读。


都看到这句话了不如点个赞吧~~(收藏不赞,增益减半)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 知识点/面试题目总结 (八股文) 的相关文章

随机推荐

  • HCIP第七天

    OSPF的不规则区域 OSPF区域划分的要求 1 区域之间必须存在ABR 2 区域划分必须按照星型拓扑结构来进行划分 常见的不规则区域 1 远离骨干的非骨干区域 2 不连续骨干区域 远离骨干的非骨干区域 1 使用VPN隧道 直接在非法的AB
  • 2023Testing Expo

    8月9日 11日 2023汽车测试及质量监控博览会将于上海世博展览馆1号馆举行 本次展会将展示测试和验证技术在整车 零部件和系统开发领域中的新发展 新产品和新解决方案 怿星科技将携最新的ETH测试 智驾测试 PPS测试等方案亮相测试展 届时
  • 如何学习好数学

    数学大咖单墫总结数学解题的12条原则 1 要享受到解题的乐趣 对解题有浓厚的兴趣 能有几分痴迷更好 2 要有充足的信心 3 要有百折不回的决心与坚韧不拔的毅力 4 要做100道有质量的题目 5 反复探索 大胆地跟着感觉走 6 从简单的做起
  • 临界区操作的原子性

    所谓的原子性就是操作在未执行完之前不会被打断 在多线程变成的时候 很多时候都会在线程函数中或者被线程调用的函数中使用临界区来实现函数操作的原子性 临界区保证当前进入临界区的线程能够完整执行完临界区中保护的代码不被打断 但是当时我一直对临界区
  • python:json格式化输出

    参考 https stackoverflow com questions 12943819 how to prettyprint a json file import json your json foo bar baz null 1 0
  • kibana启动失败no known master node, scheduling a retry或者master_not_discovered_exception

    今天在用到elasticsearch和kibana时遇到错误 主要就是这种报错master not discovered exception 找不到master节点 有两种解决方法 一种是安装elasticsearch使用 msi安装包的形
  • Android Studio更新Gradle版本

    Android Studio更新Gradle版本 1 在File分栏下 点击Project Structure 2 按照图示步骤操作 选中Project 点击Android Gradle Plugin Version复选框下三角符号 选择需
  • 2022.0306避障小车学习1

    要求 使用stm32f103单片机 应用RTOS实时系统 使用超声波模块 oled屏 l298n直流步进电机 驱动模块和小车底盘 思路 在任务里用超声波实时测出距障碍物的距离 并将距离显示在oled屏上 再根据判断距离大小调用前进或者后退那
  • web应用开发实战 - node.js

    了解Node js Node js 是一个基于 Chrome JavaScript 运行时建立的一个平台 Node js 是一个基于 Chrome V8 引擎的 JavaScript 运行时 Node js是运行在服务端上的 JavaScr
  • 单页面引入vue和element

    引入vue 1 可以直接在页面中引入 2 https cdn jsdelivr net npm vue 2 dist vue js 打开该链接下载vue 存放在本地 引入element 方法同上
  • 交换机的简单描述

    工作原理 1 交换机有张表 MAC地址表 一开始未通讯之前 MAC地址表是空的 2 同一个局域网中主机A访问主机B 3 主机A会将自己的MAC地址和对面的MAC地址封装进数据帧 自己的是源MAC地址 对面是目 的MAC地址 4 交换机会收到
  • [极客大挑战 2019]HardSQL 1

    极客大挑战 2019 HardSQL 1 首先打开题目 明显的发现这是一个sql注入的题 我们先用 和 测试是否有注入报错 发现用 时报错 所以这题很明显是有sql注入的 于是我们就利用用语句 admin or 1 1 测试得到 发现这里是
  • c++ 笔记1

    c 笔记 1 inline内联函数 2 构造函数初始化 3 构造函数重载注意事项 4 常量成员函数 5 参数传递和返回值使用const引用 6 友元 7 运算符重载this指针 8 规范化代码一 complex h complex test
  • jdbc连接mysql的语法_JDBC 连接MySQL实例详解

    JDBC连接MySQL JDBC连接MySQL 加载及注册JDBC驱动程序 Class forName com mysql jdbc Driver Class forName com mysql jdbc Driver newInstanc
  • 2021年中职组“网络安全”赛项 杭州市竞赛任务书

    2021年中职组 网络安全 赛项 杭州市竞赛任务书 一 竞赛时间 总计 360分钟 二 竞赛阶段 三 竞赛任务书内容 拓扑图 一 A模块基础设施设置 安全加固 200分 一 项目和任务描述 假定你是某企业的网络安全工程师 对于企业的服务器系
  • HashSet添加元素的过程

    文章目录 HashSet添加元素的过程 HashSet添加元素的过程 底层结构 数组 链表
  • MySQL数据库是非关系_关系型数据库和非关系型数据库的理解

    综合百度百科和自己的理解整理以下内容 便于日常用到时进行查找 如下 一 关系型数据库 1 含义 关系型数据库 是指采用了关系模型来组织数据的数据库 其以行和列的形式存储数据 以便于用户理解 关系型数据库这一系列的行和列被称为表 一组表组成了
  • pcb上模拟地和数字地怎么隔离

    p 谢谢了 学习中 p oh mygod Post at 2006 2 20 10 45 00 p 注意把数字地隔离 p p 直接打到主地或者单点接地 p br
  • SSL/TLS一键配置工具-IISCrypto

    IIS Crypto 是一个免费工具 使管理员能够在 Windows Server 2008 2012 2016 2019 和 2022 上启用或禁用协议 密码 哈希和密钥交换算法 允许您重新排序 IIS 提供的 SSL TLS 密码套件
  • C++ 知识点/面试题目总结 (八股文)

    C 知识点 面试题目总结 八股文 1 C和C 的区别 2 构造函数后面的冒号有什么用 3 函数后面 default和 delete有什么用 4 类的大小和什么有关系 5 struct和typedef struct什么区别 6 函数后面加co