【C++初阶】之类和对象(下)

【C++初阶】之类和对象(下)

  • ✍ 再谈构造函数
    • 🏄 初始化列表的引入
      • 💘 初始化列表的语法
      • 💘 初始化列表初始化元素的顺序
    • 🏄 explicit关键字
  • ✍ Static成员
    • 🏄 C语言中的静态变量
    • 🏄 C++中的静态成员
    • 🏄 特性
  • ✍ 友元
    • 🏄 友元函数
    • 🏄 友元类
      • 💘 友元类的特性
  • ✍ 内部类
    • 🏄 内部类的特性
  • ✍ 匿名对象
  • ✍ 拷贝对象时的一些编译器优化
    • 🏄 隐式类型,连续的构造+拷贝构造->优化为直接构造
      • 💘 隐式类型生成的对象具有常性
    • 🏄 一个表达式中,连续的构造+拷贝构造->优化为一个构造
    • 🏄 一个表达式中,连续的拷贝构造+拷贝构造->优化一个拷贝构造
    • 🏄 一个表达式中,连续的拷贝构造+赋值重载->无法优化
    • 🏄 Release下不是一个表达式的连续的构造+拷贝构造-->构造函数(部分会优化)
  • ✍ 再次理解类和对象
    • 🏄 类和对象的理解
    • 🏄 类的组成

📃博客主页: 小镇敲码人
💞热门专栏:C++初阶
🚀 欢迎关注:👍点赞 👂🏽留言 😍收藏
🌏 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧月,独傲天下百坚强。 男儿应有龙腾志,盖世一意转洪荒。 莫使此生无痕度,终归人间一捧黄。🍎🍎🍎
❤️ 什么?你问我答案,少年你看,下一个十年又来了 💞 💞 💞

前言:本篇博客接上篇类和对象中。接着来跟着博主学习C++类和对象下的一些特性吧!

✍ 再谈构造函数

构造函数体类的操作我们只能叫做赋值,不能叫做初始化,因为初始化只有一次,而赋值可以在构造函数体类无数次。

假设现在我们的类里面有const成员和引用成员,会发生什么情况呢?

在这里插入图片描述
奇怪这里我们明明在构造函数内给year和month赋值了呀,为什么还是会报错呢?报错说我们没有初始化,说明初始化并不发生在构造函数内。

我们来回顾一下,const对象和引用必须在定义的时候就初始化:

在这里插入图片描述
但是在类里面它们只是声明了一下而已,并没有定义,真正定义是在那个类实例化一个对象之后。而且const对象和引用在初始化之后就不能修改了,这样你应该就可以理解,为什么不允许在构造函数体类初始化这些对象了,因为我无法判断你是否第二次又对它进行了初始化(如果真那样做就逻辑不自洽了)。

🏄 初始化列表的引入

那不能在构造函数函数体里面初始化在哪里初始化呢?答案是在初始化列表里面初始化。

💘 初始化列表的语法

class Date
{
public:
	Date(int month_):year(3),month(month_),day(2)
	{

	}
private:
	const int year;
	int& month;
	int day ;
};

在原先的普通构造函数的函数名后面加上冒号,然后对应的成员变量后面加括号,括号里面是其要初始化的值,不同变量间使用逗号分隔。

注意如果是const对象或者引用类型的初始化必须走初始化列表,拷贝构造函数也可以用来创建一个对象,这些类型也必须走初始化列表,否则就会报错。

在这里插入图片描述

这里就算我们使用了初始化列表,编译器隐式生成的拷贝赋值函数也会被删除。

在这里插入图片描述
除了const和引用类型的变量必须走初始化列表,没有无参的构造函数的自定义类型也必须走初始化列表(因为要给它传参数),也不能放在构造函数中,因为自定义类型的构造函数只能在初始化的时候调用。

有无参的构造函数(可以访问)的自定义类型会在定义的时候自动调用:

在这里插入图片描述
没有无参的构造函数时,如果你不再初始化列表里调用,就会报错:

在这里插入图片描述
这个时候我们应该在定义的时候给这个自定义类型传一个参数:

在这里插入图片描述

💘 初始化列表初始化元素的顺序

这个顺序与我们实际在初始化列表中的元素初始化顺序无关,只与元素的声明顺序有关。

在这里插入图片描述
在这里插入图片描述

🏄 explicit关键字

explicit关键字可以防止只需要传一个参数(只有一个或者后面都是缺省参数)的普通的构造函数发生隐式类型的转换。

请看下面代码:

class Date
{
public:
     Date(int year_)
	{
		year = year_;
		month = 3;
		day = 2;
	}

	~Date()
	{

	}
private:
	int year;
	int month;
	int day ;
};

int main()
{
	
	Date y(2023);
	y = 2022;
	return 0;
}

你是否会认为其会导致编译错误呢,其实不然,这里编译器会将2022隐式类型转化为Date类型,我们可以通过调试发现其确实调用了构造函数:

在这里插入图片描述

并且y的year变成了2022,这里是先调用了一次构造函数,再去调用了编译器默认生成的赋值构造函数。

在这里插入图片描述

如果我们在普通构造函数前加上explicit就不支持隐式类型转换了。

在这里插入图片描述

✍ Static成员

🏄 C语言中的静态变量

我们在C语言里面也有Static类型的变量,我们把它称作静态成员变量,这个变量有一个特征,就算出了函数作用域,它不会销毁,生命周期只有程序结束它才会结束。

void f()
{
	static int a = 3;
	int b = 3;
	a++;
	b++;
}
int main()
{
	f();
	f();
	return 0;
}

连续调用两次f()函数a为多少呢?

在这里插入图片描述

可以看到a变成了5,说明a执行了两次++,在第一次出函数后,它没有销毁,并且静态变量只会定义一次。

🏄 C++中的静态成员

在c++的类里面也会有静态的成员,它和C语言中的函数中的静态变量有什么区别和相同之处呢呢?

C++类里面有两类静态成员,它们是静态成员函数和静态成员变量。

class Date
{
	Date()
	{
		count++;
	}
	Date(const Date& x)
	{
		count++;
	}
	static int Getcount()
	{
		return count;
	}
	~Date()
	{
		count--;
	}
private:
	static int count;
};

int Date::count = 0;

int main()
{
	return 0;
}

上述程序可以用来计算类实例化了多少个对象。下面外面来具体阐述一下它们的特性。

🏄 特性

  1. 静态成员函数和静态成员变量也受访问限定符的限制。
  2. 静态成员变量必须要在类外面初始化,初始化不要求访问限定符为public,但是下次调用的时候需要它在类外面可以访问,且不能多次初始化。
    在这里插入图片描述
  3. 静态成员变量不能在声明的时候给缺省值,因为它的初始化不走初始化列表,而是在类外面通过类名+::进行访问并初始化。

在这里插入图片描述
4、静态成员函数和静态成员变量在类外面访问(假设是公有的),可以通过实例化对象访问或者是类名+::访问。

在这里插入图片描述
5. 静态成员(变量和函数)为所有类对象所共享,不属于某个具体的对象,存放在静态区。
6. 静态成员函数类没有this指针,不能访问任何非静态成员,但是可以访问静态成员。

在这里插入图片描述
7. 但是非静态的成员函数可以调用静态成员。

在这里插入图片描述

想一想为什么需要静态函数呢?就拿刚刚计算实例化了多少对象的程序来说,想知道没有实例化对象时count为多少,如何知道呢?此时不能实例化对象且count为private,就只能借助于类的静态成员函数来完成。

✍ 友元

友元提供了一种突破访问限定符和类域限定符的作用,但是破坏了程序的耦合度,不易过多使用,友元分为友元函数友元类

🏄 友元函数

如果一个函数是一个类的友元函数,那么它就可以访问这个类的私有成员。

友元函数是为了解决重载<<函数,但是this指针默认在第一个参数的情况,我们应该让cout在第一个参数的位置,因为运算符重载函数的操作数和运算符重载函数的参数是一一对应的。
这里我们用代码来分析:

class Date
{
public:
	Date()
	{
		year = 2022;
		month = 2;
		day = 1;
	}
	void operator<<(std::ostream& cout)
	{

	}
private:
	int year;
	int month;
	int day;
};

int main()
{
	Date x;
	std::cout << x;
}

由于左操作数是cout,但是类的成员函数的默认第一个参数是this指针,所以这里会报错。cout的类型是ostream
在这里插入图片描述

我们可以使用友元函数解决这个问题;

class Date
{
public:
	friend std::ostream& operator<<(std::ostream& cout_, const Date& x);
	Date()
	{
		year = 2022;
		month = 2;
		day = 1;
	}
	
private:
	int year;
	int month;
	int day;
};

std::ostream& operator<<(std::ostream& cout_, const Date& x)
{
	cout_ << x.year << " " << x.month <<  " " << x.day << std::endl;
	return cout_;
}

int main()
{
	Date x;
	std::cout << x << std::endl;
	return 0;
}

运行结果:

在这里插入图片描述

这里我们流提取函数之所以要返回cout_,是为了支持连续的调用这个函数。
std::cout << x << std::endl;,这段代码理解就是,先去调用operator<<(std::ostream& cout_, const Date& x),返回一个cout_,就变成了std::cout << std::endl;,继续调用流提取重载函数。流插入函数是同样的道理。

  • 友元函数只需要在相应的类里面声明一个函数(不受访问限定符的限定),并在函数前面加上friend关键词就可以了。注意你不能把友元函数的定义写在类里面,因为它不是类的成员。

在这里插入图片描述

  • 友元函数不能用const修饰,因为它并不是类的成员函数。
  • 一个函数可以是多个类的友元函数。

🏄 友元类

友元类是指的是,假设现在有两个类,A、B,如果你声明了A是B的友元类,在A中如果创建了B的实例化对象,就可以调用B的私有成员(私有变量和函数)。

下面我们用代码来验证一下:

// 定义一个名为B的类  
class B  
{  
	// 声明类A为B的友元类,这样A可以访问B的私有和保护成员  
	friend class A;  
  
public:  
	// 公共成员函数ff,可以在类的外部调用  
	void ff()  
	{  
		// 函数体为空,没有实际功能  
	}  
  
private:  
	// 在类的私有部分不能声明友元类,友元声明应该放在类的公有或保护部分  
	// 私有成员函数f,只能在B类内部或B的友元中调用  
	void f()  
	{  
		// 函数体为空,没有实际功能  
	}  
  
	// 私有整型成员变量a,初始化为3  
	int a = 3;  
  
	// 私有整型成员变量b,初始化为4  
	int b = 4;  
};  
  
// 定义一个名为A的类  
class A  
{  
public:  
	// 公共成员函数fff,可以在类的外部调用  
	void fff()  
	{  
		// 调用B类对象x的公共成员函数ff  
		x.ff();  
  
		// 调用B类对象x的私有成员函数f  
		// 由于A是B的友元类,所以可以访问B的私有成员  
		x.f();  
	}  
  
private:  
	// A类中含有一个B类的对象x作为私有成员  
	B x;  
};  
  
int main()  
{  
	// 创建A类的对象y  
	A y;  
  
	// 程序正常结束,返回0  
	return 0;  
}

这段代码是没有问题的,从中我们可以发现友元类的一些特性。

💘 友元类的特性

  1. A是B的友元类,但是B不是A的友元类,友元关系是单向的。
  2. A是B的友元类,B是C的友元类,但是A不是C的友元类,友元关系是不能传递的。
  3. 声明友元类和声明友元函数的区别是类名前面多了classfriend class A;
  4. 友元类的声明可以在这个类的任何位置。

在这里插入图片描述

✍ 内部类

内部类就是在一个类的里面创建了一个类,但是这个类是独立的和外部类没有任何的关系(但是受它的访问限定符的限制,如果是private,在外面无法实例化对象),它也不属于外部类,不能通过外部类的this指针访问内部类的任何成员。外部类对内部类没有任何优越的访问权限。
但是内部类是外部类的友元类,访问外部类有优越的访问权限

下面一段代码帮助你理解内部类:

#include <iostream> // 引入标准输入输出库,用于使用std::cout  
  
class A  
{  
public:  
	// A类的构造函数  
	A()  
	{  
		// 构造函数体为空  
	}  
  
	// A类的公有成员函数f  
	void f()  
	{  
		// 函数体为空  
	}  
  
	// A类的内部类B  
	class B  
	{  
	public:  
		// B类的公有成员函数f,接收一个A类的引用作为参数  
		void f(A& x)  
		{  
			// 输出A类对象的c成员变量和B类的静态成员变量count  
			std::cout << x.c << " " << count;  
  
			// 调用A类对象的公有成员函数f  
			x.f();  
  
			// 尝试调用A类对象的成员函数ff,但ff是A类的私有成员函数,这里会导致编译错误  
			x.ff();  
		}  
  
	private:  
		// B类的私有整型成员变量b,初始化为3  
		int b = 3;  
	};  
  
private:  
	// A类的私有成员函数ff  
	void ff()  
	{  
		// 函数体为空  
	}  
  
	// A类的静态整型成员变量count,用于在多个A类对象间共享数据  
	static int count;  
  
	// A类的私有整型成员变量c,初始化为3  
	int c = 3;  
};  
  
// 初始化A类的静态成员变量count,赋值为3  
int A::count = 3;  
  
int main()  
{  
	// 创建A类的内部类B的对象b  
	A::B b;  
  
	// 创建A类的对象a  
	A a;  
  
	// 调用B类对象b的公有成员函数f,并传入A类对象a的引用  
	b.f(a);  
  
	// 程序正常结束,返回0  
	return 0;  
}

🏄 内部类的特性

  1. 创建内部类的实例化对象必须要使用外部类的类名+::.
  2. 内部类不能直接在类里面创建外部类的对象,要从外面传一个过来,外部类的成员通过传过来的对象访问,静态成员可以直接访问。

在这里插入图片描述

  1. sizeof()计算外部类的大小,和内部类没有任何关系。

在这里插入图片描述

在这里插入图片描述
这里也进一步验证了静态变量是放在静态区的,没有和类的普通成员变量存放在一起,也不算在类的大小里面。

局部的const变量是存在栈上的:

在这里插入图片描述
运行结果:

在这里插入图片描述

全局的const变量放在常量区。

  1. 内部类可以定义在外部类的public、protected、private都是可以的。但是它受外部类类域的限制。如果使用private,在外面就无法实例化内部类的对象了。

在这里插入图片描述

✍ 匿名对象

匿名对象就是没有名字的对象(是这个对象没有名字,不是这个类没有名字)。

我们写一段代码来举个例子:


class Date
{
public:
	Date()
	{
		std::cout << "Date()" << std::endl;
	}
	~Date()
	{
		std::cout << "~Date()" << std::endl;
	}
private:
	int year;
	int month;
	int day;
};

int main()
{
	Date x;
	Date ();
	return 0;
}

在这里插入图片描述

Date ()就是一个匿名对象,但是它的作用域只有一行,出了这一行它就调用析构函数销毁了。

在这里插入图片描述

匿名对象的一些优势:

class Date
{
public:
	Date()
	{
		std::cout << "Date()" << std::endl;
	}
	Date(const Date& x)
	{

	}
	~Date()
	{
		std::cout << "~Date()" << std::endl;
	}
private:
	int year;
	int month;
	int day;
};

int main()
{
	Date y;
	Date x(y);
	Date z(Date ());
	return 0;
}

同样是使用一个类初始化另外一个类(调用拷贝构造函数),匿名对象可以不用给类取名字。

✍ 拷贝对象时的一些编译器优化

我们都知道C++里面有很多构造函数,但是有时候这些构造函数在一起的时候,编译器会省略一些没必要产生的构造,以达到优化的效果。主要优化是发生在传参和传返回值中。

🏄 隐式类型,连续的构造+拷贝构造->优化为直接构造

💘 隐式类型生成的对象具有常性

using namespace std;
class Date
{
public:
	Date(int year, int month = 2, int day = 1) ://普通的构造函数
		year_(year),
		month_(month),
		day_(day)
	{
		cout << "Date(int year, int month = 2, int day = 1)" << endl;
	}

	Date(const Date& x) ://拷贝构造函数
		year_(x.year_),
		month_(x.month_),
		day_(x.day_)
	{
		cout << "Date(const Date& x)" << endl;
	}

	Date& operator=(const Date& x)//拷贝赋值函数
	{
		year_ = x.year_;
		month_ = x.month_;
		day_ = x.day_;
		cout << "operator=(const Date& x)" << endl;
		return *this;
	}

	~Date()//析构函数
	{
		cout << "~Date" << endl;
	}
private:
	int year_;
	int month_;
	int day_;
};

void f(const Date& x)
{

}
int main()
{
	f(3);
	return 0;
}

3–>Date会去调用普通构造函数,隐式类型转化为了Date类型,但是具有常性,如果不加const就会报错。

在这里插入图片描述
回归正题。请看下面一段代码:

using namespace std;
class Date
{
public:
	Date(int year, int month = 2, int day = 1) ://普通的构造函数
		year_(year),
		month_(month),
		day_(day)
	{
		cout << "Date(int year, int month = 2, int day = 1)" << endl;
	}

	Date(const Date& x) ://拷贝构造函数
		year_(x.year_),
		month_(x.month_),
		day_(x.day_)
	{
		cout << "Date(const Date& x)" << endl;
	}

	Date& operator=(const Date& x)//拷贝赋值函数
	{
		year_ = x.year_;
		month_ = x.month_;
		day_ = x.day_;
		cout << "operator=(const Date& x)" << endl;
		return *this;
	}

	~Date()//析构函数
	{
		cout << "~Date" << endl;
	}
private:
	int year_;
	int month_;
	int day_;
};

void f(Date x)
{

}
int main()
{
	f(3);
	return 0;
}

这里调用f(3),正常应该是先构造函数,将3隐式类型转化为Date类型,然后再调用拷贝构造函数去初始化x,这里编译器做了优化,连续的构造+拷贝构造->优化为直接构造。

在这里插入图片描述

🏄 一个表达式中,连续的构造+拷贝构造->优化为一个构造

using namespace std;
class Date
{
public:
	Date(int year, int month = 2, int day = 1) ://普通的构造函数
		year_(year),
		month_(month),
		day_(day)
	{
		cout << "Date(int year, int month = 2, int day = 1)" << endl;
	}

	Date(const Date& x) ://拷贝构造函数
		year_(x.year_),
		month_(x.month_),
		day_(x.day_)
	{
		cout << "Date(const Date& x)" << endl;
	}

	Date& operator=(const Date& x)//拷贝赋值函数
	{
		year_ = x.year_;
		month_ = x.month_;
		day_ = x.day_;
		cout << "operator=(const Date& x)" << endl;
		return *this;
	}

	~Date()//析构函数
	{
		cout << "~Date" << endl;
	}
private:
	int year_;
	int month_;
	int day_;
};

void f(Date x)
{

}
int main()
{
	f(Date(2022));
	return 0;
}

实际调用的构造函数:

在这里插入图片描述

如果不是一个表达式,会优化吗?

在这里插入图片描述
可以看到并没有优化。

🏄 一个表达式中,连续的拷贝构造+拷贝构造->优化一个拷贝构造

using namespace std;
class Date
{
public:
	Date(int year, int month = 2, int day = 1) ://普通的构造函数
		year_(year),
		month_(month),
		day_(day)
	{
		cout << "Date(int year, int month = 2, int day = 1)" << endl;
	}

	Date(const Date& x) ://拷贝构造函数
		year_(x.year_),
		month_(x.month_),
		day_(x.day_)
	{
		cout << "Date(const Date& x)" << endl;
	}

	Date& operator=(const Date& x)//拷贝赋值函数
	{
		year_ = x.year_;
		month_ = x.month_;
		day_ = x.day_;
		cout << "operator=(const Date& x)" << endl;
		return *this;
	}

	~Date()//析构函数
	{
		cout << "~Date" << endl;
	}
private:
	int year_;
	int month_;
	int day_;
};

void f(Date x)
{

}

Date f1()
{
	Date x(2022);
	return x;
}
int main()
{
	Date y = f1();
	return 0;
}

这里正常应该会调用一个普通的构造函数+两个拷贝构造函数,我们看实际的情况:

在这里插入图片描述

实际只调用一次拷贝构造函数,编译器优化了。

🏄 一个表达式中,连续的拷贝构造+赋值重载->无法优化

using namespace std;
class Date
{
public:
	Date(int year, int month = 2, int day = 1) ://普通的构造函数
		year_(year),
		month_(month),
		day_(day)
	{
		cout << "Date(int year, int month = 2, int day = 1)" << endl;
	}

	Date(const Date& x) ://拷贝构造函数
		year_(x.year_),
		month_(x.month_),
		day_(x.day_)
	{
		cout << "Date(const Date& x)" << endl;
	}

	Date& operator=(const Date& x)//拷贝赋值函数
	{
		year_ = x.year_;
		month_ = x.month_;
		day_ = x.day_;
		cout << "operator=(const Date& x)" << endl;
		return *this;
	}

	~Date()//析构函数
	{
		cout << "~Date" << endl;
	}
private:
	int year_;
	int month_;
	int day_;
};

void f(Date x)
{

}

Date f1()
{
	Date x(2022);
	return x;
}
int main()
{
	Date y(2023);
	y = f1();
	return 0;
}

这段代码正常应该是2个构造函数和1个赋值构造、1个拷贝构造函数,并且连续的拷贝构造和赋值构造在一个表达式中,能优化吗?我们拭目以待:

在这里插入图片描述

可以看到并没有优化。

🏄 Release下不是一个表达式的连续的构造+拷贝构造–>构造函数(部分会优化)

请看下面代码:

using namespace std;
class Date
{
public:
	Date(int year, int month = 2, int day = 1) ://普通的构造函数
		year_(year),
		month_(month),
		day_(day)
	{
		cout << "Date(int year, int month = 2, int day = 1)" << endl;
	}

	Date(const Date& x) ://拷贝构造函数
		year_(x.year_),
		month_(x.month_),
		day_(x.day_)
	{
		cout << "Date(const Date& x)" << endl;
	}

	Date& operator=(const Date& x)//拷贝赋值函数
	{
		year_ = x.year_;
		month_ = x.month_;
		day_ = x.day_;
		cout << "operator=(const Date& x)" << endl;
		return *this;
	}

	~Date()//析构函数
	{
		cout << "~Date" << endl;
	}
private:
	int year_;
	int month_;
	int day_;
};

void f(Date x)
{

}

Date f1()
{
	Date x(2022);
	return x;
}
int main()
{
	f1();
	return 0;

Debug下的运行结果:

在这里插入图片描述

Release下的:

在这里插入图片描述

可以看到Release下的优化更猛。

✍ 再次理解类和对象

在这里插入图片描述
计算机是不认识我们现实世界中的实物的,计算机只认识二进制格式的数据。如果想要让计算机认识现实生活中的实体,用户必须通过某种面向对象的语言,对实体进行描述,然后通过编写程序,创建对象后计算机才可以认识。

🏄 类和对象的理解

1、类和对象的理解
类:指的是对客观事物的一种描述,是对现实中一类具有共同属性和行为的事物的抽象

对象:指的是具体存在的事物,是能够看得到摸的着的真实存在的实体。

🏄 类的组成

而C++作为典型的面向对象的语言就使用类来描述现实世界中的事物,类分为属性行为两部分。属性是指的是类中的成员变量–>事物的特征,行为是指的是类中的一些方法函数–>事物能执行的操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

源聚达科技:抖音开网店步骤难吗

在数字化浪潮的推动下&#xff0c;抖音平台不仅成为了人们娱乐休闲的好去处&#xff0c;更是许多创业者眼中的“金矿”。然而&#xff0c;对于初次尝试在抖音开设网店的朋友来说&#xff0c;难免会对开店流程感到疑惑。究竟开设一个抖音网店的难度如何呢?让我们一探究竟。 要明…

视觉大模型学习路径

本文只是从全局角度出发梳理学习过程&#xff0c;现阶段不会针对每一步写文章&#xff0c;工作没什么时间&#xff0c;但是会梳理自己的学习过程和一些好的参考文章。后面有时间再系统梳理每个模型 总览 本人目前主要研究基于transfermer的视觉大模型&#xff0c;同时也会学习…

dynamic_cast基准测试(C++基础)

dynamic_cast dynamic_cast是专门用于沿继承层次结构进行的强制类型转换&#xff0c;更像是一个函数&#xff0c; 不是编译时进行的类型转换&#xff0c;而是在运行时计算&#xff0c;正因如此&#xff0c;有小性能损失。 在基类和派生类之间相互转换。dynamic_cast常用来做…

Java安全篇-Fastjson漏洞

前言知识&#xff1a; 一、json 概念&#xff1a; json全称是JavaScript object notation。即JavaScript对象标记法&#xff0c;使用键值对进行信息的存储。 格式&#xff1a; {"name":"wenda","age":21,} 作用&#xff1a; JSON 可以作为…

激光焊接机性价比高的品牌推荐

激光焊接机性价比高的品牌推荐&#xff0c;博特激光作为一个激光焊接机品牌&#xff0c;在市场上也享有一定的声誉。其激光焊接机产品在性价比方面表现不错&#xff0c;受到了部分用户的认可。以下是关于博特激光焊接机的一些优势特点&#xff1a; 1. **性能稳定**&#xff1a;…

视频素材下载网站有哪些?这几个优质无水印素材网你肯定没见过

在视频创作的世界里&#xff0c;每个角落都隐藏着未被发现的宝藏。全球各地的视频素材网站以其独特的视角和丰富的资源&#xff0c;为创作者们提供了无尽的灵感和可能性。不论是寻找充满地方特色的片段&#xff0c;还是需要高品质通用视频素材&#xff0c;以下全球范围内的精选…

人工智能在产业中应用--生成智能

二、生成式人工智能 前面介绍了很多人工智能的应用&#xff0c;接下来部分我们会介绍当前正在进行的生成智能。生成智能和以往的人工智能有什么区别&#xff0c;个人觉得主要区别就在于“度”。在表现上就是以前的人工智能更多是利用既有的数据集分布挖掘和解决在这个数据集下…

linux centos7中使用 Postfix 和Dovecot搭建邮件系统

作者主页&#xff1a;点击&#xff01; Linux专栏&#xff1a;点击&#xff01; Postfix Postfix是一个开源的邮件传输代理&#xff08;MTA&#xff09;&#xff0c;用于路由和传送电子邮件。它是一个可靠、安全且高性能的邮件服务器软件&#xff0c;常用于搭建邮件系统的核心…

二叉树|701.二叉搜索树中的插入操作

力扣题目链接 class Solution { public:TreeNode* insertIntoBST(TreeNode* root, int val) {if (root NULL) {TreeNode* node new TreeNode(val);return node;}if (root->val > val) root->left insertIntoBST(root->left, val);if (root->val < val) r…

v-bind=“$attrs“ v-on=“$listeners“的理解及用法

前言&#xff1a; vue通信手段有很多种&#xff0c;props/emit、vuex、event bus、provide/inject 等&#xff0c;还有 a t t r s 和 attrs和 attrs和listeners&#xff0c;主要用于隔代传值 1、$attrs 官方解释&#xff1a;包含了父作用域中不作为 prop 被识别 (且获取) 的特…

敏捷开发——Axios

一创建一个项目&#xff0c;首先要解决的是跨域问题 解决跨域问题&#xff1a; 1. 服务端解决 2. 设置代理 配置完 config 文件一定要重启&#xff0c;否则不生效 1.设置代理服务器 vue.config.js 1)用"/api" 代替目标地址"https://www.pku.edu.cn" 2…

linux下使用迅雷的完美办法(网络版免费),其他下载工具

迅雷有自家服务器的支持&#xff0c;因此&#xff0c;其他下载器&#xff0c;可能难以匹敌 &#xff1f; linux下使用迅雷的完美办法&#xff08;免费&#xff09; https://blog.csdn.net/lqrensn/article/details/8853949 网络版 Linux下安装并使用迅雷 https://www.lxlin…

独立站攻略|如何使用SEO代理优化网站排名?

每天&#xff0c;互联网上都会生成和共享大量信息&#xff0c;这使得预测哪个关键字或主题将成为趋势变得很有挑战性&#xff0c;因此人们可以预测和优化他们的搜索引擎排名。但使用“SEO 代理”&#xff0c;就会使得SEO优化更加有效且精准。 一、什么是SEO&#xff1f; 简而言…

区块链dapp开发 dapp系统开发方案

在区块链技术的兴起和普及的推动下&#xff0c;去中心化应用程序&#xff08;DApp&#xff09;成为了当前数字世界中的热门话题之一。DApp 的开发不仅需要考虑技术方面的挑战&#xff0c;还需要深入了解区块链的工作原理和应用场景。本文将介绍一种 DApp 系统开发的基本方案&am…

2024河北采煤机械展览会|河北煤矿展会|石家庄煤业展会

2024中国&#xff08;石家庄&#xff09;国际煤炭装备及矿山设备博览会 时间&#xff1a;2024年7月4-6日 地点&#xff1a;石家庄国际会展中心.正定 随着全球能源结构的转型与升级&#xff0c;煤炭行业正面临前所未有的发展机遇与挑战。作为煤炭产业的重要组成部分&#xff0…

开源模型应用落地-qwen1.5-7b-chat-LoRA微调(二)

一、前言 预训练模型提供的是通用能力&#xff0c;对于某些特定领域的问题可能不够擅长&#xff0c;通过微调可以让模型更适应这些特定领域的需求&#xff0c;让它更擅长解决具体的问题。 本篇是开源模型应用落地-qwen-7b-chat-LoRA微调&#xff08;一&#xff09;进阶篇&#…

知名策略师上调微软目标价,微软后期走势将怎样?

KlipC报道&#xff1a;美国投行知名策略师Dan Ives将微软目标价从475美元上调至500美元&#xff0c;该新目标意味着较周一收盘价有18%的上涨空间。 值得一提的是Copilot是微软在Windows 11中加入的AI助手&#xff0c;该AI助手可以帮助用户完成各种任务。随着微软人工智能助理工…

QT中的 容器(container)简介

Qt库提供了一套通用的基于模板的容器类&#xff0c;可以用这些类存储指定类型的项。比如&#xff0c;你需要一个大小可变的QString的数组&#xff0c;则使用QVector<QString>。 这些容器类比STL&#xff08;C标准模板库&#xff09;容器设计得更轻量、更安全并且更易于使…

传播力研究期刊投稿发表

《传播力研究》杂志是经国家新闻出版总署批准&#xff0c;黑龙江日报报业集团主管主办&#xff0c;面向全国公开发行的学术刊物。本刊为新闻、传媒、传播学类专业院校师生、文化传播理论研究者和从业人员及爱好者&#xff0c;开展学术交流与研讨&#xff0c;汲取当今业界新鲜的…

无线开关量收发模块如何在远距离情况下监测工厂设备运行?

PLC无线通讯一般有以下几个应用场景&#xff1a; 【应用一】开关量信号1点对多点远距离无线通讯 支持点对点及1点对多点&#xff0c;多路开关量/数字量信号远距离无线传输通讯 【应用二】开关量信号多点对1点之间远距离无线通讯 PLC、泵阀、二次仪表、继电器等I/O开关量信号…