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

【C++】类与对象(三)

前言

本章我们接替前一章继续深入理解类的默认成员函数,赋值重载取地址重载,及const取地址操作符重载

但是在讲剩下的三个默认成员函数之前,我们要先来了解运算符重载,因为赋值重载,取地址重载,及const取地址操作符重载其实是属于运算符重载的一部分。

类与对象(三)

  • 一、运算符重载
    • 1、运算符重载的概念
    • 2、运算符重载的注意事项
  • 二、运算符重载的特例
    • 1、前置++和后置++类型
    • 2、流插入<< 流提取>>运算符
  • 四、赋值运算符重载(默认成员函数)
    • 1、引入
    • 2、特性
      • 1. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。
      • 2. 赋值运算符重载格式:
      • 3. 赋值运算符只能重载成类的成员函数不能重载成全局函数
      • 4. 如果类中未涉及到资源管理,赋值运算符是否实现都可以;一旦涉及到资源管理则必须要实现。
  • 五、取地址及const取地址操作符重载
    • 1、取地址操作符重载(默认成员函数)
      • 取地址重载的手动实现
    • 2、const取地址操作符重载(默认成员函数)
      • const取地址重载手动实现


一、运算符重载

1、运算符重载的概念

对于C++的内置类型,我们有许多运算符可以使用,但是这些运算符却无法对自定义类型进行使用,我们只能写一个与运算符功能类似的函数,让自定义类型去调用。
例如:

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//给一个给日期加num天,不修改原始值Date Add(int num){//......}//给一个日期加num天,并修改原始值Date AddEqual(int num){//.....}
private:int _year;int _month;int _day;
};
int main()
{int a = 10;a + 10;a += 10;Date d1;d1.Add(10);//d1+10;    //想写成这样,这样更直观方便,可是编译器不允许啊啊啊d1.AddEqual(10);//d1+=10;   //想写成这样,这样更直观方便,可是编译器不允许啊啊啊return 0;
}

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

函数名字为:关键字operator后面接需要重载的运算符符号。

函数原型:返回值类型 operator操作符(参数列表)

只看定义不太好理解运算符重载,我们还是直接先看代码,结合代码边分析边理解定义与注意要点。

// 全局的operator==
#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
//private:int _year;int _month;int _day;
};
// 这里会发现:运算符重载成全局的 就需要成员变量是公有的,不然下面的函数无法访问到成员变量,
// 那么问题来了,封装性如何保证?
//这点我们现在还没有办法解决,所以我们先暂时将成员设定为公有。
//还有一种办法就是把它写进类中,变成成员函数。(暂时不用此种方法)//判断两个对象是否相同
bool operator==(const Date& d1, const Date& d2)
{return d1._year == d2._year&& d1._month == d2._month&& d1._day == d2._day;
}void Test()
{Date d1(2023, 2, 12);Date d2(2023, 2, 12);cout << operator==(d1, d2) << endl;//判断两个对象是否相同,第一种使用方法,直接调用函数cout << (d1 == d2) << endl;//判断两个对象是否相同,第二种使用方法,使用重载后的运算符//此处必须加括号,运算符优先级:<< 大于 ==
}

相信仔细看完这个代码后你已经对运算符重载有了一定的了解,就是大概相当于自定义类型的运算符其实是一个我们手动写函数,但是呢经过运算符重载以后我们可以像使用内置类型运算符那样去使用函数。

2、运算符重载的注意事项

  • 不能通过连接其他符号(C++中不存在的运算符)来创建新的操作符:比如operator@
  • 重载操作符必须有一个类类型参数(因为运算符重载主要是为了让自定义类型能够像内置类型那样去使用运算符)
  • 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义(因为运算符重载主要是为了让自定义类型能够像内置类型那样去使用运算符,内置类型不需要运算符重载)
  • 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐 藏的this
  • .* :: sizeof ?: . 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。

二、运算符重载的特例

1、前置++和后置++类型

经过上面的运算符重载的讲解相信你对于Date类中的一些其他运算符也能写出它的运算符重载如:

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}Date& operator+(int num){//......}Date& operator-(Date& d){//......}Date& operator+=(int num){//......}//......//其实这么多运算符重载我们可以一一实现,也可以实现一到两个,然后让其他运算符重载
private:int _year;int _month;int _day;
};

但是我们在学习C语言时学习过 前置++,后置++,前置- -,后置- -, 对于这种运算符重载我们应该怎么做呢?
我们先写一下函数外部的参数列表:

//前置++Date& operator++(){}
//后置++Date operator++(){}

我们发现它们的函数外部参数列表一模一样,这样根本无法构成函数重载,我们也只能实现 前置++,后置++中的一个。
为了解决这个问题,我们C++给这种前置++,后置++,前置- -,后置- -,这种运算符重载时进行了特殊化处理,规则是:

  1. 前置++正常实现
  2. 后置++在运算符重载时多传一个int型参数(此参数只是为了占位,实现函数重载,不起其他作用,也不必真的传递参数)

(- -与以上规则类似)

所以正确实现我们应该这样实现:

//前置++Date& operator++(){*this += 1;//假设 +=我们已经运算符重载过了return this;}
//后置++Date operator++(int a)//形参名可以不写,直接写成 int,调用时也不需要传递参数{Date tmp(this); //会去调用拷贝构造 *this += 1; //假设 +=我们已经运算符重载过了return tmp;}

2、流插入<< 流提取>>运算符

在前面讲解运算符重载时我们说过,<<其实是移位运算符,但是呢在C++中被重载为了流插入运算符,那具体是怎么做的呢?我们现在学习了运算符重载已经可以去讨论这个问题了。

首先我们经常使用的coutcin,其实分别是一个ostream类型对象,一个是istream类型的对象,这两个类型又分别在<ostream><istream>两个C++标准库的std标准命名空间内,然后我们经常使用的C++标准库<iostream>又包含了<istream><ostream>头文件,所以我们使用cincout的时即要包含头文件<iostream>又要使用using namespeace std;将标准命名空间里面的内容展开到全局中。

在这里插入图片描述
我们再来看看流提取<<运算符重载
在这里插入图片描述

可以看到在C++对流提取<<运算符进行了许多运算符重载+函数重载,我们对于内置类型可以随意使用<<,但是自定义类型我们却没有办法使用,因为自定义类型是我们自定义的,C++无法提前预知我们要写什么自定义类型,然后给我们的自定义类型进行运算符重载,所以我们想让我们的自定义类型也能用流提取<<,必须我们手动实现自定义类型的<<的运算符重载。
在这里插入图片描述


我们先来看看第一种写法

//<< 运算符重载
#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}ostream& operator<< (ostream&out){out << _year << "年" << _month << "月" << _day << "日" << endl;return out;}
private:int _year;int _month;int _day;
};int main()
{Date d1;int a = 10;cout << a << endl;//C++对自定义类型已经实现了 << 的运算符重载cout << d1;  return 0;
}

在这里插入图片描述
编译失败了,我们仔细检查检查,会发现是67行我们写反了!应该写成

d1 << cout;           //第一种写法
d1.operator<<(cout);  //第二种写法

因为运算符重载时,第一个参数是左操作数,第二个操作数是右操作数(注意,第一个参数是隐藏的this指针)

写正确后我们运行一下:

在这里插入图片描述
没有问题,但是这样写也太变态了,违法我们的使用直觉使用啊,直觉告诉我们,我们应该这样使用:

cout << d1;

那么我们就应该把这个流插入<<重载定义到函数外面,因为定义在类的内部默认传递的第一个参数就是this指针,我们永远达不到目的。
于是我们定义在外面:

#include<iostream>
using namespace std;
class Date
{friend ostream& operator<<(ostream& out, 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& out, Date& d)
{out << d._year << "年" << d._month << "月" << d._day << "日" << endl;return out;
}int main()
{Date d1;int a = 10;cout << a << endl;//C++对自定义类型已经实现了 << 的运算符重载cout << d1;return 0;
}

还又一个问题我们写<<运算符重载时为什么要用引用呢?
在这里插入图片描述
注意:<<是左结合性!
返回值用引用了我们就可以实现连续多个自定义类型打印了!

//假如d1 d2 d3 都是Date类型
cout << d1 << d2 << d3 << endl;

四、赋值运算符重载(默认成员函数)

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;}void Print(){cout << _year << "年" << _month << "月" << _month << "日" << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;Date d2 = d1;//或者Date d2(d1)  会调用默认生成的拷贝构造,对象初始化时赋值用的是拷贝构造Date d3;d3 = d1;//我们没有实现Date类的运算符 = 的赋值重载,所以会调用默认生成的赋值重载//最后d3里面的数据与d1一样
}

2、特性

1. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。

注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值(=)运算符重载完成赋值。
实例代码:
如上面的代码

2. 赋值运算符重载格式:

参数类型:const T&,传递引用可以提高传参效率
返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值检测是否自己给自己赋值
返回*this :要符合连续赋值的含义

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1900, 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;}//自己写的 赋值重载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;
};int main()
{Date d1(2023,2,12);Date d2;d2 = d1;return 0;
}

在这里插入图片描述
在这里插入图片描述

3. 赋值运算符只能重载成类的成员函数不能重载成全局函数

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}int _year;int _month;int _day;
};
// 赋值运算符重载成全局函数,注意重载成全局函数时没有this指针了,需要给两个参数
Date& operator=(Date& left, const Date& right)
{if (&left != &right){left._year = right._year;left._month = right._month;left._day = right._day;}return left;
}
// 编译失败:
// error C2801: “operator =”必须是非静态成员

在这里插入图片描述


原因:赋值运算符如果不显式实现,编译器会生成一个默认的。
此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数

在这里插入图片描述

4. 如果类中未涉及到资源管理,赋值运算符是否实现都可以;一旦涉及到资源管理则必须要实现。

和拷贝构造函数一样我们继续思考:既然编译器生成的默认赋值运算符重载函数已经可以完成字节序的值拷贝了,对于内置类型还需要自己实现吗?
和拷贝构造一样,特性4也是我们写与不写复制重载函数的判断条件!
例如:

// 这里会发现下面的程序会崩溃掉,编译器生成的是浅拷贝,导致我们析构了两次空间,
//这里就需要我们以后讲的深拷贝去解决。
#include<iostream>
using namespace std;
typedef int DataType;
class Stack
{
public:Stack(size_t capacity = 10){_array = (DataType*)malloc(capacity * sizeof(DataType));if (nullptr == _array){perror("malloc申请空间失败");return;}_size = 0;_capacity = capacity;}void Push(const DataType& data){// CheckCapacity();_array[_size] = data;_size++;}~Stack(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}
private:DataType* _array;size_t _size;size_t _capacity;
};
int main()
{Stack s1;s1.Push(1);s1.Push(2);s1.Push(3);s1.Push(4);Stack s2;s2 = s1;return 0;
}

在这里插入图片描述
到这里我们就把六个默认成员函数中的第四个:复制重载给讲完了。
复制重载其实是运算符重载的一部分!

五、取地址及const取地址操作符重载

1、取地址操作符重载(默认成员函数)

我们还是先看代码再思考:

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;
};int main()
{Date d1;cout << &d1 << endl;
}

在这里插入图片描述
结果符合我们的预期,你可能觉得没有什么值得思考的点。
但是我们说过:对于自定义类型我们不能对他们像对内置类型那样使用运算符,但是我们对Date类的对象 d1 使用了取地址运算符&,而我们并没有实现&的运算符重载,结果我们却可以使用&,而且结果很对。为什么呢?

这是因为第五个默认成员函数:取地址操作符重载,即我们不写,编译器会帮我们自动生成,它的作用就是帮我们实现自定义类型对象的取地址。

取地址重载的手动实现

通常情况下我们一般自己不写此函数,让编译器自动生成。那假设我们自己实现此函数该怎么办呢?

实现代码如下:

//取地址重载函数
#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//取地址重载Date* operator&(){return this;}
private:int _year;int _month;int _day;
};int main()
{Date d1;cout << &d1 << endl;
}

在这里插入图片描述

2、const取地址操作符重载(默认成员函数)

我们定义对象时一般都不会加const,那我们如果给对象加const会发生什么?
那我们再看一段代码:

#include<iostream>
using namespace std;
class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << "Print()" << endl;cout << "year:" << _year << endl;cout << "month:" << _month << endl;cout << "day:" << _day << endl << endl;}
private:int _year; // 年int _month; // 月int _day; // 日
};
int main()
{Date d1(2022, 1, 13);d1.Print();const Date d2(2022, 1, 13);d2.Print();return 0;
}

我们发现无法编译通过
在这里插入图片描述
为什么给对象加了const后我们调用函数就失败了呢?按照加const报错的常见原因,不难想应该是权限被放大了。

还记得this指针的类型是什么吗?答案是:* const类型。这里应该是Date * const
我们用const修饰的对象取地址后应该是什么类型?答案是:const *。这里应该是const Date*
两个类型不匹配,const修饰对象后内容不能被更改,所以我们的this指针要改变类型,在*前加一个const
在这里插入图片描述

但是呢 this指针是编译器传递的,我们无法加const ,这该怎么办呢?
这里C++编译器又做了特殊化处理我们需要加const在函数括号后面,才能对this指针进行修饰

正确代码:

#include<iostream>
using namespace std;
class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Print() const{cout << "Print()const" << endl;cout << "year:" << _year << endl;cout << "month:" << _month << endl;cout << "day:" << _day << endl << endl;}
private:int _year; // 年int _month; // 月int _day; // 日
};
int main()
{Date d1(2022, 1, 13);d1.Print();const Date d2(2022, 1, 13);d2.Print();return 0;
}

在这里插入图片描述

在这里插入图片描述
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

请思考下面的几个问题:

  1. const对象可以调用非const成员函数吗?
    答案:不可以,传递this指针时权限会放大
  2. 非const对象可以调用const成员函数吗?
    答案:可以,传递this指针时权限缩小
  3. const成员函数内可以调用其它的非const成员函数吗?
    答案:不可以,传递this指针时权限会放大
  4. 非const成员函数内可以调用其它的const成员函数吗?
    答案:可以,传递this指针时权限缩小

const取地址重载手动实现

同理在前面的代码中我们取const类型的地址时没有对&进行重载,但我们却可以使用,同样是因为编译器自动帮我们实现了const取地址重载

注意两个不太一样,两个函数构成函数重载!

取地址操作符重载

Date* operator&()             //对非 const 对象取地址

const取地址重载

const Date* operator&()const  //对 const 对象取地址

手动实现:

//const取地址重载函数
#include<iostream>
using namespace std;
class Date
{
public:Date(int year=0, int month=0, int day=0){_year = year;_month = month;_day = day;}void Print() const{cout << "Print()const" << endl;cout << "year:" << _year << endl;cout << "month:" << _month << endl;cout << "day:" << _day << endl << endl;}const Date* operator&()const //返回值const Date * 是为了与this 指针保持一致{return this;}
private:int _year; // 年int _month; // 月int _day; // 日
};
int main()
{const Date d1;cout << &d1 << endl;return 0;
}

在这里插入图片描述

在这里插入图片描述
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容

相关文章:

【C++】类与对象(三)

前言 本章我们接替前一章继续深入理解类的默认成员函数&#xff0c;赋值重载&#xff0c;取地址重载&#xff0c;及const取地址操作符重载 但是在讲剩下的三个默认成员函数之前&#xff0c;我们要先来了解运算符重载&#xff0c;因为赋值重载&#xff0c;取地址重载&#xff0c…...

华为OD机试 - 任务混部 (Python)| 真题+思路+考点+代码+岗位

任务混部 题目 新型冠状病毒疫情的肆虐,使得家在武汉的大壮不得不思考自己家和附近定点医院的具体情况。 经过一番调查, 大壮明白了距离自己家最近的定点医院有两家。其中医院 A 距离自己的距离是 X 公里,医院 B 距离自己的距离是 Y 公里。 由于武汉封城,公交停运,私家…...

Gin 如何编写一个接收文件的 HTTP 接口

文章目录1.前言2.ChatGPT 的回答3.小结参考文献1.前言 以前遇到编程类的问题&#xff0c;第一时间想到的是 Google&#xff0c;而现在我会问 ChatGPT。 2.ChatGPT 的回答 比如 Gin 如何编写一个接收文件的 HTTP 接口&#xff0c;感受下 ChatGPT 工整有序的回答吧。 使用 Gin…...

连续子数组的最大和 (贪心,动态规划) AcWing(JAVA)

输入一个 非空 整型数组&#xff0c;数组里的数可能为正&#xff0c;也可能为负。 数组中一个或连续的多个整数组成一个子数组。 求所有子数组的和的最大值。 要求时间复杂度为 O(n)。 数据范围&#xff1a; 数组长度 [1,1000]。 数组内元素取值范围 [−200,200][−200,200]。 …...

华为OD机试 - 括号检查(Python)| 真题+思路+考点+代码+岗位

括号检查 题目 现有一字符串 仅由(,),{,},[,]六种括号组成 若字符串满足以下条件之一,则为无效字符串 任意类型的左右括号数量不相等存在未按正确顺序(先左后右)闭合的括号, 输出括号的最大嵌套深度 若字符串无效则输出0 0 <= 字符串长度 <= 100000输入 一个只包括(…...

Redis 数据类型

我们知道 Redis 是 Key-Value 类型缓存型数据库&#xff0c;Redis 为了存储不同类型的数据&#xff0c;提供了五种常用数据类型&#xff0c;如下所示&#xff1a; string&#xff08;字符串&#xff09;hash&#xff08;哈希散列&#xff09;list&#xff08;列表&#xff09;…...

【SPSS】频数分析和基本描述统计量详细操作教程(附实战案例)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

TCP/IP网络编程——多种 I/O 函数

完整版文章请参考&#xff1a; TCP/IP网络编程完整版文章 文章目录第 13 章 多种 I/O 函数13.1 send & recv 函数13.1.1 Linux 中的 send & recv13.1.2 MSG_OOB&#xff1a;发送紧急消息13.1.3 紧急模式工作原理13.1.4 检查输入缓冲13.2 readv & writev 函数13.2.1…...

静态代理和动态代理的区别以及实现过程

前言 代理模式是一种设计模式&#xff0c;能够使得在不修改源目标的前提下&#xff0c;额外扩展源目标的功能。即通过访问源目标的代理类&#xff0c;再由代理类去访问源目标。这样一来&#xff0c;要扩展功能&#xff0c;就无需修改源目标的代码了。只需要在代理类上增加就可…...

Consul SpringCloudK8S

背景说起微服务&#xff0c;就需要用到SpringCloud&#xff0c;目前市面上主流的SpringCloud产品有这些&#xff1a;SpringCloudNeflix、Spring Cloud Alibaba、Spring Cloud for AWS、Spring Cloud Azure 和 Spring Cloud Kubernetes。其中SpringCloudNeflix已经不在更新&…...

anaconda3文件夹被移动之后,如何操作可以复用原有conda环境

anaconda3文件夹被移动A-调整conda PATH地址B-更改.conda/environments.txt中的地址C-修改conda内的变量和每个环境的pip目录A-调整conda PATH地址 B-更改.conda/environments.txt中的地址 a. 优先切换到用户根目录 b. 查看隐藏conda目录 c. 编辑 vi .conda/environments.txt…...

【Java】Stack(栈) Queue(单向队列) Deque(双向队列)

Stack (栈) Stack 是一个先进后出的栈&#xff0c;可以将其理解为一个只开了一个口子的管子&#xff0c;放进去的东西只能从这一个口进出。所以先放进去的元素在取出的时候只能到最后才能取出来。 Stack具备一下几个方法&#xff1a; boolean empty&#xff08;&#xff09; …...

自定义spring拦截器

说明&#xff1a; 一些版本比较老的spring框架的&#xff0c;是通过继承HandlerInterceptorAdapter并重写preHandle()方法&#xff0c;和继承WebMvcConfigurerAdapter并重写 addInterceptors()方法来实现拦截器的&#xff0c;但是这两个类很久前就已经过时了&#xff0c;不推荐…...

今天正式上线!虹科汽车免拆诊断云展厅:感受精准修车魅力,畅享汽修领先技术

『虹科汽车免拆诊断云展厅』 2月15日正式上线&#xff01; 在这里&#xff0c;您可以参观了解&#xff1a; 虹科Pico汽车示波器产品模型 全流程专业讲解的视频资料 产品功能和应用场景 全面详细的产品手册 还有虹科首席技术工程师在线连麦答疑&#xff01;&#xff01;&#xf…...

4.数据类型-字符串【Python】

文章目录字符串索引切片转义字符格式化符号f-string字符串操作判断&检测转换剪切&填充拼接统计格式转化练习字符串 ​ 字符串是 Python 中最常用的数据类型。可以使用单引号&#xff0c;双引号&#xff0c;3对双引号创建一个字符串。Python 中没有单独的字符类型 char…...

搞量化先搞数(上):A股股票列表免费抓取实战

到了这一步,我们学习了基础的爬虫请求库urllib和requests,尤其是后者,强大且易用,极其适合新手使用。那么今天我们就找一个相对简单的案例,来看一下如何在实战中应用爬虫技能。 相信很多朋友都对股票感兴趣,甚至有些朋友想要通过量化研究来获得超额收益。然而,想要进行…...

SpringCloud-负载均衡Ribbon

一、配置使用1、添加依赖&#xff08;该依赖包含在eureka-client依赖中&#xff09;<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency>2、在RestTemp…...

Linux入门篇(二)

Linux前言链接文件符号链接&#xff08;软链接&#xff09;硬链接shellshell 的类型shell的父子关系理解外部命令和内建命令外部命令内建命令Linux环境变量PATH环境变量前言 在这一章&#xff0c;我对Linux中有关shell较为深入的理解和环境变量方面知识的一个记录。同时&#x…...

第四部分:特殊用途的句子——第三章:虚拟

虚拟语气 1、什么是虚拟&#xff1f; 虚拟就是非真实。换句话说&#xff0c;这事不是真的&#xff0c;这事不太可能成真&#xff0c;非真实&#xff0c;就是虚拟 2、怎么表示虚拟&#xff1f; 英语是一个典型的形式来补充内容的语言&#xff0c;若要表达虚拟&#xff0c;只…...

Java中如何获取泛型类型信息

文章目录声明侧泛型使用侧泛型获取泛型类型相关方法1. Class类的泛型方法2. Field类的泛型方法3. Method类的泛型方法4. ParameterizedType类获取声明侧的泛型类型信息获取使用侧的泛型类型信息匿名内部类实现获取使用侧的泛型类型根据使用泛型位置的不同可以分为&#xff1a;声…...

【云原生】centos7搭建安装k8s集群 v1.25版本详细教程实战

文章目录前言一. 实验环境二. k8s 的介绍三 . k8s的安装3.1 搭建实验环境3.1.1 硬件层面的要求3.1.2 软件层面环境配置3.2 docker的安装3.2.1 搭建docker3.2.2 部署 cri-dockerd3.3 部署k8s3.3.1 配置添加阿里云的yum源3.3.2 安装kubeadm kubelet kubectl3.3.3 k8s-master节点初…...

c语言指针

指针 指针是存放地址的变量&#xff0c;也可以说指针地址。 对于定义p&#xff08;这里的话&#xff0c;只是定义&#xff0c;说明p是指针&#xff09;&#xff0c;p作为一个指针去指向存放数据的位置&#xff0c;而p意思是取&#xff08;p指向的内存位置的数据&#xff09;&…...

5.33 综合案例2.0 -ESP32拍照上传阿里云OSS

综合案例2.0 - ESP32拍照上传阿里云OSS案例说明连线功能实现1.阿里云平台连接2.OSS对象存储服务3.ESP32-CAM开发环境4.代码ESP32-CAM开发板代码HaaS506开发板代码测试数据转图片方法案例说明 使用ESP32拍照,将照片数据上传阿里云OSS&#xff08;通过4G网络上传&#xff09;。 …...

java无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “…...

测试用例设计工作中的应用

1. 等价类划分 常见的软件测试面试题划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理划分为假设干等价类,在每一个等价类中取一…...

leetcode 困难 —— 数字 1 的个数(简单逻辑题)

&#xff08;害&#xff0c;做题是真的慢&#xff0c;这面试给我这题我估计就傻了&#xff09; 题目&#xff1a; 给定一个整数 n&#xff0c;计算所有小于等于 n 的非负整数中数字 1 出现的个数。 题解&#xff1a; 首先看看整数范围 0 < n < 10^9 不能遍历&#xff0…...

关于JSON

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> </head> <body> <script> /* 1、JSON的英文全称&#xff1a;Java…...

Apifox-接口调用、自动化测试工具

Apifox简介 Apifox 的定位是Postman Swagger Mock JMeter&#xff0c;具有API文档管理、API调试、API Mock、API 自动化测试等功能。可以通过一种工具解决之前使用多种工具的数据同步问题。高效、及时、准确&#xff01; 安装 Apifox的安装非常方便&#xff0c;直接下载安…...

Vue一个项目兼容每个省份的个性化需求

开发环境及打包指令 后拼上省份区划"serve:henan": "yarn && vue-cli-service serve -o --encryptSM2 --zone41","serve:hunan": "yarn && vue-cli-service serve -o --encryptSM2 --zone43","serve:guizhou&quo…...

npm install报错 npm ERR! 的解决办法

以下是四种常见的npm ERR及解决方式错误一、npm ERR! A complete log of this run can be found in:npm ERR!C:\Users\nanyi\AppData\Roaming\npm-cache_logs\2021-09-17T08_58_23_413Z-debug.l查看错误日志&#xff0c;错误日志就在上面展示的C:\Users…这里如果发现错误日志里…...

附近做网站/网络推广项目外包公司

神经网络的结构设计有3个主流的高级技巧&#xff1a;1&#xff0c;高低融合 (将高层次特征与低层次特征融合&#xff0c;提升特征维度的丰富性和多样性&#xff0c;像人一样同时考虑整体和细节)2&#xff0c;权值共享 (一个权值矩阵参与多个不同的计算&#xff0c;降低参数规模…...

b2b电子商务网站分类/seo是哪个英文的简写

引言概率密度期望和协方差 Expectations and covariances1加权平均值2 多变量权重3 条件期望4 函数方差5 协方差 Bayesian Probability5高斯分布重回多项式拟合1理解误差函数2 理解规则化 贝叶斯曲线拟合 主要讲解了贝叶斯概率与统计派概率的不同。概率论&#xff0c;决策论&am…...

怎么做网站的快照/澳门seo关键词排名

今天在用SQL Server 2008执行一个SQL脚本文件时&#xff0c;引发类型为“System.OutOfMemoryException”的异常错误&#xff0c;脚本明明是从SQL Server 2008导出的 出现这个错误的主要原因是由于SQL脚本文件太大&#xff0c;估计超过了100M了转载于:https://www.cnblogs.com/x…...

wordpress 用法/百度搜索榜排名

application对象 application对象负责提供应用程序在服务器中运行时的一些全局信息&#xff0c;常用的方法有getMimeType和getRealPath等。 运用实例&#xff1a;网页访问计数器。 <% page language"java" import"java.util.*" pageEncoding"UTF-8…...

商丘做网站推广的公司/定制化网站建设

import tensorflow as tf import numpy as np# 在这个例子中&#xff0c;我们的目标就是要找到合适的b和k&#xff0c;使得该线性模型能够把上面的样本给表示出来# 第一、使用Numpy生成一百个随机点,这就是样本 x_data np.random.rand(100) y_data x_data*0.1 0.2# 第二、构…...

网站源码制作/百度联盟怎么加入赚钱

从十二星座分布图来看&#xff0c;我们不同星座位于不同的位置&#xff08;废话&#xff09;&#xff0c;所以我们夏天旅游也要去不同的地方&#xff01;要去就要去符合我们气场的地方&#xff0c;舒服。 这有关系吗&#xff1f;&#xff1f;&#xff1f;你又在骗我&#xff01…...