当前位置: 首页 > news >正文

初阶C++之C++入门基础

大家好!欢迎来到C++篇学习,这篇文章的内容不会很难,为c++的引入,c++的重点内容将在第二篇的文章中讲解,届时难度会陡然上升,请做好准备!

我们先看网络上的一个梗:21天内⾃学精通C++

好了,现在我们要开始写第一个c++程序了:hello world

1. C++的第⼀个程序  

C++兼容C语言绝大多数的语法,所以C语言实现的hello world依旧可以运行,C++中需要把定义文件代码后缀改为.cpp,vs编译器看到是.cpp就会调用C++编译器编译,linux下要用g++编译,不再是gcc
#include<stdio.h>
int main()
{printf("hello world");return 0;
}
当然C++有⼀套自己的输入输出,严格说C++版本的hello world应该是这样写的。
#include<iostream>
using namespace std;
int main()
{cout << "hello world" << endl;return 0;
}
这⾥的 std cout 等我们都看不懂,没关系,下⾯我们会依次讲解

2.命名空间

2.1 namespace的价值

在C/C++中,变量、函数和后⾯要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
c语言项目类似下面程序这样的命名冲突是普遍存在的问题,C++引入namespace就是为了更好的解决这样的问题
如:rand函数是在stdlib.h文件中的,将其包括进来就会引发冲突
#include <stdio.h> 
#include <stdio.h> 
#include <stdlib.h> 
int rand = 10; 
int main()
{   // 编译报错:error C2365: “rand”: 重定义;以前的定义是“函数” printf("%d\n", rand); return 0;
}
2.2 namespace的定义
定义命名空间,需要使用到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。
C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/
类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响
编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量生命周期。
namespace只能定义在全局,当然他还可以嵌套定义。
项目工 程中多文件中定义的同名namespace会认为是⼀个namespace,不会冲突。
C++标准库都放在⼀个叫std(standard)的命名空间中。
不理解的没有关系,我们来看下面的代码:
​
#include <stdio.h>
#include <stdlib.h> 
// 1. 正常的命名空间定义 
// bit是命名空间的名字,⼀般开发中是⽤项⽬名字做命名空间名。 
// 我们这里⽤的是bit,⼤家下去以后⾃⼰练习可以考虑⽤⾃⼰名字缩写,如张三:zs
namespace bit
{ // 命名空间中可以定义变量/函数/类型 int rand = 10; int Add(int left, int right) { return left + right;}struct Node { struct Node* next; int val; }; 
}
int main() 
{ // 这⾥默认是访问的是全局的rand函数指针printf("%p\n", rand); // 这⾥指定bit命名空间中的rand printf("%d\n", bit::rand); return 0; 
}​
//2. 命名空间可以嵌套 
#include <stdio.h>
#include <stdlib.h> 
namespace bit 
{ // 鹏哥 namespace pg {int rand = 1; int Add(int left, int right) { return left + right; } }// 杭哥 namespace hg { int rand = 2; int Add(int left, int right) { return (left + right)*10; } } 
}
int main() 
{ printf("%d\n", bit::pg::rand);printf("%d\n", bit::hg::rand); printf("%d\n", bit::pg::Add(1, 2)); printf("%d\n", bit::hg::Add(1, 2)); return 0;
}

结果如下:

2.3 命名空间使用

编译查找一个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。所以下面程序会编译报错。所以我们要使用命名空间中定义的变量/函数,有三种方式:
指定命名空间访问,项目中推荐这种方式。
using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。  
展开命名空间中全部成员,项目不推荐,冲突风险很⼤,日常小练习程序为了方便推荐使用。
废话不多说,我们直接上例子!

#include<stdio.h> 
namespace bit 
{ int a = 3; int b = 1;int c = 10;int d = 100;
}
using bit::b;          //using将命名空间中成员(b)展开
using namespace bit;   // 展开命名空间中全部成员
int main() 
{ // 对a指定命名空间访问printf("%d\n", bit::a); printf("%d\n", b);printf("%d\n", c + d);return 0; 
}

结果附上: 

3.C++输入&输出

<iostream> 是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输
出对象。
std::cin 是 istream 类的对象,它主要面向窄字符(narrow characters (of type char))的标准输
入流。
std::cout 是 ostream 类的对象,它主要面向窄字符的标准输出流。
std::endl 是⼀个函数,流插入输出时,相当于插入⼀个换行字符加刷新缓冲区。相当于\n
<<是流插入运算符,>>是流提取运算符。(C语言还用这两个运算符做位运算左移/右移)
使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动指定格式,C++的输入输出可以自动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是
C++的流能更好的支持自定义类型对象的输入输出。
IO流涉及类和对象,运算符重载、继承等很多面向对象的知识,这些知识我们还没有讲解,所以这里我们只能简单认识⼀下C++ IO流的⽤法,后⾯我们会有专门的⼀个章节来细节IO流库。
cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要
通过命名空间的使用方式去用他们。
⼀般日常练习中我们可以using namespace std,实际项目开发中不建议using namespace std。
这里我们没有包含<stdio.h>,也可以使用printf和scanf,在包含<iostream>间接包含了。vs系列
编译器是这样的,其他编译器可能会报错。

#include<iostream>
using namespace std;   //相当于我们的#include<stdio.h>
int main()
{int a = 0;double b = 0.1;char c = 'x';cout << a << " " << b << " " << endl;              //cout相当于printfstd::cout << a << " " << b << " " << std::endl;cin >> a;                                          //cin相当于scanfcin >> b >> c;cout << a<<"\n";cout << b << endl << " " << c;return 0;
}

结果如下:

4. 缺省参数

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调⽤该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)
全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
带缺省参数的函数调用,C++规定 必须从左到右依次给实参 ,不能跳跃给实参。
函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省
值。
还是直接上例子!
例1:
#include <iostream> 
#include <assert.h> 
using namespace std; 
void Func(int a = 0) 
{ cout << a << endl;
}
int main() 
{Func(); // 没有传参时,使⽤参数的默认值 Func(10); // 传参时,使⽤指定的实参 return 0; 
}

 结果如下:

例2: 

#include <iostream>
using namespace std; 
// 全缺省 
void Func1(int a = 10, int b = 20, int c = 30) 
{ cout << "a = " << a << endl;cout << "b = " << b << endl; cout << "c = " << c << endl << endl; 
}
// 半缺省 
void Func2(int a, int b = 10, int c = 20) 
{cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl << endl; 
}
int main() 
{Func1(); Func1(1); Func1(1,2);Func1(1,2,3); Func2(100); Func2(100, 200); Func2(100, 200, 300); return 0; 
}

 结果如下:

5. 函数重载

C++⽀持在同⼀作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的。
我们分成如下点讨论:‘

5.1 参数类型不同

#include <iostream>
using namespace std;// 1、参数类型不同 int Add(int left, int right) { cout << "int Add(int left, int right)" << endl;return left + right; }double Add(double left, double right) { cout << "double Add(double left, double right)" << endl; return left + right; 
}
int main() 
{ Add(10, 20); Add(10.1, 20.2); return 0; 
}
结果如图:

证明了c++在函数名相同时 ,参数类型不同,仍可进行传参并成功运行,不会报错!

 5.2 参数个数不同

#include <iostream>
using namespace std;// 2、参数个数不同 void f() { cout << "f()" << endl; }void f(int a) { cout << "f(int a)" << endl; }
int main() 
{ f(); f(10); return 0; 
}

结果如图:

证明了c++在函数名相同时 ,参数个数不同,仍可进行传参并成功运行,不会报错! 

5.3 参数类型顺序不同 

#include <iostream>
using namespace std;// 3、参数类型顺序不同 void f(int a, char b) { cout << "f(int a,char b)" << endl;}void f(char b, int a) { cout << "f(char b, int a)" << endl; } 
int main() 
{  f(10, 'a'); f('a', 10); return 0; 
}

结果如图:

证明了c++在函数名相同时 ,参数类型顺序不同,仍可进行传参并成功运行,不会报错!  

 5.4 错误示例

#include <iostream>
using namespace std;
void f1() 
{cout << "f()" << endl; 
}
void f1(int a = 10) 
{ cout << "f(int a)" << endl; 
}
int main() 
{ f1();return 0; 
}

此时,编译器会报错!!! 因为调用时,存在歧义,编译器不知道调用谁 !

6. 引用

6.1 引用的概念和定义

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
类型& 引用别名 = 引用对象;
C++中为了避免引入太多的运算符,会复用C语言的一些符号,比如前⾯的<< 和 >>,这⾥引用也和取地址使用了同以个符号&,大家注意使用方法角度区分就可以。(吐槽一下,这个问题其实挺坑的,个人觉得用更多符号反而更好,不容易混淆)

 我们来看代码理解一下:

#include<iostream> 
using namespace std; 
int main() 
{ int a = 0; // 引⽤:b和c是a的别名 int& b = a; int& c = a; // 也可以给别名b取别名,d相当于还是a的别名 int& d = b; ++d; // 这⾥取地址我们看到是⼀样的 cout << &a << endl; cout << &b << endl; cout << &c << endl; cout << &d << endl; cout << a << endl;cout << b << endl;cout << c << endl;cout << d << endl;return 0; 
}

运行结果:

6.2 引用的特性

引用在定义时必须初始化
一个变量可以有多个引用
引用一旦引用一个实体,再不能引用其他实体
我们来看代码理解一下:
#include<iostream> 
using namespace std; 
int main() 
{ int a = 10; // 编译报错:“ra”: 必须初始化引⽤ //int& ra; int& b = a; int d = 20; // 这⾥并非让b引⽤c,因为C++引⽤不能改变指向,// 这⾥是⼀个赋值 b = d;cout << &a << endl; cout << &b << endl; cout << &d << endl; return 0; 
}

运行结果:

6.3 引用的使用

引用在实践中主要是于引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被引用对象。
引用传参跟指针传参功能是类似的,引用传参相对更方便一些。
引用和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引⽤跟其他语言的引用(如Java)是有很大的区别的,除了用法,最大的点,C++引用定义后不能改变指向,
Java的引用可以改变指向。
⼀些主要⽤C代码实现版本数据结构教材中,使⽤C++引⽤替代指针传参,⽬的是简化程序,避开复杂的指针,但是很多同学没学过引用,导致一头雾水。

例一:


#include <iostream>
using namespace std;
void Swap(int& rx, int& ry)
{ int tmp = rx;rx = ry; ry = tmp; 
}
int main() 
{ int x = 0, y = 1; cout << x << " " << y << endl; Swap(x, y); cout << x << " " << y << endl; return 0;
}

结果如下:

6.4const引用

可以引用一个const对象,但是必须用const引⽤。const引用也可以引用普通对象,因为对象的访
问权限在引用过程中可以缩小,但是不能放大。
不需要注意的是类似 int& rb = a*3; double d = 12.34; int& rd = d; 这样一些场景下a*3的和结果保存在一个临时对象中, int& rd = d 也是类似,在类型转换中会产生临时对象存储中间值,也就是时,rb和rd引用的都是临时对象,而C++规定临时对象具有常性,所以这里就触发了权限放大,必须要用常引用才可以。
所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象,
C++中把这个未命名对象叫做临时对象
int main() 
{const int a = 10; // 编译报错:error C2440: “初始化”: ⽆法从“const int”转换为“int &” // 这⾥的引⽤是对a访问权限的放⼤ //int& ra = a; // 这样才可以 const int& ra = a; // 编译报错:error C3892: “ra”: 不能给常量赋值 //ra++; // 这⾥的引⽤是对b访问权限的缩⼩ int b = 20; const int& rb = b; // 编译报错:error C3892: “rb”: 不能给常量赋值 //rb++; return 0; 
}
#include<iostream> 
using namespace std; 
int main() 
{ int a = 10; const int& ra = 30; // 编译报错: “初始化”: ⽆法从“int”转换为“int &” ,此时我们加上const即可// int& rb = a * 3; const int& rb = a*3; double d = 12.34; // 编译报错:“初始化”: ⽆法从“double”转换为“int &” ,此时我们加上const即可// int& rd = d; const int& rd = d; return 0; 
}

6.5 指针和引用的关系

(面试愿意问关系题)

C++中指针和引用就像两个性格迥异的亲兄弟,指针是哥哥,引用是弟弟,在实践中他们相辅相成,功能有重叠性,但是各有特点,互相不可替代。
语法概念上引用是一个变量的取别名不开空间,指针是存储一个变量地址,要开空间。
引用在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
引用在初始化时引用一个对象后,就不能再引用其他对象;而指针可以在不断地改变指向对象。
引用可以直接访问指向对象,指针需要解引用才是访问指向对象。
sizeof中含义不同,引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
指针很容易出现空指针和野指针的问题,引用很少出现,引用使用起来相对更安全⼀些。

 7. nullptr

 NULL实际是⼀个宏,在传统的C头⽂件(stddef.h)中,可以看到如下代码:

C++中NULL可能被定义为字面常量0,或者C中被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些⿇烦,本想通过f(NULL)调用指针版本的
f(int*)函数,但是由于NULL被定义成0,调⽤了f(int x),因此与程序的初衷相悖。f((void*)NULL);
调用会报错。
C++11中引入nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字面量,它可以转换
成任意其他类型的指针类型。使用nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被
隐式地转换为指针类型,而不能被转换为整数类型。

#include<iostream> 
using namespace std; 
void f(int x) 
{ cout << "f(int x)" << endl; 
}
void f(int* ptr) 
{ cout << "f(int* ptr)" << endl; 
}
int main() 
{ f(0);
// 本想通过f(NULL)调⽤指针版本的f(int*)函数,但是由于NULL被定义成0,调⽤了f(int x),因此与程序的初衷相悖。 
f(NULL);
f((int*)NULL); 
// 编译报错:error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型 //f((void*)NULL); f(nullptr); return 0; 
}

8. inline  

在C++中, inline函数是一种特殊的函数,它允许编译器在编译时将函数的代码直接插入到每个函数调用的地方,而不是生成函数调用的代码。这样做的好处是可以减少函数调用的开销,因为不需要进行栈的压栈和弹栈操作,也没有返回地址的保存和恢复。但是, inline函数并不总是能提高程序的执行效率,因为如果函数体过大,编译器可能会忽略 inline关键字,将其当作普通函数处理 C语言实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不方便调
试,C++设计了inline目的就是替代C的宏函数
inline不建议声明和定义分离到两个文件,分离会导致链接错误。因为inline被展开,就没有函数地
址,链接时会出现报错。

相关文章:

初阶C++之C++入门基础

大家好&#xff01;欢迎来到C篇学习&#xff0c;这篇文章的内容不会很难&#xff0c;为c的引入&#xff0c;c的重点内容将在第二篇的文章中讲解&#xff0c;届时难度会陡然上升&#xff0c;请做好准备&#xff01; 我们先看网络上的一个梗&#xff1a;21天内⾃学精通C 好了&am…...

ODOO学习笔记(7):模块化架构(按需安装)

一、Odoo模块化架构概述 Odoo是一个功能强大的企业资源规划&#xff08;ERP&#xff09;系统&#xff0c;其模块化架构是它的核心优势之一。这种架构允许系统通过添加、移除或修改不同的模块来灵活地适应企业的各种业务需求。 核心模块与自定义模块&#xff1a; Odoo本身带有一…...

Java的dto,和多表的调用

1理论 需求是新增菜品eg&#xff1a;菜名:豆腐脑&#xff1b;口味&#xff1a;甜口&#xff0c;咸口&#xff0c; 菜单表&#xff1a;dish&#xff1b;口味表dish_flavor&#xff1b; 1dto:数据传输对象 新建一个dishDto对象有两个表里的属性 2用到两个表&#xff0c;dish,d…...

时序数据库TimescaleDB安装部署以及常见使用

文章目录 一、时序数据库二、TimescaleDB部署1、repository yum仓库配置2、yum在线安装3、插件配置4、TimescaleDB使用登录pg创建插件使用超表 一、时序数据库 什么是时序数据库&#xff1f;顾名思义&#xff0c;用于处理按照时间变化顺序的数据的数据库即为时序数据库&#x…...

MG算法(英文版)题解

翻译&#xff1a; 考虑一个加法流&#xff0c;其中一个特定项目出现 n^(1/2) 次&#xff0c;并且有 n - n^(1/2) - 1 个其他不同的项目&#xff0c;每个项目出现一次。在应用 Misra-Gries&#xff08;MG&#xff09;算法时&#xff0c;应该选择哪个 ε&#xff08;epsilon&…...

2-UML概念模型测试

1. (单选题, 1.0 分) UML中的关系不包括&#xff08;&#xff09;。 A. 抽象B. 实现C. 依赖D. 关联 我的答案:A正确答案: A 知识点&#xff1a; UML的构成 1.0分 2. (单选题, 1.0 分) 下列事物不属于UML结构事物的是&#xff08;&#xff09;。 A. 组件B. 类C. 节点D. 状…...

人工智能(AI)对于电商行业的变革和意义

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/402a907e12694df5a34f8f266385f3d2.png#pic_center> &#x1f393;作者简介&#xff1a;全栈领域优质创作者 &#x1f310;个人主页&#xff1a;百锦再新空间代码工作室 &#x1f4de;工作室&#xff1a;新空间代…...

智能病历xml提取

select * from (SELECT m.病人Id, m.主页Id, x.title, x.content.getclobval() 参考, x.content content --EXTRACTVALUE(x.Content, //zlxml//document//subdoc[antetypeid"3C38A8DAB01C473A9074A8EDD0B8553"]//utext) 主治医师, --EXTRACTVALUE(x.…...

RK3568平台开发系列讲解(GPIO篇)GPIO的sysfs调试手段

🚀返回专栏总目录 文章目录 一、内核配置二、GPIO sysfs节点介绍三、命令行控制GPIO3.1、sd导出GPIO3.2、设置GPIO方向3.3、GPIO输入电平读取3.4、GPIO输出电平设置四、Linux 应用控制GPIO4.1、控制输出4.2、输入检测4.3、使用 GPIO 中断沉淀、分享、成长,让自己和他人都能有…...

使用 Web Search 插件扩展 GitHub Copilot 问答

GitHub Copilot 是一个由 GitHub 和 OpenAI 合作开发的人工智能代码提示工具。它可以根据上下文提示代码&#xff0c;还可以回答各种技术相关的问题。但是 Copilot 本身不能回答非技术类型的问题。为了扩展 Copilot 的功能&#xff0c;微软发布了一个名为 Web Search 的插件&am…...

workerman的安装与使用

webman是一款基于workerman开发的高性能HTTP服务框架。webman用于替代传统的php-fpm架构&#xff0c;提供超高性能可扩展的HTTP服务。你可以用webman开发网站&#xff0c;也可以开发HTTP接口或者微服务。 除此之外&#xff0c;webman还支持自定义进程&#xff0c;可以做worker…...

QtQuick.Controls 控件介绍(都有哪些type)

这里写目录标题 主要控件 官方示例1. quickcontrols示例示例1 控制controlsSliders滑块bottom与tab 示例2 系统对话框 systemdialogs示例3 仪表盘示例4 uiforms 表格-客户通讯录 2. quickcontrols2示例1 gallery 展示2 flat Style 扁平化 帮助文档 主要控件 Button&#xff1a…...

Unity导出APK加速与导出失败总结(不定时更新)

APK导出加速 1、修改配置文件&#xff1a; 需要修改的文件位置&#xff1a;编辑器安装路径/Editor/Data/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates 1.1 settingsTemplate.gradle文件修改 直接附上最终效果&#xff1a; pluginManagement {repositories {**ART…...

域名绑定服务器小白教程

域名绑定与 Docker 容器部署指南 1. 获取云服务器公网 IP 登录云服务提供商控制台记录服务器公网 IP&#xff08;例&#xff1a;123.456.78.90&#xff09; 2. 配置域名 DNS 解析 登录域名注册商控制台添加 A 记录&#xff1a; 主机记录&#xff1a;类型&#xff1a;A值&am…...

用 Collections.synchronizedSet 创建线程安全的 HashSet

在 Java 中&#xff0c;HashSet 本身并不是线程安全的。如果在多线程环境下使用 HashSet&#xff0c;你需要采取额外的同步措施来保证线程安全。Collections 工具类提供了一种简便的方法来创建线程安全的集合——synchronizedSet 方法。这种方法通过在所有公共方法上添加同步块…...

【深度学习】模型参数冻结:原理、应用与实践

在深度学习领域&#xff0c;模型参数冻结是一种重要的技术手段&#xff0c;它在模型训练和优化过程中有着广泛的应用。本文将详细介绍模型参数冻结的相关概念、应用场景、在代码中的实现方式以及一些实际的案例分析。 一、模型参数冻结的概念 在深度学习模型的训练过程中&…...

数字后端教程之Innovus report_property和get_property使用方法及应用案例

数字IC后端实现Innovus中使用report_property可以报告出各种各样object的属性&#xff0c;主要有cell&#xff0c;net&#xff0c;PG Net&#xff0c;Pin&#xff0c;时钟clock&#xff0c;时序库lib属性&#xff0c;Design属性&#xff0c;timing path&#xff0c;timin arc等…...

JS中console对象内部提供调试方法

console.log() console.log() 是最常用的输出方法&#xff0c;用于将信息输出到浏览器控制台&#xff0c;通常用于普通的调试信息。 用途: 打印普通的消息、变量、对象等。 let user { name: "Alice", age: 25 }; console.log(user); // 输出对象 console.log(&…...

python设计模式

一、单例模式 学习目标&#xff1a;掌握单例模式的作用和写法 可以明显的看出他两是独立的对象&#xff0c;而且是两个完全不同的id 当我们希望是s1和s2是同一个对象&#xff0c;这就是我们所说的单例模式。 最后获得的都是同一个对象&#xff0c;这样就可以避免去重复的创建…...

机器学习 笔记

特征值提取 字典 from sklearn.extaction import DictVectorizer mDictVectorizer(sparseFalse)#sparse是否转换成三元组形式 data[], #传入字典数据 data1model.fit_transform(data) #使用API 英文特征值提取 from sklearn.feature_extraction.text import CountVe…...

江协科技之STM32驱动1.3寸/0.96寸/0.91寸OLED显示屏介绍

目录 编码介绍 ASCII码 汉字编码 取模软件 江协科技OLED库适用器件 SSD1306简介 模块引脚更改 0.91寸OLED适配 模块驱动必备知识 驱动代码 OLED_Font.h OLED.h OLED.c 编码介绍 ASCII码 ASCII码是一套数字到字符的映射标准&#xff0c;它规定了用什么数字表示…...

Spring Security 认证流程,长话简说

一、代码先行 1、设计模式 SpringSecurity 采用的是 责任链 的设计模式&#xff0c;是一堆过滤器链的组合&#xff0c;它有一条很长的过滤器链。 不过我们不需要去仔细了解每一个过滤器的含义和用法,只需要搞定以下几个问题即可&#xff1a;怎么登录、怎么校验账户、认证失败…...

74HC245

74HC245&#xff1a;典型的CMOS型缓冲门电路 在这里用于增加电压...

Java的static关键字和静态代码块

一、当static关键字用来修饰属性时&#xff0c;所修饰的属性就是类属性&#xff0c;而不是对象属性&#xff0c;所以可以做到全类共享。 不能用对象名去调用&#xff0c;只能用类名调用。 二、静态方法只能调用同为静态的方法和属性&#xff0c;非静态方法什么都可以调用。 三…...

Apex 批处理将 account owner 转移,同时实现关联的 opp 和 case 转移

实现和 mass transfer account 一样的功能&#xff1a; global class AccountBatchScript implements Database.Batchable<sObject>,Schedulable{String query;Id oldOwnerId xxxxxxxxxxxx;Id newOwnerId yyyyyyyyyyyy;List<Id> AccountIds new List<Id>(…...

Python | Leetcode Python题解之第557题反转字符串中的单词III

题目&#xff1a; 题解&#xff1a; class Solution:def reverseWords(self, s: str) -> str:stack, res, s [], "", s " "for i in s:stack.append(i)if i " ":while(stack):res stack.pop()return res[1:]...

Spring设计模式

设计模式 是一种软件开发中的解决方案&#xff0c;设计原则。目的是使代码具有扩展性&#xff0c;可维护性&#xff0c;可读性&#xff0c;如&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09; Spring IoC 容器默认会将 Bean 创建为单例&#xff0c;保证一个类…...

信号保存和信号处理

目录 信号保存中重要的概念 内核中信号的保存 对sigset_t操作的函数 对block&#xff0c;pendding&#xff0c;handler三张表的操作 sigpromask ​编辑 sigpending 是否有sighandler函数呢&#xff1f; 案例 信号处理 操作系统是如何运行的&#xff1f; 硬件中断 …...

网站小程序app怎么查有没有备案?

网站小程序app怎么查有没有备案&#xff1f;只需要官方一个网址就可以&#xff0c;工信部备案查询官网地址有且只有一个&#xff0c;百度搜索 "ICP备案查询" 找到官方gov.cn网站即可查询&#xff01; 注&#xff1a;网站小程序app备案查询&#xff0c;可通过输入单位…...

如何利用宏和VBA来提高文档编辑排版速度?

一个真实的文档修改需求 为什么我会去研究VBA呢&#xff1f;主要原因是今年在一个项目里写了太多的文档。文档中很多操作其实都是机械的、重复的&#xff0c;但是偏偏又很耗时。举个例子&#xff0c;当时有这么一个修改需求&#xff0c;修改文档中所有“输入输出需求表格中”添…...