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

C++——类和对象(下)

目录

一、再探构造函数

1.基本定义以及用法

2.必须在初始化列表初始化的成员变量

3.成员变量声明位置的缺省值(C++11)

4.成员变量初始化顺序

二、隐式类型转换

三、static成员

四、友元

五、内部类

六、匿名对象

七、日期类实现


一、再探构造函数

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 + 1) //每个成员变量只能出现一次,括号里面可以放初始值或者表达式{}void Print() const{cout << _year << "-" << _month << "-" << _day << endl;}private:// 成员变量的声明int _year;int _month;int _day;
};
int main()
{// 类对象定义初始化Date d(2024, 7, 27);return 0;
}

2.必须在初始化列表初始化的成员变量

•   引用成员变量const成员变量没有默认构造的类类型变量,必须放在初始化列表位置进行初始 化,否则会编译报错。
#include<iostream>
using namespace std;class Time
{
public:// Time类没有默认构造Time(int hour):_hour(hour){cout << "Time()" << endl;}
private:int _hour;
};class Date
{
public:Date(int& x, int year = 1, int month = 1, int day = 1)// 初始化列表,成员变量定义初始化的位置:_year(year),_month(month),_day(day + 1) //每个成员变量只能出现一次,括号里面可以放初始值或者表达式,_t(1),_ref(x),_n(1)// 如果不初始化上面三个则会报错// error C2512: “Time”: 没有合适的默认构造函数可用// error C2530 : “Date::_ref” : 必须初始化引用// error C2789 : “Date::_n” : 必须初始化常量限定类型的对象{}void Print() const{cout << _year << "-" << _month << "-" << _day << endl;}private:// 成员变量的声明int _year;int _month;int _day;Time _t; // 没有默认构造的类类型对象int& _ref; // 引用成员变量const int _n; //const成员变量
};
int main()
{int a = 1;// 类对象定义初始化Date d(a,2024, 7, 27);return 0;
}

为什么会编译报错呢?

•  因为初始化列表是类对象内成员变量定义初始化的地方,就相当于主函数的int a = 1;,而引用和const变量只在定义时有一次(也必须)初始化的机会,后续将不能改变引用对象和const变量的值。

•  初始化列表在没有手动初始化类类型时,会自动调用类的默认构造来初始化,如果没有默认构造,当然就会报错

3.成员变量声明位置的缺省值(C++11)

•   C++11支持在成员变量声明的位置给缺省值,这个缺省值可以是值也可以是一个表达式,主要是给没有显示在初始化列表初始化的成员使用的。
#include<iostream>
using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1)// 成员变量定义初始化:_year(year), _month(month), _day(day){// ...}void Print() const{cout << _year << "-" << _month << "-" << _day << endl;}private:// 成员变量的声明// 这里没有初始化,只是单纯的给缺省值!!!!int _year = 0;int _month = 0;int _day = 0;
};
int main()
{// 类对象定义初始化Date d;d.Print();return 0;
}

•  这里就要注意,这里成员变量声明位置缺省值的优先级是小于构造函数参数缺省值的优先级的,可以理解为,构造函数没有将成员变量初始化好(所以是优先使用参数位置的缺省值),就会利用到声明位置的缺省值来初始化。

结合一下这几个运行结果来理解:
•   尽量使用初始化列表初始化,因为那些你不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会用这个缺省值初始化。如果你没有给缺省值,对于没有显示在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有显示在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造会编译错误。

4.成员变量初始化顺序

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

二、隐式类型转换

•   C++支持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数
•   构造函数前面加explicit就不再支持隐式类型转换
内容不是很多,这个主要是方便我们写代码,下面主要结合代码来进行理解:
#include<iostream>
using namespace std;class A
{
public:// explicit A(int a1 = 1) 不想让这样的隐式类型转换发生就在函数前面加上explicit这个关键字就行了A(int a1 = 1):_a1(a1){_a2 = _a1;}A(int a1, int a2):_a1(a1),_a2(a2){}void Print()const{cout << _a1 << " " << _a2 << endl;}private:int _a1;int _a2;
};class Stack
{
public:void Push(const A& aa){// ...}
private:A arr[10];// 使用A的默认构造int _top = 0; // 这样就不用写构造函数了哈哈
};int main()
{A aa1(0);// 正常定义初始化一个类对象aa1.Print();A aa2 = 2; // 这是啥???// 隐式类型转换!!// 这里编译器会用 2 去调用构造函数得到一个临时对象,再把临时对象拷贝构造给 aa2// 其实编译器还会优化,编译器遇到连续构造+拷贝构造->优化为直接构造// 有什么用呢?方便传参,就比如入栈aa2.Print();Stack s;// 正常情况下(不用隐式类型转换)入栈A aa3 = 3;s.Push(aa3);// 利用隐式类型转换入栈s.Push(3);// 3在括号里面调用构造函数生成一个临时对象,再把临时对象入栈,和上面那个入栈效果是相同的// 提醒一下,临时对象具有常性,为了不把权限放大,Push函数里面A类型的参数一定要加const// 本来C++是只支持单参数构造函数才能像上面那么写,多参数是默认不支持的// 不过.........C++11支持了!// 这里是使用的演示,要用到花括号{},大家注意用法就行A aa4 = { 4,4 };s.Push(aa4);// 简化就是s.Push({ 4,4 });return 0;
}

大家用的时候注意写法就行了。

三、static成员

•  用static修饰的成员变量,称之为静态成员变量,静态成员变量⼀定要在类外进行初始化
•   静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区
•  用static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针
•   静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有this指针。
•  非静态的成员函数,可以访问任意的静态成员变量和静态成员函数
(其实就是说,静态的只可以访问静态的,非静态的都可以访问
•   突破类域就可以访问静态成员,可以通过类名::静态成员 或者 对象.静态成员 来访问静态成员变量和静态成员函数。(前提是让这些成员公有)
•   静态成员也是类的成员受public、protected、private 访问限定符的限制
•   静态成员变量不能在声明位置给缺省值,因为缺省值是构造函数初始化列表的,静态成员变量不属于某个对象,不走构造函数初始化列表。
#include<iostream>
using namespace std;class A
{
public:// 在构造函数和析构函数里面调整_scount的值来记录类实例化出对象的个数A(){++_scount;}A(const A& aa){++_scount;}~A(){--_scount;}static int GetScount()// 用static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针{// _a = 2;    // 静态成员函数没有this指针,不能访问非静态的成员变量return _scount;}int GetScount2()// 非静态的成员函数{int ret = GetScount();// 可以访问静态成员函数return _scount;       // 可以访问静态成员变量}private:// 类里面声明,注意这里仅仅只是声明,这里不能给缺省值,静态成员变量不属于某一个对象,不走初始化列表static int _scount;// 用static修饰的成员变量,称之为静态成员变量int a = 1;
};// 类外面初始化
int A::_scount = 0;int main()
{A aa1,aa2;A aa3(aa2);// 这里定义三个对象,_scount会变成3// 静态成员变量为所有类对象所共享,可以通过类类型或者具体对象来调用cout << A::GetScount() << " " << aa1.GetScount() << " " << aa2.GetScount() << " " << aa3.GetScount() << endl;// 这里要注意非静态成员函数不能用A::GetScount2()来玩cout << aa1.GetScount2() << " " << aa2.GetScount2() << " " << aa3.GetScount2() << endl;// int x = A::_scount;  // error,静态成员也是类的成员,受public、protected、private 访问限定符的限制。return 0;
}

再总结一下:

1. static修饰成员变量,类内声明,类外初始化,不给缺省值,不属于某一个对象,为所有类对象所共享,也可以用类名访问。

2. 静态成员变量也是成员变量,仍然受访问限定符限制。

3. 静态成员函数由于没有this指针而不能访问非静态成员

那现在,来道题??

题目在牛客网:求1+2+3+...+n_牛客题霸_牛客网

大家可以尝试一下自己利用刚刚学过的static成员自己尝试一下,下面是我的过程,供大家参考

// 从1到n,要加n次,怎么计数?
// 可以建一个类,构造一个关于这个类容量为n的数组,会调用n次构造函数
// 用i记录下来构造函数调用的次数便能够计数
// 我们的任务就成了在构造函数里面实现求合class Sum
{
public:Sum(){_sum+=_i; //第一次构造sum+1,第二次+2........_i++;}static int GetSum(){return _sum;}
private:static int _i;static int _sum;
};int Sum::_i = 1;  // 这样_i就能从1开始,随构造到加到n
int Sum::_sum = 0;// sum来每次加上_i的值来求和class Solution {
public:int Sum_Solution(int n) {Sum arr[n];//利用数组调用n次构造函数return Sum::GetSum();}
};

四、友元

(这里把友元关系当朋友关系,就会很好理解)

友元提供了⼀种突破类访问限定符封装的方式,友元分为:友元函数和友元类在函数声明或者类声明的前面加friend,并且把友元声明放到⼀个类的里面
外部友元函数可访问类的私有和保护成员,友元函数仅仅是⼀种声明,他不是类的成员函数。
友元函数可以在类定义的任何地方声明,不受类访问限定符限制。
⼀个函数可以是多个类的友元函数

 下面这个代码只有友元函数,友元类会放到后面几条的文字下面

#include<iostream>
using namespace std;// 这里是前置声明,因为A类里面的友元声明里面用到了B,如果不声明编译器会不认识
class B;
class A
{// 友元声明friend void func(const A& aa, const B& bb);// 友元函数声明仅仅是一种声明,它不是类的成员函数// 友元函数可以在类定义的任何地方声明,不受类访问限定符限制,在哪里都可以,这里是为了美观,一般都在最上面
private:int _a1 = 1;int _a2 = 2;
};class B
{// 友元声明friend void func(const A& aa, const B& bb);
private:int _b1 = 3;int _b2 = 4;
};// func在A类和B类中都进行了友元声明(一个函数可以是多个类的友元函数)
// 就可以理解为func是AB两个类的好朋友,就可以访问它们的私有
void func(const A& aa, const B& bb)
{cout << aa._a1 << endl;cout << bb._b1 << endl;
}
int main()
{A aa;B bb;func(aa, bb);return 0;
}
友元类中的成员函数都可以是另⼀个类的友元函数,都可以访问另⼀个类中的私有和保护成员。
友元类的关系是单向的,不具有交换性,比如A类是B类的友元,但是B类不是A类的友元。
友元类关系不能传递,如果A是B的友元, B是C的友元,但是A不是C的友元。
#include<iostream>
using namespace std;
class A
{// 友元声明friend class B;//void func1(const B& bb)//{//	cout << _a1 << endl;//	cout << bb._b1 << endl;// 友元关系是单向的,不具有交换性,B是A的友元类,A不能访问B////}
private:int _a1 = 1;int _a2 = 2;
};class B
{
public:// B是A类的友元类,就可以在B类里面访问A的私有void func1(const A& aa){cout << aa._a1 << endl;cout << _b1 << endl;}// 友元类中的成员函数都可以是另一个类的友元函数,都可以访问另一个类中的私有和保护成员。void func2(const A& aa){cout << aa._a2 << endl;cout << _b2 << endl;}
private:int _b1 = 3;int _b2 = 4;
};int main()
{A aa;B bb;bb.func1(aa);bb.func2(aa);return 0;
}
友元有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用

五、内部类

如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。内部类是⼀个独立的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类

 内部类默认是外部类的友元类

#include<iostream>
using namespace std;class A
{
public:class B // B默认就是A的友元{public:void foo(const A& a){cout << _k << endl;cout << a._h << endl; // 这里为什么可以直接使用_k而不能直接使用_h,博主偶然发现这个问题时也很疑惑// 当外部类的成员变量不是类型名称、静态或枚举数时 内部类无法直接使用该成员变量// 这是我找到的资料,以我们的水平暂时应该不用管,其实用a._k程序也可以跑}private:int num = 1;};private:static int _k;int _h = 1;
};int A::_k = 1;int main()
{cout << sizeof(A) << endl;// 这里结果表明外部类定义的对象中不包含内部类,内部类是一个独立的类,只是受到外部类访问限定符限制和类域限制A::B b;  // 定义B类对象需要通过AA aa;b.foo(aa);// B对A的成员成功访问,B是A的友元类	return 0;
}

内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使用,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其其它地方都用不了。

还是我们上面static成员做过的那道题,就可以通过内部类来稍微改一下:

// 把_i和_sum作为了Solution的静态成员变量,Sum类作为了Solution的专属内部类
class Solution {
public:int Sum_Solution(int n) {Sum arr[n];return Sum::GetSum();}class Sum{public:Sum(){_sum+=_i; _i++;}static int GetSum(){return _sum;}};
private:static int _i;static int _sum;
};int Solution::_i = 1;
int Solution::_sum = 0;

六、匿名对象

类型(实参) 定义出来的对象叫做匿名对象,相比之前我们定义的 类型 对象名(实参) 定义出来的叫有名对象。
匿名对象生命周期只在当前一行,⼀般临时定义⼀个对象当前用⼀下即可,就可以定义匿名对象。

 匿名对象用起来很爽,可以让我们代码变简单,看一下下面的代码就明白了:

#include<iostream>
using namespace std;class A
{
public:A(int a = 0):_a(a){cout << "A(int a)" << endl;}~A(){cout << "~A()" << endl; // 方便观察匿名对象的生命周期}
private:int _a;
};
class Solution {
public:int Sum_Solution(int n){//...return n;}
};
int main()
{A aa1;//A aa1();// 不能这么定义对象,因为编译器无法识别下面是一个函数声明,还是对象定义A();  // 但是我们可以这么定义匿名对象,匿名对象的特点不用取名字,A(1); // 但是它的生命周期只有这一行,我们可以看到下一行他就会自动调用析构函数// 麻烦Solution st;cout << st.Sum_Solution(10) << endl;// 用匿名对象更方便cout << Solution().Sum_Solution(10) << endl;return 0;
}

解释一下运行结果:

七、日期类实现

我直接把实现代码放出来,用到的知识都是前面博主写过的,会有必要的注释,大家可以看一下

Date.h

// Date.h#pragma once#include<iostream>
#include<assert.h>
using namespace std;class Date
{friend ostream& operator<<(ostream& out, const Date& d);friend istream& operator>>(istream& in, Date& d);
public:// 检查日期是否合法bool CheckDate() const;// 构造函数Date(int year = 1900, int month = 1, int day = 1);// 打印日期void Print() const;// 在类内实现的成员函数默认为内联// 为什么在类内实现,因为这个函数频繁多次调用,且较为短小,作为内联是很好的选择// 得到当月天数int GetMonthDay(int year, int month) const{// 通过下标能得到平年月份相对的天数// 用static修饰是为了不让这个数组频繁建立和销毁,因为要一直用static int MonthDay[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };// 这里有个小细节,month == 2放在前面优先判断,如果不是2月判断语句就会直接结束,就不用再判断年份,会提升一点效率if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){return 29;}return MonthDay[month];}// 日期的先后比较bool operator<(const Date& d) const;bool operator<=(const Date& d) const;bool operator>(const Date& d) const;bool operator>=(const Date& d) const;bool operator==(const Date& d) const;bool operator!=(const Date& d) const;// 日期的前几天后几天的基本运算Date operator+(int day) const;Date& operator+=(int day);Date operator-(int day) const;Date& operator-=(int day);// d1++;Date operator++(int);// ++d1;Date& operator++();// d1--;Date operator--(int);// --d1;Date& operator--();// d1 - d2int operator-(const Date& d) const;private:int _year;int _month;int _day;
};ostream& operator<<(ostream& out, const Date& d);
istream& operator>>(istream& in, Date& d);

 Date.cpp

// Date.cpp#include "Date.h"// 检查日期是否合法
bool Date::CheckDate() const
{if (_month < 1 || _month > 12 || _day > GetMonthDay(_year, _month)){return false;}return true;
}// 构造函数   缺省值再头文件写了之后这里就不要再写了,会重定义
Date::Date(int year, int month, int day):_year(year), _month(month), _day(day)
{assert((*this).CheckDate());//保证日期的合法性
}// 打印日期
void Date::Print() const
{cout << *this << endl;// 这里的流运算符是重载过的,详细看这个文件的最下面
}// 日期的先后比较->可以优先实现等于和小于然后复用!!
bool Date::operator<(const Date& d) const
{if (_year < d._year){return true;}else if (_year == d._year){if (_month < d._month){return true;}else if (_month == d._month){return _day < d._day;}}return false;
}bool Date::operator==(const Date& d) const
{return _year == d._year && _month == d._month && _day == d._day;
}// 下面的都可以复用以上两个函数及互相之间复用
bool Date::operator<=(const Date& d) const
{return *this == d || *this < d;
}
bool Date::operator>(const Date& d) const
{return !(*this <= d);
}bool Date::operator>=(const Date& d) const
{return *this == d || *this > d;
}bool Date::operator!=(const Date& d) const
{return !(*this == d);
}// 日期的前几天后几天的基本运算
Date Date::operator+(int day) const
{Date tmp = *this;tmp += day;// 为什么是+复用+=而不是+=复用+,因为+=可以返回引用,有利于减少拷贝,而+=复用+则会增加拷贝,下面的-和-=同理return tmp;
}Date& Date::operator+=(int day)
{// 考虑输入小于0的情况if (day < 0){return *this -= (-day);}_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);++_month;if (_month == 13){++_year;_month = 1;}}return *this;
}Date Date::operator-(int day) const
{Date tmp = *this;tmp -= day;return tmp;
}Date& Date::operator-=(int day)
{if (day < 0){return *this += (-day);}_day -= day;while (_day < 1){--_month;if (_month == 0){--_year;_month = 12;}_day += GetMonthDay(_year, _month);// 这行代码放到下面就不用检查_month了}return *this;
}// d1++;
Date Date::operator++(int)
{Date tmp = *this;*this += 1;return tmp;
}// ++d1;
Date& Date::operator++()
{*this += 1;return *this;
}// d1--;
Date Date::operator--(int)
{Date tmp = *this;*this -= 1;return tmp;
}// --d1;
Date& Date::operator--()
{*this -= 1;return *this;
}// d1 - d2
int Date::operator-(const Date& d) const
{// CPU的运行是很快的,一般每秒几十亿次,所以如果不是特殊需求,我们可以通过计数来算日期差值int flag = 1;Date max = *this;Date min = d;if (*this < d){flag = -1;max = d;min = *this;}int count = 0;while (max != min){++min;++count;}return count * flag;
}ostream& operator<<(ostream& out, const Date& d)
{out << d._year << "年" << d._month << "月" << d._day << "日" << endl;return out;
}
istream& operator>>(istream& in, Date& d)
{while (1){cout << "请依次输入年月日:>_"; //这里不写endl是为了不换行,直接在当行输入in >> d._year >> d._month >> d._day;if (!d.CheckDate()){cout << "输入日期不合法,请重新输入!" << endl;}else{break;}}return in;
}	

Test.cpp 

// Test.cpp#include "Date.h"void DateTest1()
{Date d1(2024, 7, 27);Date d2 = d1 + 100;d1.Print();d2.Print();d1 += 1000;d2 = d1 + 1000;d1.Print();d2.Print();}void DateTest2()
{Date d1(2024, 7, 27);d1 -= 3000;d1.Print();Date ret1 = d1++;ret1.Print();d1.Print();Date d2(2024, 7, 27);Date ret2 = ++d2;ret2.Print();d2.Print();
}void DateTest3()
{Date d1(2024, 7, 27);d1 += -100;d1.Print();d1 -= -100;d1.Print();
}void DateTest4()
{Date d1(2039, 12, 1);Date d2(2024, 7, 27);cout << d1 - d2 << endl;cout << d2 - d1 << endl;}void DateTest5()
{Date d1, d2;cin >> d1 >> d2;cout << d1 << d2;cout << d1 - d2 << endl;}int main()
{//DateTest1();//DateTest2();//DateTest3();//DateTest4();//DateTest5();return 0;
}

终于写完了......

类和对象,完结撒花!!!

ヾ(~□~;)ノ

相关文章:

C++——类和对象(下)

目录 一、再探构造函数 1.基本定义以及用法 2.必须在初始化列表初始化的成员变量 3.成员变量声明位置的缺省值&#xff08;C11&#xff09; 4.成员变量初始化顺序 二、隐式类型转换 三、static成员 四、友元 五、内部类 六、匿名对象 七、日期类实现 一、再探构造函数…...

Android中集成前端页面探索(Capacitor 或 Cordova 插件)待完善......

探索目标&#xff1a;Android中集成前端页面 之前使用的webview加载html页面&#xff0c;使用bridge的方式进行原生安卓和html页面的通信的方式&#xff0c;探索capacitor-android插件是如何操作的 capacitor-android用途 Capacitor 是一个用于构建现代跨平台应用程序的开源框…...

玩转CSS:用ul li +JS 模拟select,避坑浏览器不兼容。

玩转CSS&#xff1a;用ul li JS 模拟select&#xff0c;避坑浏览器不兼容。 在前端的工作中&#xff0c;经常会遇到 selcet控件&#xff0c;但我们用css来写它的样式时候&#xff0c;总是不那么令人满意&#xff0c;各种浏览器不兼容啊有没有&#xff1f; 那么&#xff0c;我…...

介绍下PolarDB

业务中用的是阿里云自研的PolarDB&#xff0c;分析下PolarDB的架构。 认识PolarDB 介绍 PolarDB是阿里云自研的&#xff0c;兼容MySQL、PostageSQL以及支持MPP的PolarDB-X的高可用、高扩展性的数据库。 架构 部署 云起实验室 - 阿里云开发者社区 - 阿里云 (aliyun.com) 数…...

基于微信小程序+SpringBoot+Vue的儿童预防接种预约系统(带1w+文档)

基于微信小程序SpringBootVue的儿童预防接种预约系统(带1w文档) 基于微信小程序SpringBootVue的儿童预防接种预约系统(带1w文档) 开发合适的儿童预防接种预约微信小程序&#xff0c;可以方便管理人员对儿童预防接种预约微信小程序的管理&#xff0c;提高信息管理工作效率及查询…...

go语言day15 goroutine

Golang-100-Days/Day16-20(Go语言基础进阶)/day17_Go语言并发Goroutine.md at master rubyhan1314/Golang-100-Days GitHub 第2讲-调度器的由来和分析_哔哩哔哩_bilibili 一个进程最多可以创建多少个线程&#xff1f;-CSDN博客 引入协程 go语言中内置了协程goroutine&#…...

Mindspore框架循环神经网络RNN模型实现情感分类|(六)模型加载和推理(情感分类模型资源下载)

Mindspore框架循环神经网络RNN模型实现情感分类 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;一&#xff09;IMDB影评数据集准备 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;二&#xff09;预训练词向量 Mindspore框架循环神经网络RNN模型实现…...

System类

System类常见方法 ① exit 退出当前程序 public static void main(String[] args) {System.out.println("ok1");//0表示状态&#xff0c;即正常退出System.exit(0);System.out.println("ok2");} ② arraycopy 复制数组元素 复制的数组元素个数必须<原数…...

【前端 02】新浪新闻项目-初步使用CSS来排版

在今天的博文中&#xff0c;我们将围绕“新浪新闻”项目&#xff0c;深入探讨HTML和CSS在网页制作中的基础应用。通过具体实例&#xff0c;我们将学习如何设置图片、标题、超链接以及文本排版&#xff0c;同时了解CSS的引入方式和选择器优先级&#xff0c;以及视频和音频标签的…...

HarmonyOS和OpenHarmony区别联系

前言 相信我们在刚开始接触鸿蒙开发的时候经常看到HarmonyOS和OpenHarmony频繁的出现在文章和文档之中&#xff0c;那么这两个名词分别是什么意思&#xff0c;他们之间又有什么联系呢&#xff1f;本文将通过现有的文章和网站内容并与Google的AOSP和Android做对比&#xff0c;带…...

llama模型,nano

目录 llama模型 Llama模型性能评测 nano模型是什么 Gemini Nano模型 参数量 MMLU、GPQA、HumanEval 1. MMLU(Massive Multi-task Language Understanding) 2. GPQA(Grade School Physics Question Answering) 3. HumanEval llama模型 Large Language Model AI Ll…...

ElasticSearch的应用场景和优势

ElasticSearch是一个开源的分布式搜索和分析引擎&#xff0c;它以其高性能、可扩展性和实时性在多个领域得到了广泛应用。以下是ElasticSearch的主要应用场景和优势&#xff1a; 应用场景 实时搜索&#xff1a; ElasticSearch以其快速、可扩展和实时的特性&#xff0c;成为实…...

git 、shell脚本

git 文件版本控制 安装git yum -y install git 创建仓库 将文件提交到暂存 git add . #将暂存区域的文件提交仓库 git commit -m "说明" #推送到远程仓库 git push #获取远程仓库的更新 git pull #克隆远程仓库 git clone #分支&#xff0c;提高代码的灵活性 #检查分…...

阿里云服务器 篇六:GitHub镜像网站

文章目录 系列文章搭建镜像网站的2种方式使用 Web 抓取工具 (Spider 技术)使用 Web 代理服务器使用 nginx 搭建GitHub镜像网站基础环境搭建添加对 github.com 的转发配置添加对 raw.githubusercontent.com 的转发配置配置更改注意事项(可选)缓存优化为新增设的二级域名配置DN…...

强化学习学习(三)收敛性证明与DDPG

文章目录 证明收敛&#xff1f; Deep RL with Q-FunctionsDouble Q-Learning理论上的解法实际上的解法 DDPG: Q-Learning with continuous actionsAdvanced tips for Q-Learning 证明收敛&#xff1f; 对于Value迭代&#xff1a;不动点证明的思路 首先定义一个算子 B : B V ma…...

培养前端工程化思维,不要让一行代码毁了整个程序

看《阿丽亚娜 5 号&#xff08;Ariane 5&#xff09;火箭爆炸》有感。 1、动手写项目之前&#xff0c;先进行全局性代码逻辑思考&#xff0c;将该做的事情&#xff0c;一些细节&#xff0c;统一建立标准&#xff0c;避免为以后埋雷。 2、避免使用不必要或无意义的代码、注释。…...

电子文件怎么盖章?

电子文件怎么盖章&#xff1f;电子文件盖章是数字化办公中常见的操作&#xff0c;包括盖电子公章和电子骑缝章。以下是针对这两种情况的详细步骤&#xff1a; 一、盖电子公章 方法一&#xff1a;使用专业软件 选择软件&#xff1a;选择一款专业的电子签名或PDF编辑软件&…...

IDEA在编译的时候报Error: java: 找不到符号符号: 变量 log lombok失效问题

错误描述 idea因为lombok的报错: java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled.Your processor is: com.sun.proxy.$Proxy8Lombok supports: sun/apple javac 1.6, ECJ 原因&#xff1a;这是由于Lombok的版本过低的…...

【Python】如何修改元组的值?

一、题目 We have seen that lists are mutable (they can be changed), and tuples are immutable (they cannot be changed). Lets try to understand this with an example. You are given an immutable string, and you want to make chaneges to it. Example >>…...

【安卓】Android Studio简易计算器(实现加减乘除,整数小数运算,正数负数运算)

目录 前言 运算效果 一、创建一个新的项目 二、编写xml文件&#xff08;计算器显示页面&#xff09; 三、实现Java运算逻辑 ​编辑 完整代码 xml文件代码&#xff1a; Java文件代码&#xff1a; 注&#xff1a; 前言 随着移动互联网的普及&#xff0c;手机应用程序已…...

一个vue mixin 小案例,实现等比例缩放

mixin.js /** Author: jinjianwei* Date: 2024-07-24 16:17:16* Description: 等比例缩放&#xff0c;屏幕适配 mixin 函数*/// * 默认缩放值 const scale {width: 1,height: 1, } // * 设计稿尺寸&#xff08;px&#xff09; const baseWidth 1920 const baseHeight 1080 …...

【数据结构初阶】单链表经典算法题十二道——得道飞升(中篇)

hi&#xff0c;bro—— 目录 5、 链表分割 6、 链表的回文结构 7、 相交链表 8、 环形链表 【思考】 —————————————— DEAD POOL —————————————— 5、 链表分割 /* struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), …...

CTF ssrf 基础入门 (一)

0x01 引言 我发现我其实并不是很明白这个东西&#xff0c;有些微妙&#xff0c;而且记忆中也就记得Gopherus这个工具了&#xff0c;所以重新学习了一下&#xff0c;顺便记录一下吧 0x02 辨别 我们拿到一个题目&#xff0c;他的名字可能就是题目类型&#xff0c;但是也有可能…...

IP地址在后端怎么存才好?

目录 一、地址的区别 二、字符串存取 2.1 IPV4空间大小 2.2 IPV6空间大小 三、整数存取 四、总结 4.1 字符串存取优缺点 4.2 整数存取的优缺点 一、地址的区别 在网络中&#xff0c;IP地址分为IPV4和IPV6&#xff0c;IPV4是一共占32位的&#xff0c;每8位小数点分隔&…...

《通讯世界》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《通讯世界》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《通讯世界》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;科学技术部 主办单位&#xff1a;中国科学技…...

go get的原理

1、GOPROXY 可以写在os的环境变量中&#xff0c;也可以写在go的环境变量中 GOPROXYhttps://goproxy.cn,direct 表示先去第一个网址下载&#xff0c;下载不到&#xff0c;就直接下载 也可以配置GOPRIVATE私有仓库&#xff0c;遇到私有仓库中的包&#xff0c;就直接下载 2、go…...

jenkins替换配置文件

1.点击首页的【Manage Jenkins】-【Manage Plugins】&#xff0c;在选项【Available plugins】安装 Config File Provider Plugin &#xff0c;安装后重启jenkins 2.安装完成后会有这个图标&#xff0c;点进去 3.点击新建&#xff0c;选择自定义&#xff0c;填入要替换的文件…...

C# Web控件与数据感应之 填充 HtmlTable

C# Web控件与数据感应之 填充 HtmlTable 在C#中&#xff0c;特别是在ASP.NET Web Forms应用中&#xff0c;你可能会遇到需要将数据动态填充到HTML表格&#xff08;HtmlTable&#xff09;中的场景。这通常涉及到遍历数据源&#xff08;如数据库查询结果、集合等&#xff09;&am…...

HAL库源码移植与使用之SPI驱动VS1053音频解码

你可以理解为带着dac adc芯片功能的集成芯片&#xff0c;声音的高低音形成由频率决定&#xff0c;大小声由波峰决定&#xff0c;所以采集时记录时间和电压值就可以确定高低音色和大小声&#xff0c;形成声音波形&#xff0c;再把波形用dac输出给喇叭&#xff0c;让喇叭在对应时…...

RK3568 Linux 平台开发系列讲解(内核入门篇):从内核的角度看外设芯片的驱动

在嵌入式 Linux 开发中,外设芯片的驱动是实现操作系统与硬件之间交互的关键环节。对于 RK3568 这样的处理器平台,理解如何从内核的角度构建和管理外设芯片的驱动程序至关重要。 1. 外设驱动的基础概念 外设驱动(Device Driver)是操作系统与硬件设备之间的桥梁。它负责控…...

初识C++ · AVL树(2)

目录 前言&#xff1a; 1 左右旋 2 右左旋 3 部分细节补充 3.1 单旋和插入 3.2 部分小函数 前言&#xff1a; AVL树作为一种结构&#xff0c;理解树的本身是不大难的&#xff0c;难的在于&#xff0c;树旋转之后的连接问题&#xff0c;写AVL树的代码大部分都是在旋转部分…...

LLM:归一化 总结

一、Batch Normalization 原理 Batch Normalization 是一种用于加速神经网络训练并提高稳定性的技术。它通过在每一层网络的激活值上进行归一化处理&#xff0c;使得每一层的输入分布更加稳定&#xff0c;从而加速训练过程&#xff0c;并且减轻了对参数初始化的依赖。 公式 …...

蓝桥杯 2024 年第十五届省赛真题 —— 最大异或结点

目录 1. 最大异或结点1. 问题描述2. 输入格式3. 输出格式4. 样例输入5. 样例输出6. 样例说明7. 评测用例规模与约定 2. 解题思路1. 解题思路2. AC_Code 1. 最大异或结点 1. 问题描述 小蓝有一棵树,树中包含 N N N 个结点&#xff0c;编号为 0 , 1 , 2 , ⋯ , N − 1 0,1,2,…...

AV1技术学习:Loop Restoration Filter

环路恢复滤波器&#xff08;restoration filter&#xff09;适用于64 64、128 128 或 256 256 像素块单元&#xff0c;称为 loop restoration units (LRUs)。每个单元可以独立选择是否跳过滤波、使用维纳滤波器&#xff08;Wiener filter&#xff09;或使用自导滤波器&#…...

如何使用python实现自动化办公?干货满满!

Python作为一种简单而强大的编程语言&#xff0c;不仅在数据科学和软件开发领域广受欢迎&#xff0c;还在办公自动化方面发挥了巨大作用。通过Python&#xff0c;我们可以编写脚本来自动执行各种重复性任务&#xff0c;从而提高工作效率并减少错误。在本文中&#xff0c;我们将…...

QT Creator下载安装详细教程(保姆级教程)

qt下载安装 1.下载网址 通过清华大学开源软件镜像站进行下载&#xff1a;链接: https://mirrors.tuna.tsinghua.edu.cn/qt/development_releases/online_installers/ 这里我选的是4.4版本的&#xff0c;也可以选择4.7版本&#xff0c;问题不大。 根据电脑系统选择下载linux…...

无人机公司销售需要什么资质

国家民航局于2024年1月1日实施了《无人驾驶航空器飞行管理暂行条例》&#xff0c;根据这个管理条例里面的 第十一条 使用除微型以外的民用无人驾驶航空器从事飞行活动的单位应当具备下列条件&#xff0c;并向国务院民用航空主管部门或者地区民用航空管理机构申请取得民用无人驾…...

代码自动化重构工具OpenRewrite介绍

OpenRewrite 是一个用于大规模自动化代码重构的开源框架&#xff0c;它极大地提升了开发人员的研发效率&#xff0c;通过自动化地进行代码重构和转换&#xff0c;帮助开发人员消除代码库中的技术债务。 通过 LST、访问器和配方的结合&#xff0c;OpenRewrite 能够实现准确的代…...

Win11安装Docker

下载Docker Desktop for Windows 下载 下载连接&#xff1a;Install Docker Desktop on Windows | Docker Docs 地址在国外&#xff0c;需要科学上网。也可使用我提供的&#xff0c;百度网盘&#xff1a;https://pan.baidu.com/s/1232TTkkzLsoZyFjC3bmgiQ 安装 下载完成之后…...

Windows电脑如何启动RTSP服务实现本地摄像头数据共享

技术背景 提起Windows共享本地摄像头&#xff0c;好多人想到的是通过ffmepg或vlc串流到服务器&#xff0c;实际上&#xff0c;用轻量级RTSP服务更简单&#xff0c;本文就介绍下&#xff0c;如何用大牛直播SDK的Windows轻量级RTSP服务&#xff0c;采集摄像头&#xff0c;生成本…...

探索 Spring WebFlux:构建响应式 Web 应用

探索 Spring WebFlux&#xff1a;构建响应式 Web 应用 随着互联网的发展&#xff0c;传统的同步编程模型已经难以应对高并发和高吞吐量的需求。为了解决这些问题&#xff0c;响应式编程逐渐成为主流。Spring WebFlux 是 Spring 5 引入的一个响应式 Web 框架&#xff0c;它基于…...

C# 植物大战僵尸

Winform 版本开发 高效率、流畅植物大战僵尸 git地址&#xff1a;冯腾飞/植物大战僵尸...

css 作业 2

文章目录 前言第四题第五题第六题第七题第八题第九题第十题&#xff08;子标签&#xff09; 前言 昨天写了前面三次作业&#xff0c;今天把剩下的七个作业写完 第四题 http://127.0.0.1:5500/index1.html&#xff0c;就用这个网址查看代码在网页的展示效果 代码评测过不了&…...

axios在vue中的使用

文章目录 一、axios是什么&#xff1f;二、使用步骤2.1 下载2.2 引入2.3 使用Get请求Post请求Forms 三、封装 一、axios是什么&#xff1f; Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和no…...

FastAPI(七十七)实战开发《在线课程学习系统》接口开发-- 课程编辑和查看评论

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 课程编辑 先来看下课程编辑 1.判断是否登录 2.判断课程是否存在 3.是否有权限&#xff08;只有自己可以修改自己的课程&#xff09; 4.名称是否重复…...

【JavaEE初阶】线程的概念及创建

目录 &#x1f4d5; 前言 &#x1f4d5; 认识线程&#xff08;Thread&#xff09; &#x1f6a9; 概念 &#x1f60a;线程是什么 &#x1f642; 为啥要有线程 &#x1f62d; 进程和线程的区别&#xff08;面试题重点&#xff09; &#x1f92d; Java的线程和操作系统线程…...

0727,学什么学,周六就应该休息!!!!!

周六就应该休息&#xff0c;一天就忙了两小时也不是我的错喵 目录 UDP的小总结 01&#xff1a;使用select实现一个基于UDP的一对一即时聊天程序。 1.0 复读机服务器和树洞客户端 2.0 byby不了一点的敬业服务器&#xff01;&#xff01;&#xff01; 今天到此为止&#x…...

【C#】获取DICOM图像像素的像素值

8位像素深度的像素值 public byte GetGreyValue(int x, int y) {x Math.Min(x, m_nWidth - 1);y Math.Min(y, m_nHeight - 1);unsafe{byte* greyValue (byte*)m_pDicomData.ToPointer() y * m_nWidth x;return *greyValue;} } 16位像素深度的像素值 public ushort GetG…...

k8s多集群管理工具kubecm

文章目录 一、概述二、安装1、官网链接2、各平台安装2.1、MacOS2.2、Linux2.3、Windows 三、实例1、验证2、配置kubecm自动补全&#xff08;选做&#xff09;2.1、Bash2.2、Zsh2.3、fish2.4、PowerShell 3、创建存放kubeconfig文件的目录4、添加到 $HOME/.kube/config4.1、kube…...

通过 WSL 2 在Windows 上挂载 Linux 磁盘

原文查看 曾为了传输或者共享不同系统的文件频繁地在 Windows 和 Linux 系统之间切换&#xff0c;效率过低&#xff0c;所以尝试通过 WSL 2 在Windows 上挂载 Linux 磁盘。 先决条件 需要在Windows 10 2004 及更高版本&#xff08;Build 19041 及更高版本&#xff09;或 Win…...