【C++】类和对象——Lesson2
Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~
💥💥个人主页:奋斗的小羊
💥💥所属专栏:C++
🚀本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为记录我的学习过程及理解。文笔、排版拙劣,望见谅。
目录
- 1、赋值运算符重载
- 1.1运算符重载
- 1.2赋值运算符重载
- 2、取地址运算符重载
- 2.1const成员函数
- 2.2取地址运算符重载
- 3、类型转化
- 4、再探构造函数
- 5、static成员
- 6、友元
- 7、内部类
- 8、匿名对象
1、赋值运算符重载
1.1运算符重载
当运算符被用于类类型的对象时,C++允许我们通过运算符重载的形式指定新的定义。C++规定类类型对象使用运算符时,必须转换成调用对应运算符重载,若没有对应的运算符重载,则会编译报错。
- 运算符重载是具有特殊名字的函数,它的名字是由
operator
和后面要定义的运算符共同构成,和其他函数一样,它也具有其返回类型和参数列表以及函数体 - 重载运算符函数的参数个数和该运算符作用的运算对象数量一样多。一元运算符有一个参数,二元运算符有两个参数,二元运算符的左侧运算对象传给第一个参数,右侧运算对象传给第二个参数
#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(){cout << _year << "-" << _month << "-" << _day << endl;}//类中成员变量都可以访问//int Get()//{// return _year;//}//private:int _year;int _month;int _day;
};bool operator<(Date d1, Date d2)
{return d1._year < d2._year&& d1._month < d2._month&& d1._day < d2._day;
}int main()
{Date x(2024, 7, 28);Date y(2004, 11, 7);operator<(x, y);//这样写和普通函数没什么区别//可以像下面这样调用,和上面一样x < y;return 0;
}
- 如果一个重载运算符函数是成员函数,则它的第一个运算对象默认传给隐式的
this
指针,因此运算符重载作为成员函数时,参数比运算对象少一个
#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(){cout << _year << "-" << _month << "-" << _day << endl;}//类中成员变量都可以访问//int Get()//{// return _year;//}bool operator<(Date d2){return _year < d2._year&& _month < d2._month&& _day < d2._day;}//private:int _year;int _month;int _day;
};int main()
{Date x(2024, 7, 28);Date y(2004, 11, 7);//operator<(x, y);//这样写和普通函数没什么区别//可以像下面这样调用,和上面一样//x < y;//x传给this指针,y传给d2x.operator<(y);x < y;return 0;
}
- 运算符重载后,其优先级和结合性与对应的内置类型运算符保持一致
- 不能通过连接语法中没有的符号来创造新的操作符,比如
operator@
.* :: sizeof ?: .
以上5个运算符不能重载- 重载操作符至少有一个类类型参数,不能通过运算符重载改变内置类型对象的含义,如:
int operator+(int x, int y);
- 一个类需要重载哪些运算符,是看哪些运算符重载后有意义,比如
Date
类重载operator-
就有意义,但是重载operator+
就没有意义 - 重载++运算符时,有前置++和后置++,运算符重载函数名都是
operator++
,无法很好的区分。C++规定,后置++重载时,增加⼀个int形参,跟前置++构成函数重载,方便区分 - 重载<<和>>时,需要重载为全局函数,因为重载为成员函数,this指针默认抢占了第一个形参位置,第⼀个形参位置是左侧运算对象,调⽤时就变成了 对象<<cout,不符合使⽤习惯和可读性。重载为全局函数把
ostream/istream
放到第⼀个形参位置就可以了,第⼆个形参位置当类类型对象
1.2赋值运算符重载
赋值运算符重载是一个默认成员函数,用于完成两个已经存在的对象之间的拷贝赋值,这里要注意跟拷贝构造区分,拷贝构造用于一个对象拷贝初始化给另一个要创建的对象。
int main()
{Date d1(2024, 7, 29);Date d2(2004, 11, 7);//赋值重载d1 = d2;//拷贝构造Date d3(d2);Date d4 = d2;return 0;
}
赋值运算符重载的特点:
- 赋值运算符重载是一个运算符重载,规定必须重载为成员函数。赋值运算符重载的参数建议写成
const
当前类类型引用,传值传参会有拷贝
//d1 = d2;
void operator=(Date d)
{_year = d._year;_month = d._month;_day = d._day;
}
如果这样写,因为赋值前要传参,所以会先调用拷贝构造,再调用复制重载。
- 有返回值,且建议写成当前类类型引用(因为传值返回也会先拷贝),引用返回可以提高效率,有返回值目的是为了支持连续赋值场景
- 没有显示实现时,编译器会自动生成一个默认赋值运算符重载,默认赋值运算符重载行为跟默认拷贝构造函数类似,对内置类型成员变量会完成值拷贝 / 浅拷贝(一个字节一个字节的拷贝),对自定义类型成员变量会调用它的赋值重载
- 像
Date
这样的类成员变量全是内置类型且没有指向什么资源,编译器自动生成的赋值运算符重载就可以完成需要的拷贝,所以不需要我们显示实现赋值重载。像Stack
这样的类,虽然也都是内置类型,但是_a指向了资源,编译器自动生成的赋值重载完成的值拷贝 / 浅拷贝不符合我们的需求,所以需要我们自己实现深拷贝(对指向的资源也进行拷贝)。像MyQueue
这样的类型内部主要是自定义类型Stack
成员,编译器自动生成的赋值重载会调用Stack
的赋值重载,也不需要我们显示实现MyQueue
的赋值运算符重载。如果一个类显示实现了析构并释放资源,那么它就需要显示写赋值重载,否则不需要
#include <iostream>
using namespace std;class Date
{
public://构造Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//拷贝构造Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;}//赋值运算符重载//d1 = d2;Date& operator=(const Date& d){_year = d._year;_month = d._month;_day = d._day;return *this;}private:int _year;int _month;int _day;
};int main()
{Date d1(2024, 7, 29);Date d2(2004, 11, 7);//赋值重载d1 = d2;//拷贝构造Date d3(d2);Date d4 = d2;return 0;
}
2、取地址运算符重载
2.1const成员函数
- 将
const
修饰的成员函数称之为const
成员函数,const
修饰成员函数放到成员函数参数列表的后面 const
实际修饰该成员函数隐含的this
指针,表明在该成员函数中不能对类的任何成员进行修改。const
修饰Date
类的Print
成员函数,Print
隐含的this
指针由Date* const this
变为const Date* const this
#include <iostream>
using namespace std;class Date
{
public:Date(int year = 2024, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//void Print(const Date* const this)void Print() const{cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{//const限定d1不能被修改const Date d1(2024, 7, 30);//权限平移d1.Print();Date d2(2024, 8, 1);//权限缩小d2.Print();return 0;
}
2.2取地址运算符重载
取地址运算符重载分为普通取地址运算符重载和const
取地址运算符重载,一般这两个函数编译器自动生成的就够我们用了,不需要去显示实现,除非一些特殊的场景,比如我们不想让别人取到当前类对象的地址,就可以自己实现一份,胡乱返回一个地址。
class Date
{
public:Date* operator&(){//正常代码//return this;return (Date*)0x004FF88C;}const Date* operator&() const{//return this;return (Date*)0x004FF88C;}private:int _year;int _month;int _day;
};
3、类型转化
- C++支持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数
- 构造函数前加
explicit
就不再支持隐式类型转换
#include <iostream>
using namespace std;class A
{
public://explicit A(int a)A(int a = 1){_a1 = a;}A(int a1, int a2){_a1 = a1;_a2 = a2;}A(const A& aa){_a1 = aa._a1;}void Print(){cout << _a1 << " " << _a2 << endl;}
private:int _a1;int _a2;
};class Stack
{
public://临时变量具有常性,用const修饰void Push(const A& aa){//...}
private:A _arr[20];int _top;
};int main()
{A aa1 = 1;aa1.Print();//隐式类型转换//构造一个A的临时对象,再用这个临时对象拷贝构造aa2//编译器遇到连续构造+拷贝构造->优化为直接构造A aa2 = 2;aa2.Print();A& raa1 = aa2;const A& raa2 = 2;//临时变量具有常性Stack st;A aa3 = 3;st.Push(aa3);//构造一个A类对象再插入st.Push(3);//直接插入A aa4 = { 4, 5 };const A& aa5 = { 4, 5 };st.Push(aa4);st.Push({ 4, 5 });return 0;
}
4、再探构造函数
之前我们实现构造函数时,初始化成员变量主要是使用函数体内赋值,构造函数初始化还有一种方法,就是初始化列表,每个构造函数都有初始化列表。
- 初始化列表的使用方式是以一个冒号开头,接着是一个以逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式
- 每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方
- 引用成员变量、
const
成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进行初始化,否则会编译报错 - C++11支持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显示在初始化列表初始化的成员使用的
- 尽量使用初始化列表初始化,因为那些你不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会用这个缺省值初始化。如果你没有给缺省值,对于没有显示在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有显示在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造函数会编译错误
#include <iostream>
using namespace std;class Time
{
public:Time(int hour):_hour(hour){cout << "Time()" << endl;}
private:int _hour;
};class Date
{
public:Date(int& rx, int year = 2024, int month = 1, int day = 1):_year(year),_month(month),_day(day),_n(1),_m(rx),_t(2){//...}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
private://这里不是初始化,是缺省值,这个缺省值是给初始化列表的//如果初始化列表没有显示初始化,默认就会用这个缺省值初始化int _year = 2024;int _month = 11;int _day = 7;//必须在初始化列表初始化const int _n = 1;int& _m = _day;Time _t = 12;//没有默认构造int* _ptr = (int*)malloc(4);
};int main()
{int x;//对象定义Date d1(x, 2024, 7, 31);d1.Print();//const定义的变量、引用必须在初始化列表定义const int x = 1;Date& d2 = d1;return 0;
}
- 初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的先后顺序无关,但是建议声明顺序和初始化列表顺序保持一致
| 下面程序的运行结果是什么:
#include <iostream>
using namespace std;class B
{
public:B(int a):_a1(a),_a2(_a1){//...}void Print(){cout << _a1 << " " << _a2 << endl;}
private:int _a2 = 2;int _a1 = 2;
};int main()
{B b(1);b.Print();return 0;
}
因为在B类中,先声明的_a2,再声明的_a1,所以在初始化列表中先初始化_a2,再初始化_a1,初始化_a2的时候_a1还是随机值,然后再用a初始化_a1。
5、static成员
- 用
static
修饰的成员变量,称之为静态成员变量,静态成员变量一定要在类外进行初始化 - 静态成员变量为当前类的所有对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区
- 用
static
修饰的成员函数,称之为静态成员函数,静态成员函数没有this
指针 - 静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有
this
指针 - 非静态的成员函数,可以访问任意的静态成员变量和静态成员函数
- 突破类域就可以访问静态成员,可以通过类名::静态成员或者对象.静态成员来访问静态成员变量和静态成员函数
- 静态成员也是类的成员,受
public、protected、private
访问限定符的限制 - 静态成员变量不能在声明位置给缺省值初始化,因为缺省值是给构造函数初始化列表的,静态成员变量不属于某个对象,不走构造函数初始化列表
求1+2+3+…+n
class Sum
{
public:Sum(){_ret += _i;++_i;}static int GetRet(){return _ret;}private:static int _i;static int _ret;
};int Sum::_i = 1;
int Sum::_ret = 0;class Solution {
public:int Sum_Solution(int n) {Sum arr[n];return Sum::GetRet();}
};
当定义一个Sum
类类型长度为n
的变长数组时,会调用n
次构造,实现n的累加。
| 设已有A、B、C、D四个类定义,程序中A、B、C、D构造函数调用顺序为?析构函数调用顺序为?
C c;
int main()
{A a;B b;static D d;return 0;
}
我们知道对象实例化时自动调用构造函数,a、b、c、d四个对象创建的先后顺序是c、a、b、d,所以构造函数的调用顺序就是C、A、B、D;对象在销毁时自动调用析构函数,又规定后定义的先析构,所以局部对象a和b先析构b再析构a,而d是静态的局部对象,生命周期是全局的,所以再析构d,最后析构c, 所以析构函数的调用顺序就是B、A、D、C。
6、友元
友元提供了一种突破类访问限定符封装的方式,友元分为友元函数和友元类,在函数声明或者类声明的前面加friend
,并且把友元声明放到一个类里面。
- 外部友元函数可访问类的私有和保护成员,友元函数仅仅是一种声明,不是类的成员函数
- 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
- 一个函数可以是多个类的友元函数
- 友元类中的成员函数都可以是另一个类的友元函数,都可以访问另一个类中的私有和保护成员
- 友元类的关系是单向的,不具有交换性,比如A类是B类的友元,但是B类不是A类的友元
- 友元类关系不能传递,如果A是B的友元,B是C的友元,但A不是C的友元
- 有时提供了便利,但友元会增加耦合度,破坏了封装,所以友元不宜多用
// 前置声明,否则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;
};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;
}
7、内部类
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。
- 内部类是一个独立的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包括内部类
- 内部类默认是外部类的友元类
#include<iostream>
using namespace std;class A
{
public:class B // B默认就是A的友元{public :void foo(const A& a){cout << _k << endl; //OKcout << a._h << endl; //OK}};
private :static int _k;int _h = 1;
};int A::_k = 1;int main()
{cout << sizeof(A) << endl;A::B b;A aa;b.foo(aa);return 0;
}
- 内部类本质也是一种分装,当A类跟B类精密关联,A类实现出来主要是给B类使用,那么可以考虑把A类设计为B类的内部类,如果放到
private / protected
位置,那么A类就是B类的专属内部类,其他地方都用不了
那求1+2+3+…+n这个题我们可以这样写:
class Solution {
public:int Sum_Solution(int n) {Sum arr[n];return _ret;}
private://class Sum{public:Sum(){_ret += _i;++_i;}};static int _i;static int _ret;
};int Solution::_i = 1;
int Solution::_ret = 0;
8、匿名对象
- 用类型(实参)定义出来的对象叫匿名对象,相比之前我们定义的类型 对象名(实参)定义出来的叫有名对象
- 匿名对象生命周期只在当前一行,一般临时定义一个对象当前用一下即可,就可以定义匿名对象
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);A aa2(2);// 匿名对象在这样场景下就很好⽤,单纯想调用类中的一个函数Solution().Sum_Solution(10);return 0;
}
相关文章:
【C++】类和对象——Lesson2
Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C 🚀本系列文章为个人学习笔记…...
常用传感器讲解十五--触摸传感器(KY-036)
常用传感器讲解十五–触摸传感器(KY-036) 具体讲解 这个比较简单,就是触摸后给个信号 电路连接 在Arduino上将VCC引脚连接到5V。 将GND连接到Arduino的GND。 将OUT连接到Arduino上的D2 代码实现 void setup() {pinMode(2, INPUT);Seri…...
web后端--Spring事务管理
事务也要日志配置 !!!!debug前面记得加空格 logging:level:org.springframework.jdbc.support.JdbcTransactionManager: debugrollbackFor 默认情况下,只有出现RunTimeException才会回滚事务,rollbackfor属性用于控制出现何种异常类型,回滚…...
【Docker系列】Docker 中-d 和-it 的区别
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
PHP回收废品平台系统小程序源码
🌍绿色行动,从“回收废品平台系统”开始!🚚 🚪【家门口的环保站,废品不再无处安放】 你是否曾为家里的旧报纸、空瓶子、废旧电器等废品头疼不已,不知该如何处理?现在,“…...
IIS解析漏洞~ IIS7.漏洞分析
IIS解析漏洞 文件解析漏洞是由于中间件错误的将特殊格式的文件解析成可执行网页文件(脚本),配合文件上传漏洞进行GetShell的漏洞! 1.2:IIS7.X 在IIS7.0和IIS7.5版本下也存在解析漏洞,在默认Fast-CGI开启状况下,在一个文…...
基于python+django的病人人信息管理系统及安全策略分析设计与实现
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...
前端必知必会-html表单的input属性
文章目录 HTML 输入属性value 属性readonly 属性disabled 属性size 属性maxlength 属性min 和 max 属性multiple 属性pattern 属性placeholder 属性required 属性step 属性autofocus 属性height 和 width 属性list 属性autocomplete 属性总结 HTML 输入属性 本章介绍 HTML <…...
设计模式:详细拆解策略模式
策略模式 既然是详解,就不以案例开头了,直奔主题,先来看看什么是策略模式。 模式定义 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式 使得算法可独立于使用它的客户而变化。 结构 Strategy&a…...
Python正则表达式面试题分析总结
Python正则表达式面试题主要围绕Python内置的re模块展开,考察的是应聘者对于正则表达式的理解、使用以及在实际问题中的应用能力。以下是对这些面试题的详细分析总结: 正则表达式基础: re模块简介:Python中的re模块提供了正则表达…...
LeetCode题练习与总结:超过经理收入的员工--181
一、题目描述 SQL Schema > Pandas Schema > 表:Employee ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | | salary | int | | managerId | int | ----…...
LInux:循环语句
LInux:循环语句 if-else语句 if 语句语法格式 if [ $a -gt $b ]; then echo "a>b" fiif [ $a -gt $b ]; then echo "a>b"echo "a!b"echo "true" fiif-else语句 if-else 语句语法格式 if [ $a -gt $b ]; then echo &q…...
NumPy和Pandas中的布尔索引
布尔索引(Boolean Indexing)是数据分析中一种强大且常用的技术,用于通过布尔值数组(即包含 True 和 False 的数组)来选择数据子集。布尔索引可以用于 NumPy 数组、Pandas 数据框等数据结构。 布尔索引是一种非常有用的…...
.NET 一款反序列化打入冰蝎内存马的工具
01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失…...
FPGA实现SDI视频接收转USB3.0传输,GS2971+FT601方案,提供4套工程源码和QT上位机源码
目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA驱动USB通信方案FPGA基于GS2971的SDI视频解码方案FPGA基于FT601的USB3.0视频传输方案 3、详细设计方案设计原理框图SDI 相机GS2971-SDI解码芯片解读BT1120转RGB888图像缓存FT601-USB3.0芯…...
2024第26届中国(深圳)国际清洁能源、储能科技与新型电力展览会
源网荷储充产业链盛会,2024年续写辉煌,第26届中国国际清洁能源、储能技术与新型电力展览会11月11日将启幕; 2024第二十六届中国国际储能技术与设备展览会 China International Energy Storage Technology and Equipment Exhibition 2024第二…...
计算机基础(Windows 10+Office 2016)教程 —— 第6章 电子表格软件Excel 2016(下)
电子表格软件Excel 2016 6.4 Excel 2016的公式与函数6.4.1 公式的概念6.4.2 公式的使用6.4.3 单元格的引用6.4.4 函数的使用6.4.5 快速计算与自动求和 6.5 Excel 2016的数据管理6.5.1 数据排序6.5.2 数据筛选6.5.3 分类汇总6.5.4 分组显示6.5.5 合并计算 6.6 Excel 2016的图表6…...
npm install 巨慢,导致Jenkins编译报错问题解决——基础积累
今天在弄后台系统的服务器编译时,一直报错。报错信息为:系统找不到指定的路径。 最后进入到服务器中,找到E:/Jenkins/WorkSpace/JiePeiAiMomsAdmin_FenZhi这个路径,然后通过cmd进入到命令提示符中。 然后通过npm i进行安装&#…...
Stable Diffusion 使用详解(5)---- 光影效果与场景融入
目录 背景 底模选取 提示词 ControlNet openpose illumination 效果 背景 有一家服装品牌店,需要绘制一款模特穿着某个英文LOG的漂亮服装,这是一种很常见UI作画需求,这类需求实际上可以透过选取正确的底模 controlNet 进行完美的实现…...
5G三大场景:eMBB、mMTC、uRLLC
1G,2G,3G,4G,5G有什么区别?5G的优势在哪?有什么应用? 1G,2G,3G,4G,5G有什么区别?5G的优势在哪?有什么应用?_3g4g5g的区别和作用-CSDN博客 从1G到4G,移动通信的核心是人与人之间的通信࿰…...
数据结构(面试)
目录 线索二叉树哈夫曼树并查集最小生成树最短路径拓扑排序二叉排序树平衡二叉树红黑树折半查找散列表堆排序归并排序 线索二叉树 原理:利用树节点的n1个左右空指针指向其遍历序列的前驱和后继(线索) 优点:简化遍历,不…...
从“人巡”到“智控”:EasyCVR智能视频监控技术变革河道违建监测模式
一、背景分析 随着城市化进程的加快,河道作为城市生态系统的重要组成部分,其保护与管理日益受到重视。然而,非法侵占河道、违规建设等行为时有发生,不仅破坏了河道的自然生态,还严重威胁到防洪安全和水质安全。为了有…...
JAVA基础 - 反射
目录 一. 简介 二. java.lang.Class类 三. java.lang.reflect包 四. 创建对象 五. 调用方法 六. 调用成员变量 一. 简介 反射是 Java 语言中的一种强大机制,允许程序在运行时动态地获取类的信息、访问类的成员(包括字段、方法和构造函数ÿ…...
【系统架构设计师】二十二、嵌入式系统架构设计理论与实践③
目录 一、鸿蒙操作系统架构案例分析 1.1 鸿蒙操作系统定义 1.2 鸿蒙的层次化分析 1.2.1 内核层 1.2.2 系统服务层 1.2.3 框架层 1.2.4 应用层 1.3 鸿蒙操作系统的架构分析 1.3.1 鸿蒙操作系统架构具有4个技术特性 1.3.2 分布式架构所带来的优势 1.3.3 HarmonyOS 架构…...
【轨物推荐】经济长波:创新周期的历史
原创 丑丑姐姐 专利分析可视化 2021年08月01日 21:18 图片来源:Visual Capitalist 在开始本文之前,我们先来学习两个概念: 经济长波(Long Waves),亦称“大循环理论”、“康德拉季耶夫周期”。经济长波理论…...
springboot高校勤工俭学平台-计算机毕业设计源码66824
摘 要 本研究基于Spring Boot企业框架,设计并实现了一款高校勤工俭学平台,包括首页、通知公告、新闻通知和岗位信息等功能模块。该平台旨在为高校学生提供便捷的勤工俭学信息发布与查询服务,促进校园内部劳动力资源的充分利用和高效管理。在研…...
CRM是什么?如何用CRM管理好客户?
在企业的销售运营中,客户是是贯穿始终的主体。客户的需求、偏好与满意度,指引着企业未来改变、优化的方向。而企业销售运营的核心,就是“客户至上”。 面对庞杂的客户信息,如何快速高效的进行客户管理呢?那就是要有一…...
编程入门:大学新生的指南与策略
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
Spring Cloud中怎么使用Resilience4j Retry对OpenFeign进行重试
在微服务架构中,服务之间的通信是非常频繁的。而使用OpenFeign可以极大简化微服务之间的HTTP通信。但在复杂的分布式系统中,服务之间的调用可能会因为网络问题、服务故障等原因而失败。因此,实现服务调用的重试机制显得尤为重要。Resilience4…...
【Redis 进阶】事务
Redis 的事务和 MySQL 的事务概念上是类似的,都是把一系列操作绑定成一组,让这一组能够批量执行。 一、Redis 的事务和 MySQL 事务的区别 1、MySQL 事务 原子性:把多个操作打包成一个整体。(要么全都做,要么都不做&am…...
济南网站建设公司晟创未来/软文世界平台
1、高考的失利,只是一时的成败。 2、被生活逼出的动力,你真的有曾感到绝望吗? 3、找到方向很重要,你可能与我一样,只是差了一位引路人。 4、兴趣是最好的老师,持续编程是我唯一坚持超过一年的事情 5、短…...
广发证券 网站谁做的/b站推广软件
keka在创建压缩和解压时从不要求文件名。现在keka总是在拖放文件夹/文件进行压缩时要求新的文件名。这个问题是因为更新了有关文件访问的信息,那么该如何解决,恢复到以前那样? Keka文件访问权限解决办法 磁盘访问 为了能够像以前一样集成&…...
DW怎么做网站下拉菜单/it培训机构排名
php爆绝对路径方法? 单引号引起数据库报错 访问错误参数或错误路径 探针类文件如phpinfo 扫描开发未删除的测试文件 google hacking phpmyadmin报路径:/phpmyadmin/libraries/lect_lang.lib.php 利用漏洞读取配置文件找路径 恶意使用网站功能,…...
网站平台建设公司/小广告多的网站
DOM编程不仅仅可以查找三种节点,也可以操作节点,那就是创建,插入,删除,替换和复制节点。先来看节点 操作方法: 还是借用一贯的HTML代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1…...
外贸订单网站有哪些/百度人工客服
前言: 在讲解Kafka的架构前我们先了解一下什么是消息队列 1. 消息队列的讲解 消息: 应用之间的信息相互传递 消息队列(Message Queue): 将消息放在队列中保证消息可靠传递 1.1 消息队列的特点 应用系统之间解耦----12306–用户系统后台消息驱动:以消息驱动应用…...
地方政府门户网站的建设/在线建站网页制作网站建设平台
在Windows server 2003上配置DHCP服务<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />实验二DHCP中继代理配置★ 实验环境1.准备三台电脑,一台作为客户机(XP),一台为DH…...