C++对象的初始化和清理,构造函数,析构函数,深拷贝,浅拷贝,初始化列表,静态成员变量,静态成员函数

news2024/11/26 10:42:31

目录

 

 1、构造函数和析构函数

2、构造函数的分类及调用

3、拷贝构造函数的调用时机,什么时候会用到拷贝构造函数

4、构造函数的调用规则

 4.1只要写了一个类,C++编译器都会给每个类至少添加三个函数

 4.2如果我们写了有参构造函数,编译器就不再提供默认构造函数,依然提供拷贝构造函数

4.3 如果我们写了拷贝构造函数,那么编译器就不再提供其他的构造函数

 5、深拷贝和浅拷贝

5.1浅拷贝 

​编辑5.2深拷贝

6、初始化列表--给类中的属性进行初始化操作

7、类对象作为类成员(类中的成员可以是另一个类的对象)--构造和析构的顺序

8、静态成员

 8.1静态成员变量

8.1.1共享同一份内存,类外初始化

8.1.2静态成员变量有两种访问方式--通过对象进行访问,通过类名进行访问

8.2静态成员函数--只能访问静态成员变量,访问方式有2种

 1、构造函数和析构函数

 

#include<iostream>
using namespace std;

//对象的初始化和清理
 
class Person
{
public:
	//1、1构造函数 来进行初始化的操作
	//没有返回值,也不用写void
	//函数名域类名相同
    //构造函数可以有参数,可以发生重载
	//创建对象的时候,构造函数会自动调用,而且只调用一次
	//不写构造函数,编译器提供的是空实现,函数内部什么语句也没有
	/*这样的
	Person()
	{
	}
	*/
	Person()
	{
		cout << "Person 构造函数的调用" << endl;
	}

	//2、析构函数 来进行清理的操作
	//没有返回值,也不写void
	//函数名和类名相同,在名称加~
	//析构函数不可以有参数,不可以发生重载
	//对象在销毁前会自动调用析构函数,而且只会调用一次
	//不写析构函数,编译器提供的是空实现,函数内部什么语句也没有
	/*这样的
	~Person()
	{
		
	}
	*/
	~Person()
	{
		cout << "Person 析构函数的调用" << endl;
	}
};


//构造和析构都是必须有的实现,如果我们自己不提供,
//编译器会提供一个空实现(里面一行代码都么有)的构造和析构
void test01()
{
	Person p;//局部变量,栈区数据,test01执行完毕后,释放就会这个对象
}
int main()
{
	test01();
	/*输出
	Person 构造函数的调用
    Person 析构函数的调用
	*/

	system("pause");//按任意键继续
	return 0;
}
#include<iostream>
using namespace std;

//对象的初始化和清理
 
class Person
{
public:
	//1、1构造函数 来进行初始化的操作
	//没有返回值,也不用写void
	//函数名域类名相同
    //构造函数可以有参数,可以发生重载
	//创建对象的时候,构造函数会自动调用,而且只调用一次
	//不写构造函数,编译器提供的是空实现,函数内部什么语句也没有
	/*这样的
	Person()
	{
	}
	*/
	Person()
	{
		cout << "Person 构造函数的调用" << endl;
	}

	//2、析构函数 来进行清理的操作
	//没有返回值,也不写void
	//函数名和类名相同,在名称加~
	//析构函数不可以有参数,不可以发生重载
	//对象在销毁前会自动调用析构函数,而且只会调用一次
	//不写析构函数,编译器提供的是空实现,函数内部什么语句也没有
	/*这样的
	~Person()
	{
		
	}
	*/
	~Person()
	{
		cout << "Person 析构函数的调用" << endl;
	}
};


//构造和析构都是必须有的实现,如果我们自己不提供,
//编译器会提供一个空实现(里面一行代码都么有)的构造和析构
void test01()
{
	Person p;//局部变量,栈区数据,函数(test01)执行完毕后,释放就会这个对象
}
int main()
{
	Person p;
	/*
	输出:Person 构造函数的调用
	*/
	//欸?怎么没有析构,因为我们函数还没执行完
	//还有下面的按任意键继续
	//盯着黑窗口看,会看到析构函数调用一闪而过
	system("pause");//按任意键继续
	return 0;
}

2、构造函数的分类及调用

#include<iostream>
using namespace std;

//构造函数的分类及调用

//分类
//按照参数分类 无参构造(也称默认构造)和有参构造
//按照类型分类 普通构造函数 拷贝构造函数,不是拷贝构造的,都是普通构造
class Person
{
public:
	Person()
	{
		cout << "Person的无参构造函数的调用" << endl;
	}
	Person(int a)
	{
		age = a;
		cout << "Person的有参构造函数的调用" << endl;
	}
	//拷贝构造函数
	Person(const Person &p)//形参和当前类名一样,const防止对它进行修改
	{//作用:比如传进来个张三,复制出来一个和它一模一样的

		//将传入的人身上所有的属性,拷贝到当前对象身上
		//谁调用这个拷贝构造就传给谁
		age = p.age;
		cout << "Person的拷贝构造函数" << endl;
	}
	~Person()
	{
		cout << "Person的构析构函数的调用" << endl;
	}
	int getAge()
	{
		return age;
	}
private:
	int age;
};

//构造函数的调用
void test01()
{
	//1、括号法,推荐使用
	Person p1;//默认构造函数(无参构造函数)的调用
	Person p2(10);//有参构造函数
	Person p3(p2);//拷贝构造函数
	cout << "p2的年龄:" << p2.getAge() << endl;
	cout << "p3的年龄:" << p3.getAge() << endl;

	//注意事项1:
	//调用默认构造函数的时候,不要加()
	// 因为下面这行代码编译器会认为是一个函数的声明,不会认为在创建对象
	// Person p4()
	void func();//在一个函数体内是可以写另一个函数的声明的

	//2、显示法
	cout << "显示法" << endl;
	Person p5;//默认构造函数(无参构造函数)的调用
	Person p6 = Person(10);//有参构造函数
	Person p7 = Person(p6);//拷贝构造函数

	Person(10);//称为匿名对象,创建了一个对象,但没有名
	//放在等号右边,匿名对象就有名了,等号左边就是它的名
	//匿名对象的特点,当前行执行结束后,系统会立即回收掉匿名对象
	cout << "AAAAA" << endl;

	//注意事项2
	// 不要利用拷贝构造函数 初始化匿名对象
	// 因为编译器会认为Person(p7);等价于Person p7;
	// 无参构造一个p7对象,但是我们已经创建了
	//Person(p7);//调用拷贝构造函数,初始化匿名对象
	
	
	//3、隐式转换法
	//直接写传参的数据
	cout << "隐式转换法" << endl;
	Person p8 = 10;//相当于写了Person p8=Person(10)
	Person p9 = p8;//拷贝构造
}
int main()
{
	test01();
	system("pause");//按任意键继续
	return 0;
}

3、拷贝构造函数的调用时机,什么时候会用到拷贝构造函数

#include<iostream>
using namespace std;


//拷贝构造函数的调用时机



class Person
{
public:
	Person()
	{
		cout << "Person 构造函数的调用" << endl;
	}
	Person(int age)//有参构造函数
	{
		cout << "Person有参构造函数" << endl;
		m_Age = age;
	}
	Person(const Person& p)//拷贝构造函数
	{
		cout << "Person拷贝构造函数调用" << endl;
		m_Age = p.m_Age;
	}
	~Person()
	{
		cout << "Person 析构函数的调用" << endl;
	}
	int m_Age;
};

//1、使用一个已经创建完毕的对象来初始化一个新对象
void test01()
{
	Person p1(20);
	Person p2(p1);
	cout << "p2的年龄" << p2.m_Age << endl;
}

//2、值传递的方式给函数传值

void doWork(Person p)//值传递的本质就是拷贝出来一个临时的副本
{
	//会调用拷贝构造函数
}
void test02()
{
	Person p;
	doWork(p);
}
//3.值方式返回局部对象

Person doWork2()
{
	Person p1;
	cout << (int)&p1 << endl;
	return p1;//局部变量,函数执行完之后,就会被释放掉
	//以值的方式返回,不会返回p1,会拷贝出来一个新的返回
}
void test03()
{
	Person p = doWork2();
	cout << (int)&p << endl;
}
int main()
{
	cout << "test01" << endl;
	test01();
	cout << "test02" << endl;
	test02();
	cout << "test03" << endl;
	test03();
	//说白了,拷贝构造函数的调用时机,一个是值的方式来传数据
	//另一个是以值的方式返回,当用值的方式返回时,也会调用拷贝构造函数
	system("pause");//按任意键继续
	return 0;
}
/*
这里person p = doWork2()不会调用拷贝方法,因为编译器优化,会直接用对象p存放dowork2()的返回值。
这个问题在维基百科上叫做copy ellision。中文叫复制省略
*/

我们的代码和图片运行结果不一样,这是因为编译器的优化。

这里person p = doWork2()不会调用拷贝方法,因为编译器优化,会直接用对象p存放dowork2()的返回值。这个问题在维基百科上叫做copy ellision。中文叫复制省略。

4、构造函数的调用规则

 4.1只要写了一个类,C++编译器都会给每个类至少添加三个函数

 自己提供拷贝构造函数

#include<iostream>
using namespace std;

//构造函数的调用规则

//1、只要写了一个类,C++编译器都会给每个类至少添加三个函数,
// 不管你写不写这三个函数,写了就用你的,不写编译器自己提供

//默认构造函数(无参,空实现)
//析构函数(无参,空实现)
//拷贝构造函数(对属性进行值拷贝)

class Person
{
public:
	Person()
	{
		cout << "Person 默认构造函数的调用" << endl;
	}
	Person(int age)
	{
		cout << "Person 有参构造函数的调用" << endl;
		m_Age = age;
	}
	Person(const Person& p)
	{
		cout << "Person 拷贝构造函数的调用" << endl;
		m_Age = p.m_Age;
	}
	~Person()
	{
		cout << "Person 析构函数的调用" << endl;
	}
	int m_Age;
};


void test01()
{
	Person p1;
	p1.m_Age = 18;

	Person p2(p1);
	cout << "p2的年龄为" << p2.m_Age << endl;
}


int main()
{
	test01();
	system("pause");//按任意键继续
	return 0;
}

当自己不提供默认构造函数时,程序也会提供

#include<iostream>
using namespace std;

//构造函数的调用规则

//1、只要写了一个类,C++编译器都会给每个类至少添加三个函数,
// 不管你写不写这三个函数,写了就用你的,不写编译器自己提供

//默认构造函数(无参,空实现)
//析构函数(无参,空实现)
//拷贝构造函数(对属性进行值拷贝)

class Person
{
public:
	Person()
	{
		cout << "Person 默认构造函数的调用" << endl;
	}
	Person(int age)
	{
		cout << "Person 有参构造函数的调用" << endl;
		m_Age = age;
	}
	/*
	 Person(const Person& p)
	{
		cout << "Person 拷贝构造函数的调用" << endl;
		m_Age = p.m_Age;
	}
	*/
	~Person()
	{
		cout << "Person 析构函数的调用" << endl;
	}
	int m_Age;
};


void test01()
{
	Person p1;
	p1.m_Age = 18;

	Person p2(p1);
	cout << "p2的年龄为" << p2.m_Age << endl;
}


int main()
{
	test01();
	system("pause");//按任意键继续
	return 0;
}

 4.2如果我们写了有参构造函数,编译器就不再提供默认构造函数,依然提供拷贝构造函数

#include<iostream>
using namespace std;

//构造函数的调用规则

//1、只要写了一个类,C++编译器都会给每个类至少添加三个函数,
// 不管你写不写这三个函数,写了就用你的,不写编译器自己提供

//默认构造函数(无参,空实现)
//析构函数(无参,空实现)
//拷贝构造函数(对属性进行值拷贝)

//2、如果我们写了有参构造函数,编译器就不再提供默认构造函数,
//依然提供拷贝构造函数
class Person
{
public:
	
	Person(int age)
	{
		cout << "Person 有参构造函数的调用" << endl;
		m_Age = age;
	}
	~Person()
	{
		cout << "Person 析构函数的调用" << endl;
	}
	int m_Age;
};




void test02()
{
	//Person p;//会报错,因为我们提供了有参构造函数,
	//那么编译器就不会在提供默认构造函数,我们也没提供默认构造函数,所以报错
	Person p1(28);
	Person p2(p1);
	cout << "p2的年龄为" << p2.m_Age << endl;
}
int main()
{
	test02();
	system("pause");//按任意键继续
	return 0;
}

4.3 如果我们写了拷贝构造函数,那么编译器就不再提供其他的构造函数

#include<iostream>
using namespace std;

//构造函数的调用规则

//1、只要写了一个类,C++编译器都会给每个类至少添加三个函数,
// 不管你写不写这三个函数,写了就用你的,不写编译器自己提供

//默认构造函数(无参,空实现)
//析构函数(无参,空实现)
//拷贝构造函数(对属性进行值拷贝)

//2、如果我们写了有参构造函数,编译器就不再提供默认构造函数,
//依然提供拷贝构造函数

//3.如果我们写了拷贝构造函数,那么编译器就不再提供其他的构造函数(默认、有参)
class Person
{
public:
	
	 Person(const Person& p)
	{
		cout << "Person 拷贝构造函数的调用" << endl;
		m_Age = p.m_Age;
	}
	~Person()
	{
		cout << "Person 析构函数的调用" << endl;
	}
	int m_Age;
};




void test02()
{
	//Person p;//会报错,因为我们提供了拷贝构造函数,
	//那么编译器就不会在提供默认构造函数,我们也没提供默认构造函数,所以报错
	
	//Person p1(28);//会报错,因为我们提供了拷贝构造函数,
	//那么编译器就不会在提供有参构造函数,我们也没提供有参构造函数,所以报错

	
}
int main()
{
	system("pause");//按任意键继续
	return 0;
}

总结

 5、深拷贝和浅拷贝

5.1浅拷贝 

下面的代码会报错

#include<iostream>
using namespace std;

//深拷贝和浅拷贝
// 
// 
//编译器里提供的拷贝构造函数都是浅拷贝


class Person
{
public:
	Person()
	{
		cout << "Person 默认构造函数的调用" << endl;
	}
	Person(int age,int height)
	{
		m_Age = age;
		m_Height = new int(height);//堆区开辟的数据由程序员手动开辟,
		//也需要程序员手动释放,什么时候释放呢?就是在销毁前把它释放掉
		//什么时候被销毁呢?
		cout << "Person 有参构造函数的调用" << endl;
	}
	~Person()
	{
		//析构代码,将堆区开辟的数据做释放操作
		if (m_Height != NULL)//如果它不空
		{
			delete m_Height;//释放它指向的堆区的内存
			m_Height = NULL;//避免出现野指针,给它置空
		}
		cout << "Person 析构函数的调用" << endl;
	}
	int m_Age;
	int* m_Height;//用指针定义一个身高,因为我们要把身高的数据开辟到堆区
	//new开辟的是内存,所以用指针
};


void test01()
{
	Person p1(18,160);
	cout << "p1的年龄为:" <<p1.m_Age<<"p1的身高为:"<<*p1.m_Height << endl;
	Person p2(p1);//编译器里提供的拷贝构造函数都是浅拷贝
	cout << "p2的年龄为:" << p2.m_Age << "p2的身高为:" << *p2.m_Height << endl;
	//堆区开辟的数据由程序员手动开辟,
	//也需要程序员手动释放,什么时候释放呢?就是在销毁前把它释放掉
	//什么时候被销毁呢?
	//局部变量,当函数执行完之后,p1,p2就销毁了,p1,p2销毁时调用析构函数
}

int main()
{
	test01();
	system("pause");//按任意键继续
	return 0;
}
/*
拷贝函数是浅拷贝
栈区数据:先进后出
所以p2先执行析构函数
m_Height不空,释放它指向的堆区的内存
接下来是p1,它的指针不空,释放它指向的堆区的内存,
但这块内存已经被p2释放过了,再去释放就是非法操作了 
这就是浅拷贝带来的问题,堆区数据被重复释放
*/

 这是由于栈区数据:先进后出
所以p2先执行析构函数
m_Height不空,释放它指向的堆区的内存
接下来是p1,它的指针不空,释放它指向的堆区的内存,
但这块内存已经被p2释放过了,再去释放就是非法操作了 
这就是浅拷贝带来的问题,堆区数据被重复释放

5.2深拷贝

浅拷贝问题要利用深拷贝解决,编译器提供的浅拷贝不太好使,那就自己写一个拷贝构造函数,使它指向一段新的堆区的数据

#include<iostream>
using namespace std;

//深拷贝和浅拷贝
// 
// 
//编译器里提供的拷贝构造函数都是浅拷贝


class Person
{
public:
	Person()
	{
		cout << "Person 默认构造函数的调用" << endl;
	}
	Person(int age,int height)
	{
		m_Age = age;
		m_Height = new int(height);//堆区开辟的数据(new一块出来内存)由程序员手动开辟,
		//也需要程序员手动释放,什么时候释放呢?就是在销毁前把它释放掉
		//什么时候被销毁呢?
		cout << "Person 有参构造函数的调用" << endl;
	}

	//自己实现拷贝构造函数 解决浅拷贝带来的问题
	Person(const Person &p)
	{
		cout << "Person 拷贝构造函数的调用" << endl;
		/*
		m_Age = p.m_Age;
		m_Height = p.m_Height;
		这是编辑器提供的拷贝构造函数写的内容
		*/
		m_Age = p.m_Age;
		m_Height = new int(*p.m_Height);
	}

	~Person()
	{
		//析构代码,将堆区开辟的数据做释放操作
		if (m_Height != NULL)//如果它不空
		{
			delete m_Height;//释放它指向的堆区的内存
			m_Height = NULL;//给它置空,避免出现野指针
		}
		cout << "Person 析构函数的调用" << endl;
	}
	int m_Age;
	int* m_Height;//用指针定义一个身高,因为我们要把身高的数据开辟到堆区
	//new开辟的是内存,所以用指针
};


void test01()
{
	Person p1(18,160);
	cout << "p1的年龄为:" <<p1.m_Age<<"p1的身高为:"<<*p1.m_Height << endl;
	Person p2(p1);//编译器里提供的拷贝构造函数都是浅拷贝
	cout << "p2的年龄为:" << p2.m_Age << "p2的身高为:" << *p2.m_Height << endl;
	//堆区开辟的数据由程序员手动开辟,
	//也需要程序员手动释放,什么时候释放呢?就是在销毁前把它释放掉
	//什么时候被销毁呢?
	//局部变量,当函数执行完之后,p1,p2就销毁了,p1,p2销毁时调用析构函数
}

int main()
{
	test01();
	system("pause");//按任意键继续
	return 0;
}

总结:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题 。

6、初始化列表--给类中的属性进行初始化操作

#include<iostream>
using namespace std;

//初始化列表
class Person
{
public:
	
	/*
	//传统初始化操作
	Person(int a, int b, int c)
	{
		m_A = a;
		m_B = b;
		m_C = c;
	}
	*/
	
	//初始化列表初始化属性
	Person(int a,int b,int c) :m_A(a), m_B(b), m_C(c) 
	{
		//相当于
		//m_A=a;m_B = b;m_C = c;
	}
	int m_A;
	int m_B;
	int m_C;
};

void test01()
{
	Person p(10, 20, 30);
	cout << "m_A = " << p.m_A << " "
		<< "m_B = " << p.m_B << " "
		<< "m_C = " << p.m_C << endl;
}


int main()
{
	test01();
	system("pause");//按任意键继续
	return 0;
}

7、类对象作为类成员(类中的成员可以是另一个类的对象)--构造和析构的顺序

#include<iostream>
using namespace std;

//一个类的对象作为另一个类的成员

//手机类
class Phone
{
public:
	/*
	Phone()
	{

	}
	*/
	
	Phone(string pName)
	{
		m_PName = pName;
		cout << "Phone构造函数的调用" << endl;
	}
	~Phone()
	{
		cout << "Phone 析构函数的调用" << endl;
	}
	//手机品牌名称
	string m_PName;

};
//人类
class Person
{
public:
	Person(string name,string pName):m_Name(name), m_Phone(pName)
	{
		//m_Phone(pName);等价于
		//Phone m_Phone=pName;隐式转换法
		cout << "Person构造函数的调用" << endl;
	}
	~Person()
	{
		cout << "Person 析构函数的调用" << endl;
	}
	/*
	错误代码,因为phone类中我们提供了有参构造函数,所以系统不会再提供
	默认构造函数,那么Phone phone就不能写呀
	Person(string name, Phone phone)
	{
		m_Name = name;
		m_Phone = phone;
	}
	*/
	/*
	加个默认构造函数也可以这么赋值
	Person(string name, Phone phone)
	{
		m_Name = name;
		m_Phone = phone;
	}
	*/
	
	
	//姓名
	string m_Name;
	//手机
	Phone m_Phone;
};

//当其他类的对象作为本类的成员的时候
	//那么创建本类的对象,会先构造其它类的对象,在构造自身
	//先有人身上的属性(变量),不如胳膊腿,才能有这个人
//析构的顺序与构造相反

void test01()
{
	//Phone ph("苹果");
	//Person p("张三",ph);

	Person p("张三", "苹果");
	cout << p.m_Name << "拿着:" << p.m_Phone.m_PName << endl;
}



int main()
{
	test01();
	
	system("pause");//按任意键继续
	return 0;
}

8、静态成员

 8.1静态成员变量

8.1.1共享同一份内存,类外初始化

#include<iostream>
using namespace std;


//成员这个名词是出现在类中,不管是类中出现的函数也好,属性也好
//我们都成为成员,成员属性,成员函数




class Person
{
public:
	//静态成员变量
	//所有对象共享同一份数据,你改这个数了,那么别人再用的时候就是用的你改的数了
	//编译阶段就分配内存,相当于程序还没运行之前,就已经分配内存了,在全局区里
	//类内声明,类外必须初始化
	static int m_A;
};
int Person::m_A = 100;//类外必须初始化,Person作用于下的
void test01()
{
	Person p;
	cout << p.m_A << endl;
	Person p2;
	p2.m_A = 200;

	//输出100还是200?
	cout << p.m_A << endl;//输出:200
}
int main()
{
	test01();
	
	system("pause");//按任意键继续
	return 0;
}

8.1.2静态成员变量有两种访问方式--通过对象进行访问,通过类名进行访问

#include<iostream>
using namespace std;


//成员这个名词是出现在类中,不管是类中出现的函数也好,属性也好
//我们都成为成员,成员属性,成员函数




class Person
{
public:
	//静态成员变量
	//所有对象共享同一份数据,你改这个数了,那么别人再用的时候就是用的你改的数了
	//编译阶段就分配内存,相当于程序还没运行之前,就已经分配内存了,在全局区里
	//类内声明,类外必须初始化
	static int m_A;
	//静态成员变量也是有访问权限的
private:
	static int m_B;
};
int Person::m_A = 100;//类外必须初始化,Person作用于下的
int Person::m_B = 200;
void test02()
{
	//静态成员变量 不属于某个对象, 所有对象都共享同一份数据
	//因此静态成员变量有两种访问方式
	//1、通过对象进行访问
	Person p;
	cout <<"通过变量进行访问" << p.m_A << endl;
	//2、通过类名进行访问
	cout <<"通过类名进行访问" << Person::m_A << endl;
	//cout << "通过类名进行访问" << Person::m_B << endl;因为m_B是私有权限,类外访问不到
}
int main()
{
	test02();
	
	system("pause");//按任意键继续
	return 0;
}

8.2静态成员函数--只能访问静态成员变量,访问方式有2种

#include<iostream>
using namespace std;

//静态成员函数
//所有对象都共享同一个函数
//静态成员函数只能访问静态成员变量

class Person
{
public:
	//静态成员函数
	static void fun()
	{
		m_A = 100;//静态成员函数可以访问静态成员变量
		//m_B=200;//报错,静态成员函数只能访问静态成员变量
		//因为无法区分到底是哪个对象的m_B
		cout << "static void fun调用" << endl;
	}
	static int m_A;//静态成员变量
	int m_B;//非静态成员变量

	//静态成员函数也是有访问权限的
private:
	static void fun2()
	{
		cout << "static void fun2调用" << endl;
	}
};
int Person::m_A = 0;
void test01()
{
	//静态成员函数的两种访问方式
	//1、通过对象进行访问
	Person p;
	p.fun();
	//2、通过类名访问
	Person::fun();
	//Person::fun2();//报错,类外访问不到私有的静态成员函数
}
int main()
{
	test01();
	
	system("pause");//按任意键继续
	return 0;
}

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

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

相关文章

jsp+ssm计算机毕业设计“原创音乐爱好者”交流网站论文【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

java基础讲义05-数组

数组学习一 一维数组1.1 数组介绍1.2 多个变量和数组对比1.3 数组的定义和初始化1.3.1 数组定义1.3.2 数组初始化1.4 数组访问二 数组内存结构2.1 JVM内存介绍2.1.1一个数组对象的内存图2.1.2常见异常处理三 数组常见操作四 二维数组4.1 二位数组介绍4.2 二维数组定义和初始化4…

C语言---指针初阶---总结

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​ &#x1f4e3;系列专栏&#xff1a;鹏哥带我学c带我飞 &#x1f4ac;总结&#xff1a;希望你看…

工业4.0 资产管理壳学习笔记( 6)-管理壳细节

本文是“资产管理壳细节 Part1的读书笔记。 <Details_of_the_Asset_Administration_Shell_Part1_V3.pdf> 要真正了解工业4.0 的管理壳&#xff0c;绕不开认真地读这篇文章。老实说&#xff0c; 第一次读这个文本会发现什么都明白&#xff0c;就是不知道有什么用场。其实学…

三种大数据应用架构介绍

信息技术的发展&#xff0c;如今数据存储能力上升到了 TB、PB 级别&#xff0c;企业和政府部门都以各种形式存储了大量的数据&#xff0c;如何快速有效地处理规模大、结构复杂的数据&#xff1f;本文主要介绍大数据的三类应用架构MapReduce、Hadoop、Spark&#xff0c;进行数据…

项目:德波量化(DealBot)

概述 德波量化&#xff08;DEALBOT&#xff09;项目研发始于2015年&#xff0c;初衷是建立一个可以自己编写交易策略&#xff0c;又可以自动化交易的小软件。为了这个目的&#xff0c;广泛搜寻了现有的开源量化交易软件&#xff0c;包括国外的Backtrader、zipline、Pysystemtr…

SSM整合01:

1.1原始方式整合 11.编写相应配置文件 Spring配置文件&#xff1a;applicationContext..xml SprngMVCi配置文件&#xff1a;spring-mvc.xml MyBatis映射文件&#xff1a;AccountMapper..xml .MyBatis核心文件&#xff1a;sqlMapConfig.xml 数据库连接信息文件&#xff1a;idbc.…

[C++数据结构](34)B树

文章目录B 树概念与性质B 树基本操作与实现框架查找插入遍历B 树性能分析及其优势B 树概念与性质 1970 年&#xff0c;R.Bayer 和 E.mccreight 提出了一种适用于外查找的树&#xff0c;它是一种平衡的多叉树&#xff0c;称为 B 树&#xff08;或 B-树、B_树&#xff09;。 一…

数字先锋 | 主机、硬盘、CPU统统没有? 这个电教室有点“潮”!

百年大计&#xff0c;教育为本。在数字中国建设整体布局和推进下&#xff0c;教育新基建为教育高质量发展构筑了数字底座&#xff0c;更为教育创新变革提供了强大的技术基础和应用环境。近年来&#xff0c;教育部门紧抓新一代信息技术发展机遇&#xff0c;赋能学校高质量发展&a…

使用YOLOV5训练口罩检测模型

一、YOLOV5源码和口罩数据集的下载与导入 我是在github上下载的&#xff0c;地址是GitHub - ultralytics/yolov5 at v7.0&#xff0c;下载之后&#xff0c;我将其导入pycharm环境中&#xff0c; 数据集在roboflow上面下载的&#xff0c;地址是Computer Vision Datasets&#…

Linux基础-压缩与打包

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【参考文章】 参考文章&#xff1a;https://howard2005.blog.csdn.net/article/details/127129580 文章目录一、压缩与打包1.1 压缩1.2 打包1.3 压缩或打包文件常见拓展名二、gzip命令2.1 命令作用2.2 选项参数2.3 实…

python中pandas进行数据分析与可视化(1)

1.创建数据源 matplotlib库是用于数据可视化&#xff0c;pandas则是用于数据分析&#xff0c;在导入这两个包之后&#xff0c;我们可以手工创建两个数据&#xff0c;其表示的是在某一年里&#xff0c;不同名称的新生儿数量&#xff0c;比如被叫做Bob的新生儿有968位 import m…

基于模型预测算法的混合储能微电网双层能量管理系统研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

动态规划之01背包问题

背包练习网址https://www.luogu.com.cn/contest/92872 想要做题的话可以到这里面来进行完成&#xff08;邀请码&#xff1a;r36l&#xff09;。注&#xff1a;要输入邀请码才可以进入。 满篇都是干货&#xff0c;有详细的注释和代码&#xff0c;请放心观看。 这就是传说中的 0…

[附源码]Python计算机毕业设计二手交易平台管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

数据生态第四弹 | OpenMLDB Hive Connector,架构起数据仓库到特征工程的生态桥梁

导读 近日&#xff0c;OpenMLDB 实现了与开源数据仓库软件 Hive 的连接&#xff0c;继完成与 Kafka、Pulsar、RocketMQ 等实时数据源生态整合后&#xff0c;持续构建离线数据生态&#xff0c;期待建设一个更加全面一体的上下游生态圈&#xff0c;在吸引更多用户的同时也能降低…

【能效管理】AcrelEMS-UT综合管廊能效管理平台解决方案应用分析

平台概述 AcrelEMS-UT综合管廊能效管理平台集电力监控、能源管理、电气安全、照明控制、环境监测于一体&#xff0c;为建立可靠、安全、高效的综合管廊管理体系提供数据支持&#xff0c;从数据采集、通信网络、系统架构、联动控制和综合数据服务等方面的设计&#xff0c;解决了…

DC-4靶场教程

探测目标靶机&#xff0c;获取到ip arp-scan -l扫描开放的端口 masscan -p1-65535 192.168.250.213 --rate10000使用nmap获取端口、服务版本、系统等详细信息 nmap -sC -sV -p- -A -T4 192.168.250.213查看使用的中间件 whatweb http://192.168.250.213/访问80端口 没有其…

NLP 模型“解语如神”的诀窍:在文本分类模型中注入外部词典

一. 引言 现实世界的文本表述如恒河沙数&#xff0c;以惊人的速度变换着&#xff0c;人工智能&#xff08;AI&#xff09;在快速识别形形色色的文本之前&#xff0c;必须经过充足的训练数据洗礼。然而&#xff0c;面对复杂多变的文本表述&#xff0c;NLP 模型往往无法从有限的…

架构设计(一):从单服务器模式到负载均衡设计

架构设计&#xff08;一&#xff09;&#xff1a;从单服务器模式到负载均衡设计 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;架构设计&#xff08;一&#xff09;&#xff1a;从单服务器模式到负载均衡设计 CSDN&#xff1a;架构设计&#xff08;一&…