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

C/C++语言基础--从C到C++的不同(上)

本专栏目的

  • 更新C/C++的基础语法,包括C++的一些新特性

前言

  • 之前更新的C语言,感谢大家的点赞+收藏+关注,接下来我们逐步也开始更新C++;
  • C语言后面也会继续更新知识点,如内联汇编;
  • 本人现在正在写一个C语言的图书管理系统,1000多行代码,包含之前所学的所有知识点,包括链表和顺序表等数据结构,请大家耐心等待!!

文章目录

  • 从C语言到C++
    • 1. 头文件
    • 2. 命名空间
      • 定义与使用
      • std
    • 3. IO设备之输入输出
    • 4. 基本数据类型
      • bool类型
      • 强弱类型
      • NULL和nullptr
      • const
        • C语言中的冒牌货
        • C++中的真货
        • const字符指针
    • 5. 变量的初始化
      • 1,概念区分
      • 2,列表初始化
      • 3,直接初始化
    • 6. 动态内存分配
    • 7. 三目运算符
    • 8. 引用
      • 什么是引用?
      • 创建引用
      • 注意事项
      • 引用的用处
      • 引用的本质
    • 9、注意:临时变量
      • 什么是临时变量
      • 临时变量的特性
      • 临时变量的产生
    • 10. if初始化

从C语言到C++

C++是为了解决C语言不是面向对象语言发明而来的,最先叫做“C with class”,后面随着C++的发展,“C with class”改名为C++,又由于C++兼容C语言,故后面将C和C++合并,称成“C/C++”。

从编译器看(以linux为例):在linux中,C语言的编译器的GCC,C++的是G++,但是G++可以编译C语言。

从语法看:C++文件中兼容任何C语言的语法,但是会比C更严格,如下:

// C:
int* a = malloc(sizeof(int));// C++:
int* a = (int*)malloc(sizeof(int))

但是C++完全兼容C语言的,所以就有了学C++必先学C的说法。

1. 头文件

C++为了兼容C,支持所有的C头文件,但为了符合C++标准,所有的C头文件都有一个C++版本的,即去掉.h,并在名子前面加c。如<cstring>和<cmath>,例如:

C语言C++
stdio.hcstdio
math.hcmath
string.hcstring
stdlib.hcstdlib

2. 命名空间

定义与使用

案例:假设在标准库中有一个变量叫做,A,但是你也定义了一个变量A,那这样就会发生冲突,这个时候最简单的办法就是修改我们自己定义的变量A的名字,比如说改为C,但是如果我就想用A呢?

这个时候,C++大叔提出了一个叫做命名空间的概念,将不同变量可以储存在不同空间中,这样就很容易区分了。本质上就是定义一个范围,将不同变量储存到不同范围里。

  • 定义方式
namespace name			//name为自定义命名空间名
{//代码声明
}
  • 使用方式
name::code;					//code可以是变量或函数...
using  name::code;			//只使用name下面的code
using namespace name;		//使用name里面的所有内容

std

std是什么?

std是一个空间的ID,就像我们人的身份证一样,在该空间中储存了所有标准库的变量、函数、类…………,比如说输出输出:std::cin、std::cout

为什么将cout放到命名空间中?

是因为像cout这样的对象在实际操作中或许会有好几个,比如说你自己也可能会不小心定义了一个对象叫cout,那么这两个cout对象就会产生冲突,尤其是再引入多库的时候,虽然是不同的库,但是函数名字一样,这个时候编译器就会发现不识别的情况。

3. IO设备之输入输出

前言:IO运用是非常广泛的,学到后面会发现到输出IO设备(软件、硬件)

  • C语言的的输入输出用的主要是scanf()、printf()函数
  • 而C++是使用类对象cin、cout进行输入输出
  • 如下:
int a;
double b;
char name[20];
std::cin >> a >> b >> name;
std::cout << a << b << name;
  • cin 输入流对象

  • cout 输出流对象

  • endl 换行,并清空输出缓冲区(end line 结束一行,并另起一行)

  • \n照样可以在cout中使用

  • 也可以换个写法:

  • using namespace std;   // 声明使用的标准库
    int a;
    double b;
    char name[20];
    cin >> a >> b >> name;   // 可以省略std::
    cout << a << b << name;
    

4. 基本数据类型

bool类型

C++和C语言的基本数据类型几乎一样

char 	short 	int  long long	float 	double 	unsigned 	signed ...

值得注意的是,C语言中虽然也有bool(布尔类型),但是需要包含头文件<stdbool.h>,而在C++中则不用,直接使用即可。

bool cmpare(int a,int b)
{return a > b;
}
cout << compare(2,3) << endl;// 输出:0

注意:在C++中,bool类型如果想输出true、false,需要加上一点东西:

 std::cout << boolalpha << compare(2,3) << std::endl;

加上boolalpha这个,起到格式化作用。

强弱类型

  • C语言:强类型,弱检查—— 一般就叫做弱类型了,对变量定义不严格,很多东西不检查
void* p = NULL;
int* p1 = p;int* pn = NULL;
void* pp = pn;
//无报错,无警告,完美

在C语言中,void*可以和其他类型指针相互转换!

  • C++:强类型,强检查 —— 真正意义上的强类型
void* p = NULL;
int* p1 = p;		//错误	“初始化”: 无法从“void *”转换为“int *”int* pn = NULL;
void* pp = pn;		//正确	任意类型的指针都可以自动转为万能指针

在C++中,void*不能直接转换为其他类型的指针,但是可以把其他类型的指针转为void*

NULL和nullptr

NULL在C语言作用是,给指针赋值为空,但是查阅源码,我们可以发现:

#ifdef __cplusplus#define NULL 0
#else#define NULL ((void *)0)
#endif

NULL本质是一个宏定义,实现机制的将0转化为void*类型数据,但是在C++中,**void***是不能转换成其他类型的,故从源码来看,他会转化为0(C++中),这明显是不对的,故在C++中引入了nullptr代表空指针.

接下来我们来看一个C++中使用NULL的例子,代码如下所示:

#include<iostream>
using namespace std;void func(int x)
{cout << __FUNCSIG__<< endl;
}void func(char* px)
{cout << __FUNCSIG__ << endl;
}int main()
{//都调用的整数版本的func函数func(2);			//void __cdecl func(int)func(NULL);			//void __cdecl func(int)return 0;
}

从运行结果来看,无论是数字还是NULL都是调用的,参数为int类型的函数,这是毋庸置疑的,C++中NULL就是0,但是这个结果更本不符合语义,我们传NULL,肯定是想传一个空指针进去的,而不是作为一个整数0,使用nullptr

int main()
{func(2);			//void __cdecl func(int)func(nullptr);		//void __cdecl func(char *)return 0;
}

const

C语言中的冒牌货

const作用是说明那个变量不能修改,但是C语言中的const并不是真正的常量,只是表示const修饰的变量为只读。

const int num = 18;

通过指针间接修改只读变量的值:

int* pt = (int*)&num;
*pt = 19;
printf("%d %d\n", num,*pt);		//output:19 19

可以看到常量it的值已经通过指针被间接改变,但是C++中不行。

C++中的真货

为了兼容C语言做出了什么改变?

int* pt = (int*)&num;
*pt = 19;
cout << num << " " << *pt << endl;		//output:18 19
  • 明明已经通过指针修改了a值,为什么输出却没有变呢?
  • 解释(重要)
    C++编译器当碰见常量声明时,在符号表中放入常量,那么如何解释取地址呢?(编译期间即可确定)
    编译过程中若发现对const使用了&操作符,则给对应的常量单独分配存储空间(为了兼容C)

const 的奇葩情况

当给C++中的常量赋值一个变量时,它又变得和C语言一样了;(在程序运行期间分配内存)

int num = 20;const int a = num;					//赋值变量
int* p = (int*)&a;
*p = 21;
cout << a << " " << *p << endl;	  //output:21 21
const字符指针

在C++中const修饰的字符指针,不能直接赋值给没有const修饰的指针,需要强制类型转换,或者把被赋值的指针也声明为const。

char* name = "maye";		//错误,C语言中可以
const char*name ="maye";	//正确
  • 函数参数为字符指针的时候需要特别注意
void show(char* name)
{cout << name << endl;
}
void test()
{show("maye");	//"const char *" 类型的实参与 "char *" 类型的形参不兼容//void show(const char* name)	//请把函数原型里的参数加上const
}

5. 变量的初始化

在C++中变量的初始化,有了很多简单有趣的操作。

1,概念区分

在C++语言中,初始化赋值并不是同一个概念:

初始化创建变量时赋予其一个初始值。

赋值:把对象(已经创建)的当前值擦除,而用一个新值来代替。

2,列表初始化

作为C++11新标准的一部分,用花括号来初始化变量得到了全面应用(在此之前,只是在初始化数组的时候用到)。列表初始化有两种形式,如下所示:

int a = 0;			//常规
int a = { 0 };		
int a{ 0 };

说明:上述的两种方式都可以将变量a初始化为0。

2.1 局限

当对内置类型使用列表初始化时,若初始值存在丢失的风险,编译将报错,如:

int a = 3.14;	//正确,编译器会警告		“初始化”: 从“double”转换到“int”,可能丢失数据
int a = {3.14};	//错误,编译器会报错		从“double”转换到“int”需要收缩转换

3,直接初始化

如果在新创建的变量右侧使用括号将初始值括住(不用等号),也可以达到初始化效果

int a(20);

其他实例:

const char* name("wy");
char sex[3]("男");const char* name{ "wy" };
char sex[3]{"男"};cout << name << " "<<sex << endl;char id[5]{ 1,2,3,4,5 };	//正确
char id[5](1,2,3,4,5);		//错误

6. 动态内存分配

在C语言中是利用库函数malloc和free来分配和释放内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。

malloc的职责仅仅是分配内存,new除了分配内存外,还干一件事,调用构造函数,但是malloc的底层调用的是malloc

free的职责仅仅是释放内存,delete除了释放内存之外,还干一件事,调用析构函数,但是delete的底层调用的是free

  • 申请对象:
Type* pointer = new Type;
//...
delete pointer;

示例:

int* p = new int;
cout<<*p<<endl;	
delete p;

以上代码输出-842150451据此可以知道,new是不会自动初始化内存的,那么我们可以在new的时候,指定初始值,简单方便!

int *p = new int(18);
  • 申请对象数组:
Type* pointer = new Type[N];
//...
delete[] pointer;	//数组的释放必须加上[]

示例:

int* parr = new int[5];
for (int i = 0; i < 5; i++)
{cout << parr[i] << " ";
}
delete[] parr;

output:-842150451 -842150451 -842150451 -842150451 -842150451输出时垃圾值,同样的,也可以在new的时候初始化,因为野指针很恐怖的!!!

int* parr = new int[5]{0};
  • 定位放置

一般来说,使用new申请空间时,是从系统的“堆”(heap)中分配空间。申请所得的空间的位置时根据当时的内存的实际使用情况决定的。但是,在某些特殊情况下,可能需要在指定的特定内存创建对象,这就是所谓的**“定位放置new”**(placement new)操作。

定位放置new操作的语法形式不同于普通的new操作:

  • 一般都用如下语句A* p=new A,申请空间,
  • 定位放置new操作则使用如下语句A* p=new (ptr) A,申请空间,其中ptr就是程序员指定的内存首地址。
Type* pointer = new(ptr) Type;
//根据情况是否释放内存

示例:

int a = 123;
int* p = new(&a) int;
cout << a << " " << *p << endl;	//123 123

通过定位放置new,把对象a所在的空间首地址,返回了回来,所以输出的值也是123。在这里不需要释放内存哦!

小结:

  • new 和 malloc不要混用
  • 分配内存使用完,记得释放内存(数组和普通变量释放有些微区别)

7. 三目运算符

三目运算符,又名条件运算符。可以在合适的情况下,代替if…else…语句,让代码变得更简洁。

在C语言和C++中的条件表达式的值的类型是不一样的,C语言中返回的是一个值,也就是常量;C++中返回的是变量本身,如下:

void test()
{int a = 2;int b = 3;int max = (a>b?a:b);	//获取ab中最大的值				   C √  C++ √(a>b?a:b) = 66;			//把ab中最大的那个变量,赋值为66	   C ×	C++ √
}
  • 无论是在C语言还是C++中,条件表达式都可以作为一个值,赋值给其他变量;
  • 所以,C语言中的条件表达式不能作为左值,即不能赋值,而在C++中却是可以的,因为C:返回变量值,C++:返回左值。

思考:既然说C++中返回的是变量的本身,那在C语言中如何模拟呢

C语言还有一个可以修改变量内容的东西,可以突破作用域,那就是指针

*(a > b ? &a : &b) = 520;

8. 引用

什么是引用?

引用就是一个变量名字的别名,当int A;赋值给int& B = A;的时候,A就是B,B就是A,A、B一样,语法如下:

Type &refName = variable_name;

创建引用

先来定义一个变量。

int i = 18;

再为变量i声明一个引用。

int& r = i;

在这些声明中,& 读作引用。因此,第一个声明可以读作 “r 是一个初始化为 i 的整型引用”;

cout<<i<<" "<<r<<endl;

i和r的值都为18,因为他们两个其实都是同一块内存空间的名字。

r = 20;
1cout<<i<<" "<<r<<endl;

当通过引用修改了值之后,i的值也会发生变化,都输出20。

注意事项

  • 引用必须初始化
int& refa;		//错误 没有初始化
int a = 8;
int& refa = a;	//正确 
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象(只是把b的值赋值给了refa,而不是让refa引用b),因为引用的本质就是:常量指针
int a = 8,b = 9;
int& refa = a;
refa = b;		//** 只是把b的值赋值给了refa **,而不是让refa引用b
  • 如果要引用右值,那么必须使用常量/右值引用 临时变量的机制
int& refc = 12;			//错误 “初始化”: 无法从“int”转换为“int &”,非常量引用的初始值必须为左值
const int&refc =12;		//正确 
  • 当然,也可以使用右值引用来引用常量;或者使用std::move()把左值转成右值

    • 右值引用,尤其是在指针、指针指针上用处特别大,结合std::move

      int&& refr = 21;
      
    • 引用经过std::move()转换过的变量

      int a = 123;
      int&& refr = 21;
      

    常引用和右值引用有什么区别呢?

    1,常引用引用的值是不可以修改的;但是右值引用引用的值是可以修改的!(大多数情况用常引用:函数参数)

    2,右值引用一般实现资源权限的转移

引用的用处

  • 作为函数参数
//在函数内部改变实参的值需要传变量的地址
void fun(int* n)
{*n=18
}
//指针是非常危险的,因为指针所指向的内存空间,不确定,需要额外判断
fun(nullptr);	//传nullptr 会发生中断//在C++中,除了使用指针外,还可以通过引用来达到这个目的
void fun(int& n)
{n=18
}
  • 作为函数返回值
int& getAge()
{int age = 18;return age;		//注意:不要返回局部变量的引用或地址,可以使用静态变量或全局变量替代
}
int& refAge = getAge();
refAge = 23;

引用的本质

引用如此神奇,那么引用的本质到底是什么呢?

  • 引用在C++中,内部实现是一个常指针:type &name <==> type*const name
  • 发明引用就是,**(二级指针)难以区分,而且也不好看,故发明引用,可以减少一个*的使用。

9、注意:临时变量

这个本来之前就该更新的,但是忘了,在我的笔记中记录在这里。

什么是临时变量

//一个例子
double a = 10.82;
int& b = (int)a;   //会报错,常引用不能作为左值
/*
*原因:
*强制转换是先生成一个临时变量 10 ,然后在赋值给变量储存,如果没有变量储存就会立马被释放
*解决:右值引用,const常引用
*/

临时变量的特性

  • 都要被const修饰
  • 临时变量不能被非常引用修饰(常引用与右值引用的不同点:看上面(两点))

临时变量的产生

  1. 类型转换
  2. 调用函数的时候,将实参数的值传递给形参时
  3. 在函数返回时候,返回值也会以临时变量的形式返回

复制构造函数的时候, 请务必遵循规范, 加上const.

10. if初始化

在C++17开始,就可以直接在if中初始化了,如下:

if(int v = 10; v > 9) {std::cout << "Hello World" << std::endl;
}

相关文章:

C/C++语言基础--从C到C++的不同(上)

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 之前更新的C语言&#xff0c;感谢大家的点赞收藏关注&#xff0c;接下来我们逐步也开始更新C&#xff1b;C语言后面也会继续更新知识点&#xff0c;如内联汇编&#xff1b;本人现在正在写一个C语言的图书管理系…...

自动驾驶自动泊车场景应用总结

自动泊车技术是当前智能驾驶技术的一个重要分支,其目标是通过车辆自身的感知、决策和控制系统,实现车辆在有限空间内的自主泊车操作。目前自动泊车可分为半自动泊车、全自动泊车、记忆泊车、自主代客泊车四种产品形态,其中, 根据搭载传感器和使用场景的不同,全自动泊车又可…...

redis常见的数据类型?

参考&#xff1a;一文读懂Redis五种数据类型及应用场景 - 知乎 (zhihu.com) String 类型 String 类型&#xff1a;Redis 最基本的数据类型&#xff0c;它是二进制安全的&#xff0c;意味着你可以用它来存储任何类型的数据&#xff0c;如图片、序列化对象等。使用场景&#xff…...

TCP Analysis Flags 之 TCP ZeroWindow

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…...

[产品管理-16]:NPDP新产品开发 - 14 - 产品创新流程 - 产品创新流程模型比较:门径、IPD、精益生产、敏捷、系统工程、设计思维、精益创业

目录 一、精益开发与敏捷开发的比较 1、核心理念 2、实践方式 3、应用场景 4、总结 二、门径流程 VS 敏捷方法 1、定义与特点 门径管理流程 敏捷方法 2、应用场景 3、比较 4、总结 三、集成产品开发 VS 系统工程 VS 设计思维 1、集成产品开发&#xff08;IPD&…...

postgresql 导出CSV格式数据

方法一 psql -c 导出 导出的文件存放在执行psql的客户端。 psql -h 127.0.0.1 -p 5432 -U postgres postgres -Atqc "select oid,relname,relnamespace from tmp_t0 " --csv -o /tmp/test.csv方法二 psql -f 导出 导出的文件存放在执行psql的客户端。 如果查询很长…...

【C++】STL--string(上)

前言 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户自己管理&#xff0c;稍不留…...

【C++】Stack

个人主页~ Stack 一、Stack的介绍和使用1、stack的介绍2、stack的使用3、stack的模拟实现 二、容器适配器1、什么是适配器2、容器适配器的使用 三、deque1、原理介绍2、deque的使用3、deque的缺陷 一、Stack的介绍和使用 1、stack的介绍 stack详细解释 stack是一种容器适配器…...

“药乡”怀化,按下产业向海“加速键”

怀化&#xff0c;这座被火车拖来的城市&#xff0c;拥有什么独特的产业优势吗&#xff1f; 很多人不知道的是&#xff0c;怀化在整个医药领域可是大名鼎鼎的“中国道地药材之乡”&#xff0c;中药材资源蕴藏量居湖南省第一。尤其是怀化靖州&#xff0c;这里年集散茯苓11万吨&a…...

【AWDP】 AWDP 赛制详解应对方法赛题实践 量大管饱

文章首发于【先知社区】&#xff1a;https://xz.aliyun.com/t/15535 一、AWDP概述 AWDP是什么 AWDP是一种综合考核参赛团队攻击、防御技术能力、即时策略的攻防兼备比赛模式。每个参赛队互为攻击方和防守方&#xff0c;充分体现比赛的实战性、实时性和对抗性&#xff0c;对参…...

读构建可扩展分布式系统:方法与实践05分布式缓存

1. 分布式缓存 1.1. 缓存存在于应用程序的许多地方 1.1.1. 行应用程序的CPU具有高速多级硬件缓存&#xff0c;可以减少相对较慢的主内存访问 1.1.2. 数据库引擎可以利用主内存来缓存数据存储的内容&#xff0c;这样在许多情况下查询就可以不用访问速度相对较慢的磁盘 1.2. …...

【逐行注释】自适应Q和R的AUKF(自适应无迹卡尔曼滤波),附下载链接

文章目录 自适应Q的KF逐行注释的说明运行结果部分代码各模块解释 自适应Q的KF 自适应无迹卡尔曼滤波&#xff08;Adaptive Unscented Kalman Filter&#xff0c;AUKF&#xff09;是一种用于状态估计的滤波算法。它是基于无迹卡尔曼滤波&#xff08;Unscented Kalman Filter&am…...

OpenCV高阶操作

在图像处理与计算机视觉领域&#xff0c;OpenCV&#xff08;Open Source Computer Vision Library&#xff09;无疑是最为强大且广泛使用的工具之一。从基础的图像读取、 1.图片的上下&#xff0c;采样 下采样&#xff08;Downsampling&#xff09; 下采样通常用于减小图像的…...

Vue中的防抖和节流是什么,它们的作用是什么?

在Vue.js中&#xff0c;防抖&#xff08;debounce&#xff09;和节流&#xff08;throttle&#xff09;是两种常用的性能优化技术&#xff0c;主要用于处理高频事件&#xff0c;如窗口滚动、窗口大小调整、键盘输入等。 **防抖&#xff08;Debounce&#xff09;**&#xff1a;…...

C++的类与对象中(主讲默认成员函数)

目录 1.类的默认成员函数 2.构造函数 1.全缺省构造函数 2.第7点中的对自定义类型的成员变量构造&#xff08;调用编译器自动生成的默认构造函数&#xff09; 3.析构函数 4.拷贝构造函数 5.运算符重载 1.概念 2.赋值运算符重载 6.const成员函数 1.类的默认成员函数 默…...

C#学习系列之Gmap地图界面上的实时绘制问题

C#学习系列之Gmap地图界面上的实时绘制问题 前言总结 前言 在地图控件上增加绘制不规则图形&#xff0c;在之前的经验来看&#xff0c; System.InvalidOperationException:“无法使用 DependencyObject&#xff0c;它属于其父 Freezable 之外的其他线程。” 其实就是ui线程中…...

Spring Boot中实现定时任务的主要方式

文章目录 在Spring Boot中实现定时任务&#xff0c;主要有以下几种方式&#xff1a;1. 使用Scheduled注解2. 使用Quartz调度器使用Quartz调度器(更好的做法)3. 使用TaskExecutor和ScheduledExecutorService4.总结 在Spring Boot中实现定时任务&#xff0c;主要有以下几种方式&a…...

C#使用HttpWebRequest下载文件

public static bool HttpDownloadFile(string downloadUrl, string localPath, log4net.ILog log) { bool bFlagDownloadFile false; //log.Debug("HttpDownloadFile--准备以HTTP的方式下载文件&#xff0c;url:[" downloadUrl &…...

Linux: virtual: qemu-kvm: top cpu usage的组成是否包含guest的使用?

文章目录 问题试验mpstat问题 最近看一个问题,看到一个虚拟机分配的cpu是:3-4,27-28 Cpus_allowed: 0000,18000018 Cpus_allowed_list: 3-4,27-28 使用top看qemu-kvm进程的cpu usage是:13.3%: [root@qrms6-host01 14278]# top -p 14278 top - 01:19:35 up 4 days...

【03】深度学习——神经网络原理 | 多层感知机 | 前向传播和反向传播 | 多层感知机代码实现 | 回归问题、分类问题 | 多分类问题代码实现

深度学习 1.神经网络原理1.1神经元模型1.2神经网络结构1.3隐藏层1.3.1激活函数层1.4输出层1.4.1softmax层1.5损失函数1.6反向传播2.多层感知机2.1线性网络的局限性2.2引入非线性2.3多层感知机(Multi-Layer Perceptron,MLP)2.4激活函数(Activation Function)2.4.1Sigmoid函…...

MySQL行锁的实践

在MySQL中&#xff0c;根据加锁的粒度&#xff0c;可以将数据库的锁细分为表锁、行锁、页锁。其中&#xff0c;表锁(Table Lock)是一种粗粒度的锁&#xff0c;它锁定整个表&#xff0c;阻止其他事务访问表中的任何行&#xff1b;行锁(Row Lock)是一种细粒度的锁&#xff0c;它锁…...

iOS 18 將在 9 月 16 日正式上線

現在有了正式的上線日期了。一如往常的&#xff0c;它會在 iPhone 16 系列正式推出前的 9 月 16 日先行上線。 iOS 18 最受矚目的無疑是它的 Apple Intelligence 功能&#xff0c;不過並非所有的 iPhone 機種都能享用&#xff0c;而是只有去年的 iPhone 15 Pro 和 Pro Max 才能…...

css选择器有几种?选择器的优先级是怎样的?

CSS选择器的主要分类 元素选择器&#xff08;Type Selectors&#xff09;&#xff1a;选择HTML文档中的特定类型的元素。 示例&#xff1a;p { color: red; } 类选择器&#xff08;Class Selectors&#xff09;&#xff1a;选择具有指定类名的元素。 示例&#xff1a;.myClass …...

果蔬识别系统性能优化之路(四)

目录 前情提要剩下问题 问题排查解决方案下一步 前情提要 果蔬识别系统性能优化之路&#xff08;三&#xff09; 剩下问题 同步数据库数据并初始化ivf依然要8,9秒 问题排查 通过断点加时间打印&#xff0c;发生其实初始化ivf的时间很快&#xff0c;慢的是数据在网络间的传…...

kafka之protobuf

Protobuf 的 .proto 文件是一种描述消息结构的定义文件&#xff0c;使用这种文件可以定义数据结构&#xff08;消息&#xff09;&#xff0c;然后生成对应语言的类或代码用于序列化和反序列化数据。生成 .proto 文件涉及到编写 .proto 文件定义&#xff0c;然后通过 protoc 编译…...

BARTBERT

BART和BERT都是基于Transformer架构的预训练语言模型。 模型架构&#xff1a; BERT (Bidirectional Encoder Representations from Transformers) 主要是一个编码器&#xff08;Encoder&#xff09;模型&#xff0c;它使用了Transformer的编码器部分来处理输入的文本&#xff0…...

C++ 11新特性(1)

文章目录 C11新特性之auto和decltype知识点autoauto推导规则什么时候使用auto&#xff1f; decltypedecltype推导规则 auto和decltype的配合使用 C11新特性之左值引用、右值引用、移动语义、完美转发左值、右值纯右值、将亡值纯右值将亡值左值引用、右值引用 移动语义深拷贝、浅…...

彻底理解浅拷贝和深拷贝

目录 浅拷贝实现 深拷贝实现自己手写 浅拷贝 浅拷贝是指创建一个新对象&#xff0c;这个对象具有原对象属性的精确副本 基本数据类型&#xff08;如字符串、数字等&#xff09;&#xff0c;在浅拷贝过程中它们是通过值传递的&#xff0c;而不是引用传递&#xff0c;修改值并不…...

Spring4-IoC2-基于注解管理bean

目录 开启组件扫描 使用注解定义bean Autowired注入 场景一&#xff1a;属性注入 场景二&#xff1a;set注入 场景三&#xff1a;构造方法注入 场景四&#xff1a;形参注入 场景五&#xff1a;只有一个构造函数&#xff0c;无注解 场景六&#xff1a;Autowired和Quali…...

AI基础 L22 Uncertainty over Time I 时间的不确定性

Time and Uncertainty 1 Time and Uncertainty States and Observations • discrete-time models: we view the world as a series of snapshots or time slices • the time interval ∆ between slices, we assume to be the same for every interval • Xt: denotes the se…...