【C++】—— 类与对象(二)

news2025/2/25 11:25:04

【C++】—— 类与对象(二)

  • 1、类的默认成员函数
  • 2、构造函数
    • 2.1、初见构造
    • 2.2、深入构造
    • 2.3、初始化列表
      • 2.3.1、什么是初始化列表
      • 2.3.2、初始化列表和函数体关系
      • 2.3.3、必须使用初始化列表的情况
      • 2.3.4、变量声明时给缺省值(默认值)
      • 2.3.5、初始化列表初始化顺序
      • 2.3.6、总结
        • 2.3.6.1、构造函数特点总结
        • 2.3.6.1、初始化列表知识点总结
        • 2.3.6.2、初始化列表行为脉络
  • 3、析构函数
    • 3.1、初见析构
    • 3.2、深入析构

1、类的默认成员函数

  类的默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数被称为默认成员函数。一个类,我们不写的情况下编译器会默认生成 6 个默认成员函数。
  需要注意的是这 6 个最重要的默认成员函数是前 4 个,最后两个取地址重载不重要,我们稍微了解一下即可。
  其次就是 C++11 以后还会增加两个默认成员函数,移动构造移动赋值,这个我们以后再讲解。
  
  默认成员函数是学习 C++ 的基础,很重要,但也比较复杂,我们学习默认成员函数时要从以下两个方面取学习:

  • 我们不写时,编译器默认生成的函数行为是什么,是否满足我们的需求
  • 编译器默认生成的 函数不满足我们的需求,我们需要自己实现,那么如何自己实现。

在这里插入图片描述

  

2、构造函数

2.1、初见构造

  构造函数虽然名字叫构造,但它并不是用来开空间创建对象的。对象的空间在函数创建栈帧时就一次性开辟好了(不仅是对象,所有变量都是如此)。
  构造函数的功能是对象实例化时初始化对象。构造函数的本质是要替代我们以前 S t a c k Stack Stack D a t e Date Date 类中写的 I n i t Init Init 函数的功能,构造函数一系列的特点完美的替代了 Init
  
构造函数的特点:

  1. 函数名与类名相同
  2. 无返回值(返回值啥都不需要给,也不需要写void)
  3. 对象实例化时系统会自动调用对应的构造函数
  4. 构造函数可以重载

  
我们来看日期类的构造函数

在这里插入图片描述
  :实际运行代码时全缺省的构造函数不能与无参的或带参的构造函数同时存在,并且全缺省的构造函数的功能已经包括了无参构造和带参构造,我们只需保留全缺省构造函数即可,这里只是为了演示。

  可以看到,上述构造函数可以重载函数名与类名相同无返回值

  构造函数的调用也与一般的函数调用不同,我们一起来看看:

int main()
{
	Date d1; 
	Date d2(2025, 1, 1); 
	
	d1.Print();
	d2.Print();
	
	return 0;
}

运行结果:

在这里插入图片描述

  可以看到,我们并没有显式去调用构造函数,而两个对象 d 1 d1 d1 d 2 d2 d2 的初始化已经完成了,可见:对象定义(实例化)时系统会 自动调用 对应的构造函数
  
在对象实例化时:

  • 若调用的构造函数 需要传参,则在对象名后面传递参数,如: Date d2(2025, 1, 1);
  • 若需要调用的构造函数 无需传参,应写成Date d1; 的形式(以 D a t e Date Date 类为例),不能写成Date d1();,因为这样与函数声明无法区分。

  

2.2、深入构造

构造函数的进阶特点:

  1. 如果类中没有显式定义构造函数,则 C++ 编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成
      
  2. 无参构造函数全缺省构造函数我们不写构造时编译器默认生成的构造函数,都叫做 默认构造函数
    • 这三个函数有且只有一个存在,不能同时存在 。因为他们都可以不传参数,会造成调用歧义
    • 有很多小伙伴以为默认构造函数是编译器默认生成的那个构造函数,但实际上无参构造函数、全缺省构造函数也是默认构造函数
    • 总结下来就是==不传实参 就可以调用的构造就叫 默认构造==
        
  3. 我们不写,编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说是否初始化内置类型成员时不确定的,看编译器。
      
  4. 对于自定义类型成员变量,要求调用这个成员变量的 默认构造函数 来初始化,如果这个成员变量没有默认构造函数,程序会报错。这时,我们要初始化这个变量,需要用初始化列表才能解决,这点我们等下再学习

  
  我们来看看我们不写构造函数时,编译器自动生成的默认构造内置类型自定义类型的成员变量的处理

我们来看下面一段代码:

class A
{
public:
	A(int a = 100, int b = 100, int c = 100)
	{
		_a = a;
		_b = b;
		_c = c;

		//打印,看该默认构造是否被调用
		cout << _a << " " << _b << " " << _c << endl;
	}

private:
	int _a;
	int _b;
	int _c;
};

class Date
{
public:
	void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
	A _a;
};

int main()
{
	Date d1;
	d1.Print();
	return 0;
}

  
运行结果:

在这里插入图片描述

  在 D a t e Date Date 类中,有 4 个成员变量:_ y e a r year year;_ m o n t h month month;_ d a y day day;_ a a a,前三个是内置类型,最后一个自定义类型 D a t e Date Date 类中并没有写构造函数。

  • 系统自动生成默认构造函数并没有对内置类型成员变量初始化(有些编译器会初始化成 0,看具体编译器)
  • 但是对于自定义类型 A 类,系统调用了A类中的默认构造函数,完成了对 _a 自定义类型成员变量的初始化

  而如果 自定义类型没有默认构造函数,系统就会报错
如:

class A
{
public:
	A(int a)
	{
		_a = a;
	}

private:
	int _a;

};

class Date
{
public:
	void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
	A _a;
};

int main()
{
	Date d1;
	d1.Print();
	return 0;
}

在这里插入图片描述

  上述代码,A类中写了需要传递实参的构造函数,它不属于无参和全实参构造;同时,因为写了构造函数,编译器也不会自动生成,因此A类中是没有默认构造函数的。
  

回到文章开头的那两个问题:

  • 我们不写时,编译器默认生成的函数行为是什么,是否满足我们的需求
  • 编译器默认生成的 函数不满足我们的需求,我们需要自己实现,那么如何自己实现。

  总结:

  • 内置类型,编译器自动生成的默认构造大多数情况时不满足我们的使用需求的。
  • 自定义类型,编译器自动生成的默认构造会自动调用该自定义类型的默认构造,从而完成对自定义类型的初始化。当然如果该自定义类型没有默认构造,编译器会报错

  构造函数应写尽写!
  

2.3、初始化列表

2.3.1、什么是初始化列表

  前面我们写的构造函数,虽然在调用之后,对象中有了初始值,但是它并不能称为是对对象中成员变量的初始化;构造函数体中的语句我们只能将其称为赋初值,而不能称作是初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值

  构造函数初始化的方式是 初始化列表,初始化列表的使用方式是:以一个冒号开始,接着是一个以逗号分隔的数据或成员列表,每个成员变量后面跟一个放在括号中初始值或表达式

  既然是定义初始化,那就只能初始化一次,因此每个成员变量在初始化列表中只能出现一次

  尽量使用初始化列表初始化,因为初始化列表是定义的地方,所以即使是不在初始化列表初始化的成员也会走一遍初始化列表。对于没有显示在初始化列表初始化的内置类型成员是否初始化取决于编译器;对于没有显示在初始化列表初始化的自定义类型成员编译器会调用这个成员类型的默认构造函数,如果没有默认构造会编译错误。

  单看文字,相信大家对什么定义初始化;什么赋值;初始化列表的使用方式一脸懵逼。没关系,我们直接上代码

在这里插入图片描述

  

2.3.2、初始化列表和函数体关系

  既然初始化列表是 变量的初始化,那之前学习的写在函数体中的代码是什么呢?是 赋值,相当于给成员变量的赋值。

  初始化列表和函数体可以混合使用
如:

Date(int year = 2000, int month = 1, int day = 1)
	:_year(year + 10)
	,_month(3)
{
	_day = day;
}

运行结果:

在这里插入图片描述

:成员变量后面的括号可以是初始值表达式,不一定要形参
  
  编译器会执行初始化列表执行函数体中代码(先初始化才能赋值对吧)

在这里插入图片描述

  虽然动图中,在初始化列表代码并没有执行 _ d a y day day,但实际上 _ d a y day day 是被隐式执行,只是并没有被初始化,为随机值。初始化列表是定义的地方,_ d a y day day 不再初始化列表定义又在哪定义呢。
  
  函数体可以做到初始化列表做不到的功能,有时需要他们配合使用
如:

	Date(int year = 2000, int month = 1, int day = 1)
		:_year(year)
		,_month(month)
		,_day(day)
		,_ptr((int*)malloc(sizeof(int)))
	{
		if (nullptr == _ptr)
		{
			perror("malloc fail");
			exit(1);
		}
		else
		{
			memset(_ptr, 0, 1);
		}
	}

  

2.3.3、必须使用初始化列表的情况

   c o n s t const const 成员变量引用成员变量没有默认构造的类类型变量必须放在初始化列表位置进行初始化,否则会编译报错

  为什么呢?我们一起来看看

2.3.3.1、 c o n s t const const 成员变量

  我们先来看下面这代码是否可行

int main()
{
	const int a;
	a = 1;
	return 0;
}

  是不行的,因为 c o n s t const const 修饰的变量必须进行初始化,且初始化后值不能再改变

  因此 c o n s t const const 修饰的变量需在初始化列表中定义初始化

class A
{
public:
	A()
		:_a(10)
	{}
private:
	const int _a;
};

  

2.3.3.2、引用成员变量

  引用成员变量的原因与 c o n s t const const 的类似
  引用在定义时必须初始化

class A
{
public:
	A(int& xx)
		:_x(xx)
	{}
private:
	int& _x;
};

我们可以看到一个有意思的情况:

class A
{
public:
	A(int& rx)
		:_rx(rx)
	{}

	void func()
	{
		++_rx;
		++_rx;
	}
private:
	int& _rx;
};

int main()
{
	int n = 0;
	A a(n);
	a.func();
	cout << n << endl;
	return 0;
}

运行结果:

在这里插入图片描述

  可以看到, n n n 是变了
  为什么呢?

  • n n n 传给rx, r x rx rx n n n 的别名, r x rx rx 就是 n n n,而 _ r x rx rx 又是 r x rx rx 的别 名,这样 _ r x rx rx 就是 n n n 的别名,_ r x rx rx 就是 n n n。在类中对_ r x rx rx 的改变,类外的 n n n 自然也就跟着改变啦

  当你想在对象中发生了某个行为,外面的变量 n n n 就跟着变,就能这样使用

  

2.3.3.3、没有默认构造的类

  我们知道,对于自定义类型,我们不写,编译器会自动调其默认构造函数,如果其没有默认构造函数,则报错

那对于没有默认构造函数的类型又该怎么办呢?

class Time
{
	public :
	Time(int hour)
		: _hour(hour)
	{
		cout << "Time()" << endl;
	}
private:
	int _hour;
};
class Date
{
public:
	
private:
	int _year;
	int _month;
	int _day;
	Time _t;
};

这时候就需要在初始化列表中自己传参数

	Date(int year = 2000, int month = 1, int day = 1)
		:_year(year)
		,_month(month)
		,_day(day)
		,_t(1)
	{}

当然,如果是全缺省默认构造也可以这么给值

  

2.3.4、变量声明时给缺省值(默认值)

  C++11 支持在 声明的位置缺省值(默认值),这个缺省值主要是给 没有显式在初始化列表初始化的成员用的

如:

class Date
{
public:
	Date(int year = 2000, int month = 1, int day = 1)
		:_year(year)
		,_month(month)
	{}
private:
	//C++11
	//声明, 给缺省值
	int _year = 10;
	int _month = 10;
	int _day = 10;
};
int main()
{
	Date d(2024);
	return 0;
}

运行结果:

在这里插入图片描述

  为什么是这个结果呢?先别急

  我们 先来思考这样写 p r i v a t e private private 的内容是定义吗?
  它还是声明,不是定义。
  定义的特点是木已成舟,已经把空间开出来了;而声明是告知你有这个东西存在

  • 如果成员在初始化列表中没有显式示初始化,则用声明时给的缺省值对其进行初始化;如果在初始化列表中显式初始化,这用成员变量后边()中的表达式对其进行初始化

  
  现在,我们再看为什么是这个结果:

  • 首先是 _ y e a r year year:这里直接传实参 2024,这个没有问题
  • 后是 _ m o n t h month month:_ m o n t h month month 在初始化列表中显示初始化,所以没有声明时给的缺省值什么事。因为没传参数,这里 _ m o n t h month month 的值是形参中的缺省值 1
  • 最后来看 _ d a y day day
    • _ d a y day day没有在初始化列表中显示初始化,因此用声明时给的缺省值初始化
    • 这里别看函数形参 d a y day day 有个缺省值 1 就以为初始化为 1,函数中并没有使用 d a y day day 这个形参。我多设置几个形参怎么了嘛,而且 d a y day day 只是形参名,与成员变量 _ d a y day day 并没有关系, d a y day day 也可以叫其他名。
    • 即使形参 d a y day day 给上实参,初始化的值依然是声明时的缺省值,因为初始化列表中没有显式示初始化

  缺省值不仅仅可以是一个数值,它还可以是表达式

class Date
{
public:
	Date(int year = 2000, int month = 1, int day = 1)
		:_year(year)
		,_month(month)
		,_day(day)
	{}

private:
	int _year = 1;
	int _month = 1;
	int _day = 1;

	int* _ptr = (int*)malloc(12);
	Time _t = 1;  //Time是一个类,前文有提到,这里不再赘述
};

  相当于只要初始化列表成员变量后面()中允许的,声明时给的缺省值也允许、

  

2.3.5、初始化列表初始化顺序

  我们先看下面代码的运行结果是什么

A.输出 1 1      B.输出 2 2   C.编译报错
D.输出 1 随机值   E.输出 1 2    F.输出 2 1

class A
{
public :
	A(int a)
		: _a1(a)
		, _a2(_a1)
	{}
	void Print() 
	{
		cout << _a1 << " " << _a2 << endl;
	}
private:
	int _a2 = 2;
	int _a1 = 2;
};
int main()
{
	A aa(1);
	aa.Print();
}

答案:D

为什么呢?
我们先来看个小知识点

  • 初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的先后顺序无关。因此建议声明顺序和初始化顺序保持一致

  上述代码中:先初始化的是 _ a 2 a2 a2,_ a 2 a2 a2 用 _ a 1 a1 a1 来定义初始化,那此时的 _ a 1 a1 a1 是什么情况呢?
  这里,在建立函数栈帧时,整个对象的空间就已经开好了,用 _ a 1 a1 a1 去初始化并不会出现什么语法错误
  因为此时的 _ a 1 a1 a1 还是随机值,所以 _ a 2 a2 a2 初始化后还是随机值
  再之后是 _ a 1 a1 a1 的初始化,初始化为 1 ,这点相信大家没什么问题。

  为什么初始化列表的初始化顺序是按声明的顺序走呢?
  因为声明中的顺序其实是内存中成员变量存放的顺序,编译器这么做也是合理的
  

2.3.6、总结

2.3.6.1、构造函数特点总结
  • 函数名与类名相同
  • 无返回值(返回值啥都不需要给,也不需要写void)
  • 对象实例化时系统会自动调用对应的构造函数
  • 构造函数可以重载
  • 如果类中没有显式定义构造函数,则 C++ 编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成
      
  • 无参构造函数全缺省构造函数我们不写编译器默认生成的构造函数,都叫做默认构造函数。但是这三个函数有且只有一个存在,不能同时存在。无参构造函数和全缺省构造函数虽然构成函数重载,但是调用时会存在歧义。要注意很多小伙伴会认为默认构造函数是编译器默认生成的那个叫默认构造,实际上无参构造函数、全缺省构造函数也是默认构造,总结一下就是不传实参就可以调用的构造就叫默认构造
      
  • 我们不写,编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说是否初始化是不确定的,看编译器。对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始化。如果这个成员变量没有默认构造函数,那么就会报错,我们要初始化这个成员变量,需要用初始化列表才能解决

  
说明:C++ 把类型分成内置类型(基本类型)和⾃定义类型。内置类型就是语⾔提供的原⽣数据型,如: i n t int int / c h a r char char / d o u b l e double double /指针等,⾃定义类型就是我们使⽤ c l a s s class class / s t r u c t struct struct 等关键字⾃⼰定义的类型。

  

2.3.6.1、初始化列表知识点总结

初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个“成员变量”后面跟着一个放在括号中的初始值或表达式

  • 每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量 定义初始化 的地方
  • 用成员变量const成员变量没有默认构造的类类型变量必须放在初始化列表位置进行初始化,否则会编译报错
  • C++11 支持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显式在初始化列表初始化的成员使用的
  • 尽量使用初始化列表初始化,因为那些你不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值(默认值),初始化列表会用这个缺省值初始化。如果你没有给缺省值,对于没有显式在初始化列表初始化列表初始化的内置类型成员是否初始化取决于编译器,C++没有规定。对于没有显式在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造会编译错误
  • 初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的先后顺序无关。建议声明顺序和初始化列表顺序保存一致

  

2.3.6.2、初始化列表行为脉络
  • 每个构造函数都有初始化列表
  • 每一个成员都要走初始化列表
    • 初始化列表初始化的成员(显式写)
    • 没有在初始化化列表初始化的成员(不显式写)
      • 声明的地方有缺省值
      • 没有缺省值
        • 内置类型不确定是否初始化,看编译器,大概率是随机值
        • 自定义类型,调用默认构造,没有默认构造就编译报错
    • 引用、const、没有默认构造的自定义类型,必须在初始化列表初始化

  

3、析构函数

3.1、初见析构

  析构函数与构造函数功能相反。就像构造函数不是完成对象的创建;析构函数也不是完成对对象本身的销毁。局部对象的空间是建立函数栈帧时开好的销毁是在函数结束时,栈帧销毁,它就释放了,不需要我们管。
  C++ 规定对象在销毁时会自动调用析构函数,完成对象中资源的清理释放工作。析构函数的功能类比我们之前实现栈 S t a c k Stack Stack、或实现队列 Q u e u e Queue Queue 中的 D e s t r o y Destroy Destroy 功能
   D a t e Date Date 类没有 D e s t r o y Destroy Destroy,其实就是没有资源需要释放,所以严格来说 D a t e Date Date 是不需要析构函数的。

  
析构函数的特点:

  • 析构函数名是在类名前加上字符 ~
  • 无参数无返回值。(这里构造类似,也不需要加void)
  • 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
  • 对象生命周期结束时,系统会自动调用析构函数
  • 一个局部域的多个对象,C++ 规定后定义的先析构

  析构函数的命名也很好理解:析构函数和构造函数是相反的功能。而 “~” 操作符表示取反
  因为析构函数无参数无返回值,所以析构函数不构成函数重载,只能有一个析构函数
  析构函数有点类似于栈:后定义的先析构
  
因为 D a t e Date Date 类中并没有资源需要清理,我们用栈类进行举例:

在这里插入图片描述

  
我们调试看一下;

在这里插入图片描述

:该栈对象的销毁是发生在 m a i n main main函数 结束时,销毁对象之前调用了析构函数
  

3.2、深入析构

  与构造函数类似,析构函数也有进阶特点:

  • 跟构造函数类似,我们不写编译器自动生成的析构函数对内置类型成员不做任何在处理自定义类型成员调用它的析构函数
      
  • 我们显示写析构函数,对于自定义类型成员也会调用它的析构,也就是说自定义类型成员无论什么情况都会自动调用其自身析构函数
      
  • 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,如 D a t e Date Date 类;如果默认生成的析构就可以用,也就不需要显示写析构,如 M y Q u e u e MyQueue MyQueue(用两个栈模拟实现队列)、但是有资源申请时,一定要自己写析构,否则会造成资源泄露,如 S t a c k Stack Stack 类。

  
下面实现 M y Q u e u e MyQueue MyQueue 类(用两个栈模拟实现队列)就不用我们写析构,因为编译器自动会调用两个 S t a c k Stack Stack 类的析构函数

// 两个Stack实现队列
class MyQueue
{
public :
	//编译器默认⽣成MyQueue的析构函数调⽤了Stack的析构,释放的Stack内部的资源

private:
	Stack pushst;
	Stack popst;
};
int main()
{
	Stack st;
	MyQueue mq;
	return 0;
}

在这里插入图片描述

  可以看到, M y Q u e u e MyQueue MyQueue自动调用了两次 S t a c k Stack Stack 类的析构
  并且,因为 s t st st 对象是先定义; m q mq mq 对象是后定义,析构时,先析构 m q mq mq,再析构 s t st st
  
  现在,我比较作,自己在 M y Q u e u e MyQueue MyQueue 上写了一个析构函数,但啥都不干,会发生什么呢?

// 两个Stack实现队列
class MyQueue
{
public :
	~MyQueue()
	{
		cout << "~MyQueue()" << endl;
	}

private:
	Stack pushst;
	Stack popst;
};
int main()
{
	Stack st;
	MyQueue mq;
	return 0;
}

在这里插入图片描述

  可以看到, M y Q u e u e MyQueue MyQueue 中的资源还是正常释放
  这是因为即使我们显示写析构函数,对自定义类型,编译器执行完当前自己的析构函数后还会调用自定义类型的析构函数
  
  那要是连 S t a c k Stack Stack 类中的析构函数也不写呢?那就内存泄漏了。自己作,真救不了。
  
  以前写C语言时,可能申请了空间总是忘记释放,现在有了析构函数就不再有这样的烦恼啦。

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

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

相关文章

AS400==tutorial for Beginners

系统AS400 语言RPGLE 参考视频&#xff1a; https://www.youtube.com/watch?vFqgwYsp7mjk&listPL3W4xRdnQJHVWWmYX1Klji7QUk_PQhq0t&index5 Lesson 1 | Introduction to As-400 and setting up As-400 Environment. 客户端软件TN5250 Terminal Emulation for Window…

MyBatis全方位指南:从注解到XML文件的数据库操作

目录 一.什么是MyBatis 入门程序初体验 二.MyBatis基本操作CRUD ▐ 增(Insert) 返回主键 ▐ 删(Delete) ▐ 改(Update) ▐ 查(Select) 起别名 结果映射 开启驼峰命名(推荐) 三.MyBatis XML配置文件 ▐ 增(Insert) ▐ 删(Delete) ▐ 改(Update) ▐ 查(Select) …

PostgreSQL(二十三)TOAST技术

目录 一、TOAST简介 二、TOAST的存储方式 1、存储方式概述 2、实验&#xff1a;创建TOAST表 三、TOAST的4种压缩策略 1、策略说明 2、TOAST表额外的三个字段 四、TOAST表的计算方式 1、说明 2、实验&#xff1a;计算表大小 五、TOAST表的特点 1、优点 2、缺点 3、…

【KAN】【API教程】get_fun

抽取某个激活函数的样子 from kan import * import matplotlib.pyplot as plt # create a KAN: 2D inputs, 1D output, and 5 hidden neurons. cubic spline (k3), 5 grid intervals (grid5). model KAN(width[2,5,1], grid5, k3, seed0) x torch.normal(0,1,size(100,2)) m…

给虚拟机Ubuntu扩展硬盘且不丢数据

1.Ubuntu关机状态下先扩展&#xff0c;如扩展20GB 2.进入ubuntu&#xff0c;切换root登录&#xff0c;必须是root全选&#xff0c;否则启动不了分区工具gparted 将新的20GB创建好后&#xff0c;选择ext4,primary&#xff1b; 3.永久挂载 我的主目录在/并挂载到/dev/sda1 从图…

C++解决:早餐组合

前言 应该都知道我之前沉默了很长一段时间&#xff0c;现在慢慢想明白了&#xff0c;会继续创作&#xff0c;真的非常感谢大家对我这个幼稚小孩的支持与鼓励。 有朋友私信问我退的原因&#xff0c;在这里和大家简要说一下【狗头】 我认识一位开学初三的学长&#xff0c;他和…

H81002S 1.7mm网络变压器:BMS汽车蓝牙接收器中的超薄共模电感科技

华强盛导读&#xff1a;在当今这个日新月异的汽车科技领域&#xff0c;每一处细节都蕴含着创新与突破。作为电动汽车心脏的电池管理系统&#xff08;BMS&#xff09;&#xff0c;其高效稳定的运行不仅关乎续航与安全&#xff0c;更是智能化驾驶体验的基石。而在这背后&#xff…

有那些AI数字人制作软件?

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 之前由于工作需要&#xff0c;要录制1 个真人讲PPT的视频&#xff0c;作为典型I人&#xff0c;本人露面是不可能的。 于是打起了数字人…

二维码门楼牌管理应用平台建设:打造高效运维新生态

文章目录 前言一、系统运维概述二、菜单管理&#xff1a;个性化服务的关键三、参数管理&#xff1a;优化系统性能的关键四、字典管理&#xff1a;数据标准化的基石五、邮件管理&#xff1a;沟通协作的桥梁六、任务调度&#xff1a;自动化工作的核心七、短信管理&#xff1a;及时…

头发健康知识一

头发重要性: 头发是人第二张脸,影响人容貌 形象和气质.头皮基本结构 角质层,颗粒层,有挤层,基底层4个细胞层组成,含有大量毛囊和皮脂腺和汗腺.头屑是什么? 头屑为角质细胞的新陈代谢脱落的死细胞,每天都会有十几万角质细胞脱落 (正常的代谢周期为28天). 当基底层细胞受损时…

32.x86游戏实战-使用物品call

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

MySql审计平台

安装方式&#xff1a; cookieY/Yearning: &#x1f433; A most popular sql audit platform for mysql (github.com) 对数据库的一系列后台操作 AI助手 - AI助手提供SQL优化建议&#xff0c;帮助用户优化SQL语句&#xff0c;以获得更好的性能。同时AI助手还提供文本到SQL的…

手把手教你OpenCV常见滤波(高斯,中值,均值)C++

目录 1 图像处理中的高斯函数 1.1一维高斯函数 1.2二维高斯函数 1.3 代码 1.4 结果 2 低通滤波之均值滤波器 2.1、空间滤波基础 2.1.1线性空间滤波原理 2.1.2 相关与卷积 2.2、平滑滤波之均值滤波器 2.2.1原理 2.2.2 c opencv代码 2.2.3 结果 3 中值滤波 3.1 c …

LC 42.接雨水

42.接雨水 给定n个非负整数表示每个宽度为1的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a; height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a; 6 解释&#xff1a; 上面是由数组 [0,1,0,2,1,0,1,3…

临床随机对照试验中的分层问题及其解决方法

在临床随机对照试验&#xff08;Randomized Controlled Trials, RCTs&#xff09;中&#xff0c;分层问题&#xff08;Stratification Issues&#xff09;是影响研究结果有效性的重要因素之一。RCTs是评估医疗干预效果的金标准&#xff0c;旨在通过随机分组和对照来消除干扰因素…

PPP 协议分析(实验报告)

实验设备及软件 &#xff08;1&#xff09;硬件设备&#xff1a;PC 机或笔记本电脑&#xff1b;&#xff08;2&#xff09;软件&#xff1a;H3C Cloud Lab 实验环境配置 &#xff08;1&#xff09;实验拓扑图 &#xff08;2&#xff09;网络配置参数 Device Interface IP/…

基于JSP的家用电器销售网站

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPJava 工具&#xff1a;ECLIPSE、MySQL数据库管理工具、Tomcat 系统展示 首页 个人中心 商品信…

华为od机试真题:内存冷热标记(Python)

2024华为OD机试&#xff08;C卷D卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 现代计算机系统通常存在多级的存储设备&#xff0c;针对海量的 wordload 的优化的一种思路是将热点内存页优化先放到快速存储层级&#xff0c;这就需要对内存页进行冷热标记。 …

吴恩达机器学习WEEK2

COURSE1 WEEK2 多维特征 在线性回归中&#xff0c;往往特征不止一个&#xff0c;而是具有多维特征 例如&#xff0c;在预测房价的例子中&#xff0c;我们知道更多的信息&#xff1a; x 1 x_1 x1​&#xff1a;房屋的面积 x 2 x_2 x2​&#xff1a;卧室的数目 x 3 x_3 x3​&a…

天气预报仿写总结

目录 前言 首页 搜索页 详情页 浏览页 前言 这周学习了iOS中简单的网络请求&#xff0c;并完成了天气预报的仿写&#xff0c;这篇博客来做一下总结。天气预报主要要实现四个界面&#xff0c;接下来分四个界面分别讲解一下。 首页 首页的布局就是上方两个很简单的控件添加…