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

二、类与对象(三)

17 初始化列表

17.1 初始化列表的引入

之前我们给成员进行初始化时,采用的是下面的这种方式:

class Date
{
public:Date(int year, int month, int day)//构造函数{_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};

虽然上述构造函数调用之后,对象中已经有了一个初始值,但是实际上并不能将其称为对对象中成员变量进行初始化,因为构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。

例:

#include <iostream>
using namespace std;
class A
{
public:int _a1;int _a2;//const int _x;//const int _x = 1;
};
int main()
{A aa;return 0;
}

const int _x;前运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

const int _x;后运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

const int _x = 1;后运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为什么加了const int _x;这条语句后运行起来编译器就报错了呢?这是因为const变量必须在定义的位置初始化,而A aa;是整体定义的地方,并不能在那里对_x进行初始化,虽然我们可以将语句修改为const int _x = 1;,但是这样做的实质并不是初始化,而是给了_x一个缺省值,而且这个特性只有在C++11之后才有,那么在C++11之前该怎么办呢?所以说,必须给每个成员变量找一个定义的位置,不然像const这样的成员将不好处理。

所以为了解决这样的问题,C++引入了初始化列表这样的方式。

17.2 初始化列表的特性

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

例:

class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}
private:int _year;int _month;int _day;
};
  1. 哪个对象调用构造函数,初始化列表就是它所有成员变量定义的位置。不管成员变量是否在初始化列表中显示,编译器都会对每个成员变量进行定义。

例:

#include <iostream>
using namespace std;
class A
{
public:A():_x(1),_a2(1){_a1++;_a2--;}void Print(){cout << _a1 << " " << _a2 << " " << _x << endl;}int _a1 = 2;int _a2 = 2;const int _x;
};
int main()
{A aa;aa.Print();return 0;
}

输出结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

调试结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从调试结果可以看到,在上述例子中,当初始化列表对_a1进行初始化时,由于_a1未在初始化列表中显式设置,所以使用了缺省值对其进行初始化,而对_a2_x则直接用( )中的值进行初始化。等初始化完成后,初始化列表再去执行{ }中的操作。

  1. 类中包含以下成员,必须放在初始化列表位置进行初始化:
    1. 引用成员变量
    2. const成员变量
    3. 自定义类型成员变量(且该类没有默认构造函数时)

例:

#include <iostream>
using namespace std;
class A
{
public:A(int a)//不是A的默认构造函数:_a(1){}void Print(){cout << _a;}
private:int _a;
};
class B
{
public:B(int a = 1, int ref = 1): _aobj(1), _ref(ref), _n(10){}void Print(){_aobj.Print();cout << " " << _ref << " " << _n << endl;}
private:A _aobj;      // 没有默认构造函数int& _ref;	  // 引用const int _n; // const 
};int main()
{B bb;bb.Print();return 0;
}

初始化列表中无_aobj(1)时运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

初始化列表中无_ref(ref)时运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

初始化列表中无_n(10)时运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正常运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论:尽量使用初始化列表初始化,因为不管是否使用初始化列表,对于自定义类型的成员变量,一定会先使用初始化列表进行初始化。

  1. 每个成员变量在初始化列表中只能出现一次,因为只能初始化一次。
  2. 成员变量在类中声明的次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。

例:

#include <iostream>
using namespace std;
class A
{
public:A(int a):_a1(a), _a2(_a1){}void Print() {cout << _a1 << " " << _a2 << endl;}
private:int _a2;int _a1;
};
int main() 
{A aa(1);//构造函数aa.Print();//
}

输出结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从输出结果可以看到,由于_a2在类中声明的次序在_a1的前面,所以_a2会比_a1先初始化,而_a2在初始化列表中又是用_a1的值进行初始化,_a1在没有被初始化之前又是随机值,所以_a2初始化所得到的也是随机值。

18 explicit关键字

18.1 explicit关键字的引入

引入explicit关键字之前,我们先来看下面一段代码:

#include <iostream>
using namespace std;
class A
{
public:A(int a):_a1(a){}void Print() {cout << _a1 << " " << _a2 << endl;}
private:int _a2;int _a1;
};
int main() 
{A aa1(1);//构造函数A aa2 = 1;//编译能通过吗?aa1.Print();aa2.Print();return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从输出结果可以看到,A aa2 = 1;这条语句的左右两边明明不是同一个类型,编译却通过了,这是因为这里发生了隐式的类型转换。

也就是说,A aa2 = 1;这条语句会先生成一个1的具有常性的临时变量,将这个临时变量的类型转换为A后再用来给aa2初始化。

例:

#include <iostream>
using namespace std;
class A
{
public:A(int a):_a1(a){}void Print() const{cout << _a1 << " " << _a2 << endl;}
private:int _a2;int _a1;
};
int main() 
{A aa1(1);//构造函数const A& ref = 10;//类型转换//A& ref = 10;ref.Print();return 0;
}

const修饰A& ref的运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不用const修饰A& ref的运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从输出结果可以看到,由于类型转换时生成的临时变量具有常性,如果被赋值的对象不具有常性的话编译器就会报错。

实际上,构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。

如果不想让这种类型转换发生,就需要引入explicit关键字。

18.2 explicit关键字的特性

  1. 对于单参构造函数,使用explicit修饰后将禁止类型转换。
  2. 对于第一个参数无默认值其余均有默认值的构造函数,使用explicit修饰后也将禁止类型转换。

例:

#include <iostream>
using namespace std;
class Date
{
public:// 1. 单参构造函数,没有使用explicit修饰,具有类型转换作用Date(int year):_year(year){}// 2. 虽然有多个参数,但是创建对象时后两个参数有默认值,使用explicit修饰,禁止类型转换/*explicit Date(int year, int month = 1, int day = 1): _year(year), _month(month), _day(day){}*/Date& operator=(const Date& d){if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;}
private:int _year;int _month;int _day;
};
void Test()
{Date d1(2022);// 用一个整形变量给日期类型对象赋值// 实际编译器背后会用2023构造一个临时对象,而后用临时对象给d1对象进行赋值d1 = 2023;
}
int main()
{Test();return 0;
}

屏蔽单参构造函数后的运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

屏蔽多参构造函数后的运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

19 static成员

19.1 static成员的引入

引入static成员之前,我们先来看一道面试题。

题目:实现一个类,计算程序中创建出了多少个类对象。

在我们学C语言的时候,可以通过定义一个全局变量count来计数,但到了C++之后,如果还用这样的方式那么类的封装性就无法体现了,所以在C++中引入了static成员来解决这个问题。

C++规定,声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量,用static修饰的成员函数,称之为静态成员函数。

19.2 static成员的特性

  1. 静态成员变量一定要在类外进行定义和初始化,定义时不添加static关键字,在类中只起声明作用。
  2. 静态成员为所有类对象所共享,它不属于某个具体的对象,而是存放在静态区。
  3. 类静态成员的访问方式:
    1. 类名::静态成员
    2. 对象.静态成员
  4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5. 静态成员也是类的成员,受publicprotectedprivate访问限定符的限制。

掌握了static成员的特性,我们就可以用它来解答刚才的问题了。

#include <iostream>
using namespace std;
class A
{
public:A() { ++_scount; }A(const A& t) { ++_scount; }~A() { --_scount; }int GetACount() { return _scount; }
private:static int _scount;
};
int A::_scount = 0;
int main()
{A a1, a2;A a3(a1);A* ptr = nullptr;cout << a1.GetACount() << endl;cout << a2.GetACount() << endl;cout << ptr->GetACount() << endl;return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从输出结果可以看到,不仅用对象.静态成员的方式可以访问到静态成员,当对象的指针为空时也可以进行访问。

类名::静态成员这样的访问方式有什么应用场景呢?

我们可以考虑这样一个问题:当我们想知道一个函数内部创建了多少个对象时,该怎么做呢?

由于这个时候对象是在函数内部创建的,那么我们在函数外部再使用对象.静态成员的方式进行访问就明显不合适了,那该怎么办呢?

有人提出了下面这种方法:

#include <iostream>
using namespace std;
class A
{
public:A(int a = 0) { ++_scount; }A(const A& t) { ++_scount; }int GetACount() { return _scount; }
private:static int _scount;
};
int A::_scount = 0;
void Test()
{A a1 = 1, a2 = 1;A a3(a1);
}
int main()
{Test();A a4;cout << a4.GetACount()-1 << endl;return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从输出结果可以看到,这种方法通过在函数外再创建一个对象,然后用这个对象去访问静态成员之后再减1,就得到了函数内部所创建对象的个数。

这个方法虽然能够达到效果,但是总归是有点撇脚的,有没有什么更好的办法呢?

这个时候就可以考虑用类名::静态成员的方式来进行访问。

采用这种方式的话,我们就需要用staticGetACount函数修饰为静态成员函数,由于静态成员函数没有this指针,所以它就可以通过指定类域来进行调用。

#include <iostream>
using namespace std;
class A
{
public:A(int a = 0) { ++_scount; }A(const A& t) { ++_scount; }static int GetACount() { return _scount; }
private:static int _scount;
};
int A::_scount = 0;
void Test()
{A a1 = 1, a2 = 1;A a3(a1);
}
int main()
{Test();cout << A::GetACount() << endl;return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

19.3 练习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这道题本身其实不难,可是题目要求不能使用乘除法、forwhileifelseswitchcase等关键字及条件判断语句(A?B:C),就让问题比较棘手了。

那么在这里,其实我们就可以利用static的特性,通过在一个类里面声明静态成员变量_i_sum,一个用于自增,一个用于求和。而后在类里面定义一个求和函数Sum,让其实现每调用一次_sum就加_i,同时_i自增以实现等差求和。

#include <iostream>
using namespace std;
class Sum
{
public:Sum(){_sum += _i;++_i;}static int GetSum()//用于获取私有成员_sum{return _sum;}
private:static int _i;static int _sum;
};
int Sum::_i = 1;
int Sum::_sum = 0;class Solution
{
public:int Sum_Solution(int n){Sum a[n];return Sum::GetSum();}
};

需要注意的是,由于部分老版的编译器不支持变长数组,所以在编译器上运行时可能会报错,但是在oj上是可以正常通过的。

20 友元

20.1 友元的引入

之前我们想把一个日期类Date输入,是采用这样的方式:

#include <iostream>
using namespace std;
class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}void Print(){cout << _year << "年" << _month << "月" << _day << "日" << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2023, 10, 5);d1.Print();return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这样虽然能够实现输出的功能,但每次都要通过对象去调用Print函数才能实现,有没有什么办法能够像内置类型那样直接用cout输出呢?

有人想到如果能将流插入运算符<<重载,那样就好办了,我们不妨来试一下:

#include <iostream>
using namespace std;
class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}ostream& operator<<(ostream& _cout, const Date& d){_cout << d._year << "-" << d._month << "-" << d._day << endl;return _cout;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2023, 10, 5);cout << d1 << endl;return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编译器报错了,这是什么原因呢?

实际上,这是因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置,this指针默认是第一个参数也就是左操作数,但是实际使用中cout需要是第一个形参对象,如果要将operator<<重载为成员函数,当前就只能通过下面的方式:

#include <iostream>
using namespace std;
class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}ostream& operator<<(ostream& _cout){_cout << _year << "-" << _month << "-" << _day << endl;return _cout;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2023, 10, 5);d1 << cout << endl;// d1 << cout; -> d1.operator<<(&d1, cout);return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然这样确实比刚才调用Print函数要方便了,但这明显是不符合常规的调用逻辑的。

要让cout是第一个形参对象,还有个方法就是将operator<<重载成全局函数。

#include <iostream>
using namespace std;
class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}
//private:int _year;int _month;int _day;
};
ostream& operator<<(ostream& _cout, const Date& d)
{_cout << d._year << "-" << d._month << "-" << d._day << endl;return _cout;
}
int main()
{Date d1(2023, 10, 5);cout << d1 << endl;return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个时候好像就能满足我们的要求了,但是新的问题又出现了:类外要访问成员只能将成员变为公有,但这样一来封装性又无法得到保证了。

要解决这个问题,此时就需要友元来解决。

20.2 友元函数的特性

  1. 友元函数是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。
  2. 友元函数可访问类的私有和保护成员,但不是类的成员函数。
  3. 友元函数可以在类定义的任何地方声明,不受类访问限定符的限制。
  4. 一个函数可以是多个类的友元函数。
  5. 友元函数的调用与普通函数的调用原理相同。
  6. 当模板函数作为类模板的友元函数时,不能像普通函数那样在类里面友元声明函数名即可,要直接在类模板中定义友元函数

知道了以上友元函数的特性,我们不仅可以用cout来输出自定义类型,还可以用cin来输入自定义类型。

#include <iostream>
using namespace std;
class Date
{friend ostream& operator<<(ostream& _cout, const Date& d);friend istream& operator>>(istream& _cin, Date& d);
public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){}
private:int _year;int _month;int _day;
};
ostream& operator<<(ostream& _cout, const Date& d)
{_cout << d._year << "-" << d._month << "-" << d._day;return _cout;
}
istream& operator>>(istream& _cin, Date& d)
{_cin >> d._year;_cin >> d._month;_cin >> d._day;return _cin;
}
int main()
{Date d;cin >> d;cout << d << endl;return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

20.3 友元类的特性

友元类的所有成员函数都可以是另一个类的友元函数,且都可以访问另一个类中的非公有成员。

关于友元类,有以下几点特性:

  1. 友元关系是单向的,不具有交换性。比如上述的Date类,如果我们还想再加一个Time类,并在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有成员变量则不行。
  2. 友元关系不能传递。也就是说,如果CB的友元,BA的友元,则不能说明CA的友元。
  3. 友元关系不能继承。(该特性会在后续讲到继承的时候再详细介绍)

例:

#include <iostream>
using namespace std;
class Time
{friend class Date;   // 声明日期类为时间类的友元类,则在Date类中就可以直接访问Time类中的私有成员变量friend ostream& operator<<(ostream& _cout, const Date& d);friend istream& operator>>(istream& _cin, Date& d);
public:Time(int hour = 0, int minute = 0, int second = 0): _hour(hour), _minute(minute), _second(second){}private:int _hour;int _minute;int _second;
};
class Date
{friend ostream& operator<<(ostream& _cout, const Date& d);friend istream& operator>>(istream& _cin, Date& d);
public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){}void SetTimeOfDate(int hour, int minute, int second){// 直接访问时间类私有的成员变量_t._hour = hour;_t._minute = minute;_t._second = second;}private:int _year;int _month;int _day;Time _t;
};
ostream& operator<<(ostream& _cout, const Date& d)
{_cout << d._year << "年" << d._month << "月" << d._day << "日"<< d._t._hour << "时" << d._t._minute << "分" << d._t._second << "秒" << endl;return _cout;
}
istream& operator>>(istream& _cin, Date& d)
{_cin >> d._year;_cin >> d._month;_cin >> d._day;_cin >> d._t._hour;_cin >> d._t._minute;_cin >> d._t._second;return _cin;
}
int main()
{Date d1;cin >> d1;cout << d1;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

相关文章:

二、类与对象(三)

17 初始化列表 17.1 初始化列表的引入 之前我们给成员进行初始化时&#xff0c;采用的是下面的这种方式&#xff1a; class Date { public:Date(int year, int month, int day)//构造函数{_year year;_month month;_day day;} private:int _year;int _month;int _day; };…...

CentOS 7 Tomcat服务的安装

前提 安装java https://blog.csdn.net/qq_36940806/article/details/134945175?spm1001.2014.3001.5501 1. 下载 wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.84/bin/apache-tomcat-9.0.84.tar.gzps: 可选择自己需要的版本下载安装https://mir…...

文件夹共享功能的配置 以及Windows server2012防火墙的配置

目录 一. 配置文件夹共享功能 1.1 为什么需要配置文件夹共享功能 1.2 配置文件夹共享 1.3 访问共享文件夹 1.4 配置取消 用户名和密码认证 二. windows server 2012防火墙配置 思维导图 一. 配置文件夹共享功能 1.1 为什么需要配置文件夹共享功能 我们在工作和生活中经…...

前端使用高德api的AMap.Autocomplete无效,使用AMap.Autocomplete报错

今天需要一个坐标拾取器&#xff0c;需要一个输入框输入模糊地址能筛选的功能 查看官方文档&#xff0c;有一个api可以直接满足我们的需求 AMap.Autocomplete 上代码 AMapLoader.load({"key": "你的key", // 申请好的Web端开发者Key&#xff0c;首次调…...

反转链表、链表的中间结点、合并两个有序链表(leetcode 一题多解)

一、反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 思路一&#xff1a;翻转单链表指针方向 这里解释一下三个指针的作用&#xff1a; n1&#xff1…...

深度学习中的Dropout

1 Dropout概述 1.1 什么是Dropout 在2012年&#xff0c;Hinton在其论文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。当一个复杂的前馈神经网络被训练在小的数据集时&#xff0c;容易造成过拟合。为了防止过拟合&#xff…...

MySQL 中的 ibdata1 文件过大如何处理?

ibdata1 是什么文件&#xff1f; ibdata1 是InnoDB的共有表空间&#xff0c;默认情况下会把表空间存放在一个名叫 ibdata1的文件中&#xff0c;日积月累会使该文件越来越大。 ibdata1 文件过大的解决办法 使用独享表空间&#xff0c;将表空间分别单独存放。MySQL开启独享表空…...

Weblogic反序列化远程命令执行(CVE-2019-2725)

漏洞描述&#xff1a; CVE-2019-2725是一个Oracle weblogic反序列化远程命令执行漏洞&#xff0c;这个漏洞依旧是根据weblogic的xmldecoder反序列化漏洞&#xff0c;通过针对Oracle官网历年来的补丁构造payload来绕过。 复现过程&#xff1a; 1.访问ip&#xff1a;port 2.可…...

鸿蒙组件数据传递:ui传递、@prop、@link

鸿蒙组件数据传递方式有很多种&#xff0c;下面详细罗列一下&#xff1a; 注意&#xff1a; 文章内名词解释&#xff1a; 正向&#xff1a;父变子也变 逆向&#xff1a;子变父也变 **第一种&#xff1a;直接传递 - 特点&#xff1a;1、任何数据类型都可以传递 2、不能响应式…...

ubuntu 开机自报IP地址(用于无屏幕小车-远程连接)

目录 1.环境安装2.代码3.打包成可执行文件4.开启开机自启 1.环境安装 sudo apt-get install espeak #先安装这个库 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyttsx32.90 #再安装pyttsx3 pyinstaller pip install -i https://pypi.tuna.tsinghua.edu.cn/si…...

Angular——:host 和::deep

在Angular中&#xff0c;:host和::ng-deep是用于在组件样式中选择和修改宿主元素和子组件的特殊选择器。 :host是一个CSS伪类选择器&#xff0c;用于选择当前组件的宿主元素。它常用于在组件样式中应用样式到组件外部的宿主元素上。例如&#xff1a; :host {background-color:…...

键盘字符(#键)显示错误

当屏幕上显示的键与键盘上按下的键不同时&#xff0c;尤其是 # 键。大多数情况下&#xff0c;此错误是由于 raspbian 和 NOOBS 软件的默认英国键盘配置所致。 解决方案&#xff1a; 要解决此问题&#xff0c;您需要将配置更改为您自己的键盘或语言的配置。这可以通过转到树莓派…...

geemap学习笔记037:分析地理空间数据--坐标格网和渔网

前言 坐标格网&#xff08;Coordinate Grid&#xff09;简称“坐标网”&#xff0c;是按一定纵横坐标间距&#xff0c;在地图上划分的格网&#xff0c;坐标网是任何地图上不可缺少的要素之一。下面将详细介绍一下坐标格网和渔网。 1 导入库并显示地图 import ee import geem…...

Bluetooth Mesh 入门学习干货,参考Nordic资料(更新中)

蓝牙网状网络&#xff08;Bluetooth mesh&#xff09;概念 概述 蓝牙Mesh Profile | Bluetooth Technology Website规范&#xff08;Mesh v1.1 后改名Mesh ProtocolMesh Protocol | Bluetooth Technology WebsiteMesh Protocol&#xff09;是由蓝牙技术联盟(Bluetooth SIG)开…...

磁盘管理 :逻辑卷、磁盘配额

一 LVM可操作的对象&#xff1a;①完成的磁盘 ②完整的分区 PV 物理卷 VG 卷组 LV 逻辑卷 二 LVM逻辑卷管理的命令 三 建立LVM逻辑卷管理 虚拟设置-->一致下一步就行-->确认 echo "- - -" > /sys/class/scsi_host/host0/scan;echo "- -…...

GitHub教程-自定义个人页制作

GitHub是全球最大的代码托管平台&#xff0c;除了存放代码&#xff0c;它还允许用户个性化定制自己的主页&#xff0c;展示个人特色、技能和项目。本教程旨在向GitHub用户展示如何制作个性化主页&#xff0c;同时&#xff0c;介绍了GitHub Actions的应用&#xff0c;可以自动化…...

Frappe Charts:数据可视化的强大工具

一、产品简介&#xff1a; 一个简单、零依赖、响应式的 开源SVG 图表库。这个图表库无论是数据更新还是屏幕大小变化&#xff0c;都能快速响应并更新图表。数据生成和悬停查看都有舒服的交互动效&#xff0c;体验感很好。不仅支持配置颜色&#xff0c;外观定制也很方便。还支持…...

【Vulnhub 靶场】【Hms?: 1】【简单】【20210728】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/hms-1,728/ 靶场下载&#xff1a;https://download.vulnhub.com/hms/niveK.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年07月28日 文件大小&#xff1a;2.9 GB 靶场作者&#xff1a;niveK 靶场系…...

浅谈C4模型

C4模型&#xff08;C4 Model&#xff09;是一种用于描述软件系统架构的轻量级模型&#xff0c;其目标是通过简化、清晰和易于理解的方式来表达系统的不同层次的架构信息。C4代表了“上下文”&#xff08;Context&#xff09;、“容器”&#xff08;Container&#xff09;、“组…...

SeaTunnel流处理同步MySQL数据至ClickHouse

ClickHouse是一种OLAP类型的列式数据库管理系统&#xff0c;ClickHouse完美的实现了OLAP和列式数据库的优势&#xff0c;因此在大数据量的分析处理应用中ClickHouse表现很优秀。 SeaTunnel是一个分布式、高性能、易扩展、用于海量数据同步和转化的数据集成平台。用户只需要配置…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...