【C++奇妙冒险】拷贝构造函数、运算符重载(赋值重载|const成员|取地址重载|const取地址重载)

文章目录

  • 前言
  • 🚩拷贝构造函数
    • 🫧概念
    • 🫧特征
    • 🫧默认生成的拷贝构造
    • 🫧default关键字(浅谈)
  • 🚩运算符重载
    • 🫧概念
    • 🫧运算符重载注意事项
    • 🫧封装如何保证?
  • 🚩赋值运算符重载
    • 🫧赋值运算符重载格式
    • 🫧返回值引用和不加引用的区别
    • 🫧赋值运算符只能重载成类的成员函数不能重载成全局函数
    • 🫧编译器生成的默认赋值运算符重载
  • 🚩const成员
    • 🫧const 成员
    • 🫧const修饰成员函数
      • 🔺小结
    • 🫧思考
  • 🚩取地址及const取地址重载
    • 🫧取地址重载
    • 🫧const取地址重载
    • 🫧取地址重载和const取地址重载一般不需要重载


前言

🚩拷贝构造函数

创建对象时,可否创建一个与已存在的对象一模一样的新对象呢?
可以的
用拷贝构造就能做到:

	Date d1(2024, 5, 28);Date d2(d1);return 0;

什么原理?我们下面会讲,反正不是张力…

🫧概念

拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在已存在的类类型对象创建新对象时,由编译器自动调用

🫧特征

拷贝构造函数也是特殊成员函数,特征如下:

  • 拷贝构造函数是构造函数的一个重载形式
  • 拷贝构造的参数只有一个且必须是类类型对象的引用(必须使用引用)
    注:使用传值方式编译器直接报错,因为会引发无穷递归调用
  • 若未显示定义,编译器会生成默认的拷贝构造
    默认的拷贝构造函数对象按内存存储,按字节序完成拷贝(浅拷贝or值拷贝)
原型:类名 (const 类名& 形参)
例如:Date(const Date& d)

拷贝构造函数的用法:
代码:

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 2024, int month = 5, int day = 28){_year = year;_month = month;_day = day;}// 拷贝构造函数// Date d2(d1)Date(const Date& d) // 不传引用会无限递归调用{_year = d._year;_month = d._month;_day = d._day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2024, 5, 28);d1.Print();Date d2(d1); //拷贝构造 ,生成一个和d1一模一样的对象d2.Print();return 0;
}

运行结果

在这里插入图片描述

上述代码所示,为什么一定要传引用传参呢?
调用拷贝构造,需要传参,传值传参又是一个拷贝构造
然后调用这个拷贝构造,又需要传参,然后传值传参又是一个拷贝构造
然后又调用拷贝构造…
如下图所示:

在这里插入图片描述

运行结果:

在这里插入图片描述
报错了o(╥﹏╥)o
这就是不加引用的后果,const想加就加,如果你不想改变函数体,就建议加上const。

🫧默认生成的拷贝构造

我们前面了解了拷贝构造函数的特性,“若未显示定义,则编译器会生成默认的拷贝构造函数
那它对内置类型和自定义类型是如何处理的呢?

代码测试:

#include<iostream>
using namespace std;
class Time
{
public:// 构造函数Time(int hour = 1, int minute = 1, int second = 1){_hour = hour;_minute = minute;_second = second;}// 拷贝构造 Time(const Time& t){_hour = t._hour;_minute = t._minute;_second = t._second;cout << "Time(const Time& t)" << endl;}
private:int _hour;int _minute;int _second;
};
class Date
{
public:// 构造函数Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
private:// 内置类型int _year;int _month;int _day;// 自定义类型Time _t;
};
int main()
{Date d1(2024, 5, 28);// 用已经存在的 d1 拷贝构造 d2 此处会调用Date类的拷贝构造// 但Date类并未显示定义拷贝构造 则编译器会为Date类自动生成一个默认拷贝构造函数Date d2(d1);return 0;
}

运行结果

在这里插入图片描述

通过调试观察

在这里插入图片描述

所以,默认生成的拷贝构造函数:

  • 对内置类型:按照字节方式直接拷贝的
  • 对自定义类型:调用其拷贝构造函数完成拷贝的

编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,还需要自己显式实现吗?
当然,像我们这样日期类的是可以不用自己写的,但是像栈(Stack)这样的类,如果Stack st1 拷贝构造出 Stack st2 这会导致它们都指向同一块空间,从而对同一块空间析构两次,造成程序崩溃。

注意:类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请时,则拷贝构造函数是一定要写的,否则就是浅拷贝。

拷贝构造函数的经典调用场景:

  • 使用已存在对象创建新对象
  • 函数参数类型为类类型对象
  • 函数返回值类型为类类型对象

为了提高程序效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景,能用引用尽量使用引用

🫧default关键字(浅谈)

我们知道,拷贝构造也是构造函数
🌰
🗨️代码演示:

#include<iostream>
using namespace std;
class Time
{
public://拷贝构造函数Time(const Time& t){_hour = t._hour;_minute = t._minute;_second = t._second;}
private:int _hour;int _minute;int _second;
};
class Date
{
public:
private:// 内置类型int _year;int _month;int _day;// 自定义类型Time _t;
};
int main()
{Date d1;Date d2(d1);return 0;
}

运行结果

在这里插入图片描述

报错了,d1没初始化?编译器不是会默认生成一个构造函数帮我们初始化吗,为什么这里没有?

解答:拷贝构造本身就是一种构造函数,所以编译器不会生成默认构造函数
1️⃣ Date d1;
上述代码中,Date类的实现需要调用Time类中的默认构造函数来初始_t,而在Time类中,没有显示定义一个无参的默认构造函数,只有一个拷贝构造函数,所以当编译器尝试调用Time类中的默认构造函数时,会失败(找不到)。
当实例化Date类中的d1时,Date类默认生成的构造函数会被调用,会对类中的成员变量进行初始化,_year,_month,_day这些都没问题,确实已经初始化了,问题就出在自定义类型_t中,_t需要调用它的Time类中的无参默认构造函数,而它没有,所以报错了

2️⃣ Date d2(d1)
当我们尝试使用拷贝构造,d1创建d2时,同样的道理,而且d1都初始化失败了,拿什么创建d2,所以理所应当也会出问题
一样的,编译器会调用Date类的拷贝构造,逐一拷贝_year,_month,_day成员变量,_t当然也没问题,因为Time类中有我们写的拷贝构造函数,但是我们在创建d1的时候就出问题了,所以d2也会出错

在C++中,我们可以加上这样一条代码

Time()=default;

让编译器强制生成拷贝构造

🚩运算符重载

🫧概念

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

🏳️ 函数名字为:关键字operator后面接需要重载的运算符符号。

//例如:
operator<
operator>
operator==

🏳️ 函数原型:返回值类型 operator操作符(参数列表)

🫧运算符重载注意事项

注意:

  • 不能通过连接其他符号来创建新的操作符:比如 operator@ ❌️
  • 重载操作符必须有一个类类型参数
  • 用于内置类型的运算符,其含义不能变,例如:内置的整形+,不能改变其含义
  • 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
  • .*(点星运算符),::(域运算符),sizeof ,?:(三目运算符) .(点运算符) 以上5个操作符不能重载。

🗨️代码演示:全局的operator==

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 2024, int month = 5, int day = 28){_year = year;_month = month;_day = day;}
//private:int _year;int _month;int _day;
};
// d1 == d2
bool operator==(const Date& d1, const Date& d2)
{return d1._year == d2._year && d1._month == d2._month && d1._day == d2._day;
}
int main()
{Date d1(2024, 5, 28);Date d2(2024, 5, 27);cout << (d1 == d2) << endl;return 0;
}

运行结果

在这里插入图片描述

这里细心的老铁可能发现了,运算符重载成全局的就需要成员变量是公有的,如上述代码可见,我把private给注释掉了。
在这里插入图片描述

那么问题来了,封装性如何保证?

🫧封装如何保证?

可以用友元,但是这里我们直接重载成函数就好了。

🗨️代码演示:

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}// d1 == d2// 函数原型:bool operator==(Date* this,const Date& d2)// 这里需要注意的是,左操作数是this,指向调用函数的对象bool operator==(const Date& d2){return _year == d2._year&& _month == d2._month&& _day == d2._day;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2024, 5, 20);Date d2(2024, 5, 21);cout << (d1 == d2) << endl;return 0;
}

🚩赋值运算符重载

🫧赋值运算符重载格式

  • 返回参数:const T&,传递引用可以提高效率
  • 返回值类型:T&,返回引用可以提高效率,有返回值的目的是为了连续赋值
  • 检测是否自己给自己赋值
  • 返回*this:要符合连续赋值的含义

🗨️代码演示:
d1 = d2

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 2024, int month = 5, int day = 28){_year = year;_month = month;_day = day;}Date& operator=(const Date& d){// &d 是取地址if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;// 返回左操作数d1}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2024, 5, 28);Date d2(2024, 5, 27);d1 = d2;// 两个已经存在的对象return 0;
}

上述代码中,if 语句就是防止自己给自己赋值。

🫧返回值引用和不加引用的区别

Date& operator=(const Date& d) // 加上引用
{...}
Date operator=(const Date& d)  // 去掉引用
{...}

🗨️代码演示:

#include<iostream>
using namespace std;
class Date
{
public:// 构造函数Date(int year, int month, int day){_year = year;_month = month;_day = day;}// 拷贝构造Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;cout << "Date(const Date& d)" << endl;}// 赋值重载Date operator=(const Date& d){if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;//返回d1}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2024, 5, 28);Date d2(2024, 5, 20);Date d3(2024, 5, 21);d1 = d2 = d3;return 0;
}

运行结果:

在这里插入图片描述
调用了两次拷贝构造函数
1️⃣ 第一次调用:是d2=d3,因为是从左往右的,所以d2=d3先
又因为传值返回不会直接返回对象,而是生成一个拷贝构造
由下图可见,d3拷贝给给d2
在这里插入图片描述

2️⃣
d2=d3这个过程结束后,会生成一个临时变量“tmp”,再把tmp作为返回值调用,又因为传值返回不会直接返回对象,而是生成一个拷贝构造,此时调用了两次拷贝构造。

在这里插入图片描述
3️⃣
这里我们再把引用&加上
🗨️代码演示:

	Date& operator=(const Date& d){if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;}

调试结果:

在这里插入图片描述
我去!减少了拷贝调用,神奇

🫧赋值运算符只能重载成类的成员函数不能重载成全局函数

🗨️代码演示:

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}int _year;int _month;int _day;
};
// 赋值运算符重载成全局函数,注意重载成全局函数时没有this指针了,需要给两个参数
Date& operator=(Date& left, const Date& d)
{if (&left != &d){left._year = d._year;left._month = d._month;left._day = d._day;}return left;
}
// 报错

运行结果:

在这里插入图片描述

原因:赋值运算符如果不显式实现,编译器会生成一个默认的。此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。

🫧编译器生成的默认赋值运算符重载

赋值重载其实也是默认成员函数之一
我们不写,编译器会自己生成
在这里插入图片描述
1️⃣对于内置类型
🗨️代码演示:

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2024, 5, 28);Date d2(2024, 5, 20);d1 = d2;return 0;
}

调试结果:

在这里插入图片描述
2️⃣对于自定义类型:
🗨️代码演示:

#include<iostream>
using namespace std;
class Time
{
public:Time(int hour = 1, int minute = 1, int second = 1){_hour = hour;_minute = minute;_second = second;}Time& operator=(const Time& t){if (this != &t){_hour = t._hour;_minute = t._minute;_second = t._second;}return *this;}
private:int _hour;int _minute;int _second;
};
class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;Time _t;
};
int main()
{Date d1(2024, 5, 20);Date d2(2024, 6, 21);d1 = d2;return 0;
}

调试结果
在这里插入图片描述

用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝
所以,默认生成的赋值运算符重载

  • 内置类型成员变量是直接赋值的
    会完成字节序值拷贝 —— 浅拷贝
  • 自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值
    调用它的 operator= 赋值

疑问:既然编译器会自己默认生成,已经可以完成字节序的值拷贝了,我们还需要自己实现吗?
和上面刚刚讲的拷贝构造那儿意思一样,日期类可以这样,有时候还是需要自己实现的,这里我就不多赘述了

🚩const成员

🫧const 成员

🗨️代码演示:

#include<iostream>
using namespace std;
class Date
{
public:Date(){_year = 2024;_month = 5;_day = 29;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;d1.Print();Date d2;d2.Print();return 0;
}

运行结果:

没问题,编译成功
在这里插入图片描述

但是如果我们用const来修饰这个对象呢?

🗨️代码演示:

#include<iostream>
using namespace std;
class Date
{
public:Date(){_year = 2024;_month = 5;_day = 29;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;d1.Print();// 同样的代码 就加了个关键字const Date d2;d2.Print();return 0;
}

运行结果

在这里插入图片描述

编译器报错是因为在尝试调用d2.Print();时,Print()函数没有被声明为const成员函数,而d2是一个常量对象,因此编译器无法允许在常量对象上调用非const成员函数,因为非const成员函数可能会修改对象的状态,也就是从只读状态变成了可读可写,属于是权限放大了,我们之前也讲过权限不能放大,只能缩小。

🫧const修饰成员函数

将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
在这里插入图片描述

加上const,保持权限统一

void Print() const

🗨️代码演示:

#include<iostream>
using namespace std;
class Date
{
public:Date(){_year = 2024;_month = 5;_day = 29;}void Print() const{cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;d1.Print();const Date d2;d2.Print();return 0;
}

在这里插入图片描述
🍵
const修饰的是成员函数,用来指示该函数不会修改对象的状态。在类中声明成员函数时,如果不希望该函数修改对象的状态,则应该将其声明为const成员函数。

this指针是一个隐含的指向当前对象的指针,在成员函数中可以使用它来访问当前对象的成员变量和成员函数。当一个成员函数被调用时,编译器会自动将当前对象的地址传递给this指针。在const成员函数中,this指针的类型是指向常量对象的指针(const ClassName* const this),这意味着不能通过this指针修改对象的成员变量。

🔺小结

  • 成员函数,如果是一个 对成员变量只进行读访问的 函数 —> 建议加const,这样const对象和非const对象都可以用。
  • 成员函数,如果是一个 对成员变量要进行读写访问的 函数 —> 不能加const,否则不能修改成员变量。

🫧思考

  1. const对象可以调用非const成员函数吗?
    不可以,权限放大
  2. 非const对象可以调用const成员函数吗?
    可以,权限缩小
  3. const成员函数内可以调用其它的非const成员函数吗?
    不可以,权限放大
  4. 非const成员函数内可以调用其它的const成员函数吗?
    可以,权限缩小

🚩取地址及const取地址重载

🫧取地址重载

在这里插入图片描述

由上图可见,取地址重载也是默认成员函数
看名字就知道是取地址的
🗨️代码演示:

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}Date* operator&(){// this是指针,指向对象地址,返回this就是返回对象地址return this;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2024, 5, 28);cout << &d1 << endl;return 0;
}

运行结果

在这里插入图片描述

🫧const取地址重载

🗨️代码演示:

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}const Date* operator&() const{return this;}
private:int _year;int _month;int _day;
};
int main()
{const Date d1(2024, 5, 28);cout << &d1 << endl;return 0;
}

运行结果

在这里插入图片描述

🫧取地址重载和const取地址重载一般不需要重载

这两个默认成员函数一般不用重新定义 ,编译器默认会生成。
🗨️代码演示:

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};
int main()
{const Date d1(2024, 5, 28);cout << &d1 << endl;return 0;
}

在这里插入图片描述

这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需
要重载,比如想让别人获取到指定的内容!

可以返回一个假地址
在这里插入图片描述
完~end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/844224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用GPT-4o?如何使用 GPT-4o API?

如何使用GPT-4o&#xff1f; GPT-4o 也可以通过 ChatGPT 界面使用 如何使用 GPT-4o API 新的 GPT-4o 模型遵循 OpenAI 现有的聊天完成 API&#xff0c;使其向后兼容且易于使用。 ​ 如何升级GPT4Plus&#xff1f; 升级ChatGPTPLSU4需要一张虚拟卡&#xff0c;点击获取​​​…

JavaScript 中遍历数组的多种方法

在 JavaScript 中,遍历数组有很多种方法。根据不同的场景选择最合适的遍历方式,不仅能提高代码的可读性,还能提升性能。在这篇文章中,我们将详细介绍几种常见的遍历数组的方法及其优缺点。 推荐方法: for-of 循环(ES2015+):简单且支持 async。 for (const element of t…

ClickHouse 分布式部署、分布式表创建及数据迁移指南

文章目录 部署 ClickHouse 集群1.1 环境准备1.2 安装 ClickHouse1.3 配置集群 创建分布式表2.1 创建本地表2.2 创建分布式表2.3 删除分布式表 测试分布式表3.1 插入测试数据。 配置和管理4.1 配置监控4.2 数据备份 数据迁移5.1 导出5.2 导入 部署 ClickHouse 集群 Quantum Ins…

算法刷题笔记 差分(C++实现)

文章目录 差分概述题目描述解题思路实现代码 差分概述 在我的博文 算法刷题笔记 前缀和和 算法刷题笔记 子矩阵的和 中&#xff0c;曾介绍了前缀和算法。前缀和是指对于一个原始数组&#xff0c;我们构建一个含有相同元素个数的辅助数组&#xff0c;其中辅助数组的下标为i的元…

Java(六)——抽象类与接口

文章目录 抽象类和接口抽象类抽象类的概念抽象类的语法抽象类的特性抽象类的意义 接口接口的概念接口的语法接口的特性接口的使用实现多个接口接口与多态接口间的继承抽象类和接口的区别 抽象类和接口 抽象类 抽象类的概念 Java使用类实例化对象来描述现实生活中的实体&…

【第一节】从C语言到C++

目录 一、面向对象编程 1.早期概念 2.发展与普及 3. 现代发展 二、从C语言到C 1.关于堆内存的使用 2.关于函数重载 3.关于默认参数 4.引用 5.引用参数 6.作用域符号 三、C的输入输出机制 一、面向对象编程 面向对象编程&#xff08;Object-Oriented Programming&am…

java 对接农行支付相关业务(一)

文章目录 java整合农行支付1:业务需求了解2:第三方App接入农行支付流程2.1 java 集成农行依赖2.2 java配置农行支付相关证书信息2.2.1:首先我们要配置ConfigSource 文件2.2.2: 配置TrustMerchant 文件信息3:接入农行支付等相关api接口java整合农行支付 技术背景:idea+jd…

如何进一步缩短Python性能

1、问题背景 给定一个(x,y)处的节点网格&#xff0c;每个节点有一个值(0…255)从0开始。有N个输入坐标&#xff0c;每个坐标在(0…x, 0…y)的范围内。一个值Z&#xff0c;它定义了节点的“邻域”。增加输入坐标及其邻居节点的值。网格边缘之外的邻居被忽略。基准案例&#xff…

专转本上岸别太老实做这三件事

如果你专转本上岸&#xff0c;千万不要当老实人去做这三件事&#xff0c;真的没有必要&#xff0c;不但浪费时间&#xff0c;还会让你提前进入对未来的迷茫期。建议转本人们一定要知道&#xff0c;首先就是不要过度关注学分。因为转本上岸只有两年&#xff0c;我们属于大三&…

spdlog日志库源码:自定义异常类spdlog_ex

自定义异常类spdlog_ex 标准库异常类&#xff08;std::exception&#xff09;系列&#xff0c;能满足大多数使用异常的场景&#xff0c;但对系统调用异常及错误信息缺乏支持。spdlog通过继承std::exception&#xff0c;扩展对系统调用的支持&#xff0c;实现自定义异常类spdlo…

产教协同|暴雨AI算力赋能传媒实践教学

近日&#xff0c;“第七届传媒实践教学创新研讨会暨中国高校影视学会实验教学专业委员会年会”在美丽的山城重庆成功举办。本次大会以“拥抱AI&#xff0c;融合共生”为主题&#xff0c;吸引了来自全国200多所高校、30多家企业以及700多位大视听实践教学产学研用各界专家、学者…

#php-config的作用#

/usr/local/php/bin/php-config php-config 做什么的 php-config 是一个在 PHP 编译和安装过程中生成的实用程序&#xff0c;它提供了关于 PHP 安装配置的信息。这些信息对于其他软件&#xff08;如扩展模块或绑定库&#xff09;在编译时链接到 PHP 运行时环境非常有用。 具体…

Data Lakehouse:你的下一个数据仓库

作者&#xff1a;张友东 StarRocks TSC member/镜舟科技 CTO 数据分析是现代企业和组织决策过程中不可或缺的一部分&#xff0c;数据分析技术经过数十年的发展&#xff0c;需求场景从 BI 报表到数据探寻、实时预测、用户画像等不断丰富&#xff0c;技术架构经历从数据仓库、数据…

如何进行企业的数字化转型?

“企业数字化转型怎么做&#xff1f;” &#xff0c;类似的文章网上有很多&#xff0c;但大多数内容都写得太高深了&#xff0c;一般人看不懂&#xff0c;也用不上... 作为一个践行者&#xff0c;而不是数字化产品的销售员&#xff0c;我跟你说点你能听得懂的。 1、导入信息化…

【AIGC】GPT-4o技术分析-浅谈

GPT-4o&#xff1a;人工智能技术的全新里程碑 一、引言二、GPT系列版本间的对比分析三、GPT-4o的技术能力分析多模态处理能力速度与性能优化情感理解与表达能力 四、个人整体感受五、结语 一、引言 在人工智能技术的浪潮中&#xff0c;OpenAI再次以其卓越的创新能力引领潮流。近…

Java中的打印流PrintStream 和 PrintWriter

PrintStream和PrintWriter在Java中都是用于打印输出的类&#xff0c;但它们之间存在一些明显的区别。以下是关于这两个类的详细解释和比较&#xff1a; PrintStream 基本特性 PrintStream是一个字节打印流&#xff0c;它继承自FilterOutputStream。 主要操作byte流&#xff0…

15.Redis之持久化

0.知识引入 mysql的事务,有四个比较核心的特性. 1. 原子性 2.一致性 3.持久性 >(和持久化说的是一回事)【把数据存储在硬盘 >持久把数据存储茌内存上>不持久~】【重启进程/重启主机 之后,数据是否存在!!】 4.隔离性~ Redis 是一个 内存 数据库.把数据存储在内存中的…

【张量】由可逆线性变换诱导的具有新张量核范数的低秩张量补全(1)

文章目录 由可逆线性变换诱导的具有新张量核范数的低秩张量补全【Low-rank Tensor Completion with a New Tensor Nuclear Norm Induced by Invertible Linear Transform】摘要1.介绍**2. 由变换基的张量-张量积诱导的新的张量核范数**2.2 基于变换的 T-积 诱导的张量核范数 **…

RFID芯片掼蛋牌:高科技与传统玩法结合,游戏体验焕然一新。

火爆“出圈”的掼蛋&#xff0c;是一种玩法相当鲜明的智力游戏。近年来得到了不少的推广和发展&#xff0c;各地举办了各种掼蛋比赛和活动&#xff0c;吸引了大量的参赛者和观众。此外&#xff0c;一些企业和机构也开始将掼蛋作为一种企业文化或者社交活动的方式&#xff0c;通…

灯下黑”挖出国内知名安全平台某BUF的CSRF漏洞

漏洞复现&#xff1a; 漏洞点在删除文章的地方&#xff0c;首先为了测试先发布一篇文章 发布之后我们可以查看文章&#xff0c;注意url中的一串数字&#xff0c;就是这篇文章的id&#xff0c;如下如&#xff1a; 这里的文章id是“271825”&#xff0c;首先抓一下删除文章的数据…