C++进阶(2)-函数

目录

一、函数提高

1.1函数默认参数

 1.2函数占位参数

1.3函数重载

1.3.1函数重载概述

 1.3.2函数重载注意事项

 二、类和对象

2.1封装

2.1.1封装的意义

2.1.2struct和class区别

 2.1.3成员属性设置为私有

2.1.4封装案例

 2.2对象的初始化和清理

2.2.1构造函数和析构函数

2.2.2构造函数的分类及调用

 2.2.3拷贝构造函数调用时机

2.2.4构造函数调用规则

 2.2.5深拷贝和浅拷贝

2.2.6初始化列表

2.2.7类对象作为类成员

2.2.8静态成员

2.3C++对象模型和this指针

2.3.1成员变量和成员函数分开存储

2.3.2this指针

未完待续。。。


一、函数提高

1.1函数默认参数

在C++中,函数的形参列表中的形参是可以有默认值的。

语法:返回值类型 函数名(参数 = 默认值){ }

注意事项:

1、如果某个位置已经有了默认参数,那么从这个位置往后,从左到右都必须有默认值

2、如果函数声明有默认参数,函数实现就不能有默认参数(声明和实现只能有一个有默认参数)

#include<iostream>
using namespace std;//函数的默认参数
int func(int a, int b = 20, int c = 30) {return a + b + c;
}int main() {cout << func(10,30) << endl;//70system("pause");return 0;
}

 1.2函数占位参数

C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置

语法:返回值类型 函数名(数据类型){ }

#include<iostream>
using namespace std;//占位参数
void func(int a, int) {cout << "this is func" << endl;
}int main() {func(10, 10);system("pause");return 0;
}

1.3函数重载

1.3.1函数重载概述

作用:函数名可以相同,提高复用性

函数重载满足条件

①同一个作用域下②函数名称相同③函数参数类型不同或者个数不同或者顺序不同

注意:函数的返回值不可以作为函数重载的条件

#include<iostream>
using namespace std;//函数重载
void func() {cout << "调用func" << endl;
}void func(int a) {cout << "调用func(int a)" << endl;
}void func(double b) {cout << "调用func(double b)" << endl;
}void func(int a,double b) {cout << "调用func(int a,double b)" << endl;
}void func(double b,int a) {cout << "调用func(double b,int a)" << endl;
}int main() {func();func(10);func(3.14);func(3, 3.14);func(3.14, 3);system("pause");return 0;
}

 1.3.2函数重载注意事项

引用作为重载条件

函数重载碰到函数默认参数

#include<iostream>
using namespace std;//函数重载注意事项
//1、引用作为重载条件
void func(int& a) {cout << "调用func(int &a)" << endl;
}
void func(const int& a) {cout << "调用func(const int &a)" << endl;
}//2、函数重载碰到默认参数
void func2(int a,int b = 10) {cout << "调用func2(int a,int b = 10)" << endl;
}
void func2(int a) {cout << "调用func2(int a)" << endl;
}int main() {int a = 10;func(a);func(10);func2(10);//当函数重载碰到默认参数,报错system("pause");return 0;
}

 二、类和对象

C++面向对象三大特性:封装、继承、多态

C++认为万事万物皆为对象,对象上有其属性和行为

2.1封装

2.1.1封装的意义

①将属性和行为作为一个整体,表现生活中的事物

②将属性和行为加以权限控制

封装意义1:

在设计类的时候,属性和行为写在一起,表现事物

语法:class 类名{ 访问权限:属性/行为}

示例1:设计一个圆类,求圆的周长

#include<iostream>
using namespace std;const double PI = 3.14;class Circle {
public://属性int m_r;//行为double calculateZC() {return 2 * PI * m_r;}};int main() {//创建具体的对象Circle c1;c1.m_r = 10;cout << "圆的周长:" << c1.calculateZC() << endl;system("pause");return 0;
}

示例2:

设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号

#include<iostream>
#include<string>
using namespace std;class Student {
public://属性string Name;int ID;//行为//打印姓名和学号void showNameID() {cout << "姓名:" << Name << "学号:" << ID << endl; }//设置姓名void setName(string name) {Name = name;}//设置学号void setID(int id) {ID = id;}};int main() {//创建具体的对象Student s1;s1.Name = "Jake";s1.ID = 1;s1.showNameID();Student s2;s2.setName("Marry");s2.setID(2);s2.showNameID();system("pause");return 0;
}

 封装意义2:

类在设计时,可以把属性和行为放在不同权限下,加以控制

访问权限有三种:

public        公共权限类内可以访问,类外可以访问
protected保护权限类内可以访问,类外不可以访问(儿子可以访问父亲中的保护内容)
private       私有权限类内可以访问,类外不可以访问(儿子不可以访问父亲中的保护内容)
#include<iostream>
#include<string>
using namespace std;class Person {
public:string Name;
protected:string Car;
private:int Password;public:void func() {Name = "张三";Car = "VWPOLO";Password = 123456;}};int main() {//创建具体的对象Person p1;p1.Name = "李四";//以下访问不到/*p1.Car = "YYC";p1.Password = 786808;*/system("pause");return 0;
}

2.1.2struct和class区别

默认的访问权限不同

struct默认权限为公共public

class默认权限为私有private 

#include<iostream>
#include<string>
using namespace std;class C1 {int m_A;//默认权限,私有
};struct C2 {int m_A;//默认权限,公共
};int main() {C1 c1;//c1.m_A = 100;//默认私有,不可访问C2 c2;c2.m_A = 100; //默认公共,可以访问system("pause");return 0;
}

 2.1.3成员属性设置为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限

优点2:对于写权限,可以检测数据的有效性

#include<iostream>
#include<string>
using namespace std;class Person {
private:string m_name;//姓名,可读可写int m_age;//年龄,可读可写string m_pet;//宠物,只写
public://设置姓名void setName(string name) {m_name = name;}//获取姓名string getName() {return m_name;}//设置年龄void setAge(int age) {if (age < 0 || age > 150) {m_age = 0;cout << "输入错误!" << endl;return;}m_age = age;}//获取年龄int getAge() {//m_age = 0;return m_age;}//设置宠物void setPet(string pet) {m_pet = pet;}
};int main() {Person p1;p1.setName("张三");p1.setPet("哈哈");p1.setAge(10);cout <<"姓名为:"<< p1.getName() << endl;cout <<"年龄为:"<< p1.getAge() << endl;system("pause");return 0;
}

2.1.4封装案例

案例一:设计立方体类(Cube),求出立方体的面积和体积,分别用全局函数和成员函数判断两个立方体是否相等。

#include<iostream>
#include<string>
using namespace std;class Cube {
private:int m_L;//长int m_W;//宽int m_H;//高
public://设置长宽高void setL(int L) {m_L = L;}void setW(int W) {m_W = W;}void setH(int H) {m_H = H;}//获取长宽高int getL() {return m_L;}int getW() {return m_W;}int getH() {return m_H;}//获取立方体表面积double getS() {return ((m_L * m_W) + (m_L * m_H) + (m_W * m_H)) * 2;}//获取立方体体积double getV() {return m_L * m_W * m_H;}//通过成员函数,判断两个立方体是否相等bool isSameByClass(Cube &c) {if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH()) {return true;}return false;}
};//通过全局函数,判断两个立方体是否相等
bool isSame(Cube& c1, Cube& c2) {if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH()) {return true;}return false;
}int main() {Cube c1;c1.setL(2);c1.setW(2);c1.setH(2);cout <<"表面积为:"<< c1.getS() << endl;cout << "体积为:" << c1.getV() << endl;cout << "==============================" << endl;Cube c2;c2.setL(2);c2.setW(2);c2.setH(2);//全局函数判断bool ret1 = isSame(c1, c2);//成员函数判断bool ret2 = c1.isSameByClass(c2);if (ret1 && ret2) {cout << "c1与c2相等" << endl;}else {  cout << "c1与c2不相等" << endl;}system("pause");return 0;
}

案例二:点和圆 的关系 ,设计一个圆类(Circle),和一个点类(Point),计算点和圆的关系。

分文件编写

point.h

#pragma once
#include <iostream>
using namespace std;//点类
class Point {
private:int m_X;//x坐标int m_Y;//y坐标
public://设置获取X坐标void setX(int x);int getX();//设置获取Y坐标void setY(int y);int getY();
};

point.cpp

#include "point.h"//设置获取X坐标
void Point::setX(int x) {m_X = x;
}
int Point::getX() {return m_X;
}
//设置获取Y坐标
void Point::setY(int y) {m_Y = y;
}
int Point::getY() {return m_Y;
}

circle.h

#pragma once
#include <iostream>
#include "point.h"
using namespace std;//圆类
class Circle {
private:int m_R;//半径Point m_Center;//圆心public://设置获取半径void setR(int r);int getR();//设置获取圆心void setCenter(Point center);Point getCenter();};

circle.cpp

#include "circle.h"//设置获取半径
void Circle::setR(int r) {m_R = r;
}
int Circle::getR() {return m_R;
}
//设置获取圆心
void Circle::setCenter(Point center) {m_Center = center;
}
Point Circle::getCenter() {return m_Center;
}

main.cpp

 #include<iostream>
#include<string>
#include "point.h"
#include "circle.h"
using namespace std;点类
//class Point {
//private:
//	int m_X;//x坐标
//	int m_Y;//y坐标
//public:
//	//设置获取X坐标
//	void setX(int x) {
//		m_X = x;
//	}
//	int getX() {
//		return m_X;
//	}
//	//设置获取Y坐标
//	void setY(int y) {
//		m_Y = y;
//	}
//	int getY() {
//		return m_Y;
//	}
//};
//
圆类
//class Circle {
//private:
//	int m_R;//半径
//	Point m_Center;//圆心
//
//public:
//	//设置获取半径
//	void setR(int r) {
//		m_R = r;
//	}
//	int getR() {
//		return m_R;
//	}
//	//设置获取圆心
//	void setCenter(Point center) {
//		m_Center= center;
//	}
//	Point getCenter() {
//		return m_Center;
//	}
//
//};//判断圆和点的关系
void isInCircle(Circle& c, Point& p) {//计算两点之间距离的平方int distance = (c.getCenter().getX() - p.getX())* (c.getCenter().getX() - p.getX()) + (c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());//计算半径的平方int rDistance = c.getR() * c.getR();//判断if (distance == rDistance) {cout << "点在圆上" << endl;}else if (distance < rDistance) {cout << "点在圆内" << endl;}else {cout << "点在圆外" << endl;}
}int main() {//创建圆Circle c1;c1.setR(10);Point center;center.setX(10);center.setY(0);c1.setCenter(center);//创建点Point p1;p1.setX(10);p1.setY(9);isInCircle(c1, p1);system("pause");return 0;
}

 2.2对象的初始化和清理

2.2.1构造函数和析构函数

对象的初始化和清理是两个非常重要的安全问题

一个对象或者变量没有初始状态,其使用后果未知

使用完一个对象和变量,没有及时清理,也会造成安全问题

c++使用构造函数和析构函数解决上述问题,这两个函数被编译器自动调用,完成对象的初始化和清理工作

构造函数:主要作用于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用

析构函数:主要作用于对象销毁前系统自动调用,执行一些清理工作

构造函数语法:

类名(){}

1、构造函数没有返回值也不写void

2、函数名称与类名相同

3、构造函数可以有参数,因此可以发生重载

4、程序在调用对象时候会自动调用构造,无需手动调用,且只调用一次

析构函数语法:

~类名(){}

1、析构函数没有返回值也不写void

2、函数名称与类名相同,且在名称前加上符号~

3、析构函数不可以有参数,因此不可以发生重载

4、程序在对象销毁前会自动调用析构,无需手动调用,且只调用一次

#include<iostream>
#include<string>
using namespace std;class Person {
public://1、构造函数 进行初始化操作Person() {cout << "Person构造函数的调用" << endl;}//2、析构函数 进行清理操作~Person(){cout << "Person析构函数的调用" << endl;}
};//构造和析构都是必须要有的实现,如果自己不提供,编译器会提供一个空实现的构造和析构
void test01() {Person p;//栈上的数据,test01执行之后会释放这个对象
}int main() {test01();system("pause");return 0;
}

2.2.2构造函数的分类及调用

两种分类方式:

-按参数分为:有参构造和无参构造

-按类型分为:普通构造和拷贝构造

三种调用方式:

-括号法

-显示法

-隐式转换法

#include<iostream>
#include<string>
using namespace std;class Person {
public:int age;//1、构造函数 //按照参数分类:有参构造  无参构造(默认构造)//按类型分为:普通构造  拷贝构造//普通构造函数Person() {cout << "Person无参构造函数的调用" << endl;}Person(int a) {age = a;cout << "Person有参构造函数的调用" << endl;}//拷贝构造函数//将传入的对象身上的属性全部拷贝到自身上Person(const Person &p) {age = p.age;cout << "Person拷贝构造函数的调用" << endl;}//2、析构函数 进行清理操作~Person(){cout << "Person析构函数的调用" << endl;}
};//调用
void test01() {//1、括号法//Person p1;//无参调用//Person p2(10);//有参调用//Person p3(p2);//拷贝构造函数调用//cout << "p2的年龄为:" << p2.age << endl;//cout << "p3的年龄为:" << p3.age << endl;//注意事项:调用默认构造函数时不要加()//Person p1();//编译器会以为是函数的声明//2、显示法//Person p1;//无参调用//Person p2 = Person(10);//有参调用//Person p3 = Person(p2);//拷贝构造函数调用//Person(10);//匿名对象,当前执行结束后,系统立即回收匿名对象//注意事项:不要用拷贝构造函数初始化匿名对象//Person(p3);//编译器会转换为Person p3;对象的声明//3、隐式转换法Person p4 = 10;//相当于写了Person p4 = Person(10);Person p5 = p4;//拷贝构造函数}int main() {test01();system("pause");return 0;
}

 2.2.3拷贝构造函数调用时机

①使用一个已经创建完毕的对象来初始化一个新对象

②值传递的方式给函数参数传值

③以值方式返回局部对象

#include<iostream>
#include<string>
using namespace std;class Person {
public:int age;Person() {cout << "Person无参构造函数的调用" << endl;}Person(int a) {age = a;cout << "Person有参构造函数的调用" << endl;}//拷贝构造函数Person(const Person &p) {age = p.age;cout << "Person拷贝构造函数的调用" << endl;}//析构函数 进行清理操作~Person(){cout << "Person析构函数的调用" << endl;}
};//①使用一个已经创建完毕的对象来初始化一个新对象
void test01() {Person p1(10);Person p2(p1);cout << "p2的年龄:" << p2.age << endl;
}//②值传递的方式给函数参数传值
void doWork(Person p) {}
void test02() {Person p;doWork(p);
}//③以值方式返回局部对象
Person doWork2() {Person p1;return p1;
}
void test03() {Person p = doWork2();
}int main() {//test01();//test02();test03();system("pause");return 0;
}

2.2.4构造函数调用规则

默认情况下,c++编译器会至少给一个类添加3个函数

1.默认构造函数(无参,函数体为空)

2.默认析构函数(无参,函数体为空)

3.默认拷贝析构函数,对属性进行值拷贝

构造函数调用规则如下:

1、如果用户定义有参构造函数,则编译器不提供默认无参构造函数,但是会提供默认拷贝构造

2、如果用户定义拷贝构造函数,则编译器不提供其他构造函数

 2.2.5深拷贝和浅拷贝

浅拷贝:简单的赋值拷贝操作

深拷贝:在堆区重新申请空间,进行拷贝操作

浅拷贝的问题:堆区的数据被两次释放,非法 

解决方法:在堆区重新开辟一块空间,也就是深拷贝 

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

#include<iostream>
#include<string>
using namespace std;class Person {
public:int age;//年龄int* height;//身高Person() {cout << "Person无参构造函数的调用" << endl;}Person(int a,int h) {age = a;height = new int(h);cout << "Person有参构造函数的调用" << endl;}//自己实现拷贝构造函数,解决浅拷贝的问题Person(const Person& p) {cout << "Person拷贝构造函数的调用" << endl;age = p.age;//height = p.height;//编译器默认实现height = new int(*p.height);//深拷贝}//析构函数~Person() {//将堆区数据释放if (height != NULL) {delete height;height = NULL;}cout << "Person析构函数的调用" << endl;}
};void test01() {Person p1(18,183);cout << "p1的年龄为:" << p1.age << endl;cout << "p1的身高为:" << *p1.height << endl;Person p2(p1);cout << "p2的年龄为:" << p2.age << endl;cout << "p2的身高为:" << *p2.height << endl;}int main() {test01();system("pause");return 0;
}

2.2.6初始化列表

作用:C++提供了初始化列表语法,用来初始化属性

语法:构造函数():属性1(值1),属性2(值2),...{}

#include<iostream>
#include<string>
using namespace std;class Person {
public:int m_A;int m_B;int m_C;//传统初始化/*Person(int a,int b,int c) {m_A = a;m_B = b;m_C = c;cout << "Person有参构造函数的调用" << endl;}*///初始化列表/*Person() :m_A(10), m_B(20), m_C(30) {}*/Person(int a,int b,int c) :m_A(a), m_B(b), m_C(c) {}
};void test01() {//Person p1(1,3,2);//Person p1;Person p1(2,3,4);cout << "m_A为:" << p1.m_A << endl;cout << "m_B为:" << p1.m_B << endl;cout << "m_C为:" << p1.m_C << endl;}int main() {test01();system("pause");return 0;
}

2.2.7类对象作为类成员

C++类中的成员可以是另一个类的对象,此成员称为对象成员

#include<iostream>
#include<string>
using namespace std;class Phone {
public:string m_Pname;//品牌Phone(string pname){m_Pname = pname;}
};class Person {
public:string m_Name;//姓名Phone m_Phone;//手机//隐式 Person m_Phone = pName;Person(string name, string pname) :m_Name(name), m_Phone(pname) {}};void test01() {Person p("张三", "苹果15PROMAX");cout << p.m_Name << "拿着" << p.m_Phone.m_Pname << endl;
}int main() {test01();system("pause");return 0;
}

先有手机的构造,再有人的构造

先有人的析构,再有手机的析构

2.2.8静态成员

静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员。

静态成员分为:

①静态成员变量
-所有对象共享同一份数据

-在编译阶段分配内存

-类内声明,类外初始化

#include<iostream>
#include<string>
using namespace std;class Person {
public:static int m_A;	
private:static int m_B;
};
int Person::m_A = 100;//类外声明
int Person::m_B = 200;//共享数据
void test01() {Person p1;cout << p1.m_A << endl;Person p2;p2.m_A = 200;cout << p1.m_A << endl;//cout << p1.m_B << endl;//私有,类外无法访问
}//两种访问方式
void test02() {//1.通过对象访问Person p1;cout << p1.m_A << endl;//2.通过类名访问cout << Person::m_A << endl;
}int main() {//test01();test02();system("pause");return 0;
}

②静态成员函数

-所有对象共享同一个函数

-静态成员函数只能访问静态成员变量

#include<iostream>
#include<string>
using namespace std;class Person {
public://静态成员函数static void func() {m_A = 100;//静态成员函数可以访问静态成员变量//m_B = 99;//静态成员函数不可以访问非静态成员变量cout << "静态成员函数调用" << endl;}static int m_A;//静态成员变量int m_B;//非静态成员变量//静态成员函数也是有访问权限的
private:static void func2() {}
};
int Person::m_A = 0;void test01() {//1.通过对象调用Person p1;p1.func();Person p2;p2.func();//2.通过类名调用Person::func();//Person::func2();//权限问题,不可访问
}int main() {test01();system("pause");return 0;
}

2.3C++对象模型和this指针

2.3.1成员变量和成员函数分开存储

C++中,成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上面

#include<iostream>
#include<string>
using namespace std;class Person {int m_A;static int m_B;//静态成员变量不属于类的对象上void func(){}//非静态成员函数不属于类的对象上
};
int Person::m_B = 100;void test01() {Person p;//空对象占用的内存空间   //为了区分空对象占内存的位置//每个空对象会有一个独一无二的内存地址cout << "size of p = " << sizeof(p) << endl;//1 字节
}void test02() {Person p;cout << "size of p = " << sizeof(p) << endl;//4 字节
}//静态成员变量不属于类的对象上
void test03() {Person p;cout << "size of p = " << sizeof(p) << endl;//4 字节
}int main() {//test01();//test02();test03();system("pause");return 0;
}

2.3.2this指针

this指针指向被调用的成员函数所属的对象

用途:

①当形参和成员变量同名时,可用this来区分

②在类的非静态成员函数中返回对象本身,可用return *this;

未完待续。。。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

van-uploader 在app内嵌的webview中的一些坑

问题&#xff1a; 部分版本在ios 中没有问题&#xff0c;但是安卓中不触发图片选择和拍照&#xff08;之前是可以的&#xff0c;可能是没有锁定版本&#xff0c;重新发版导致的&#xff09;。在ios中下拉文案是英文&#xff0c;html配置lang等于 zh 也没有用&#xff0c;ios里…

Learn SRP 02

3.Editor Rendering 3.1Drawing Legacy Shaders 因为我们的管线只支持无光照的着色过程&#xff0c;使用其他不同的着色过程的对象是不能被渲染的&#xff0c;他们被标记为不可见。尽管这是正确的&#xff0c;但是它还是隐藏了场景中一些使用错误着色器的对象。所以让我们来渲…

libftdi1学习笔记 5 - SPI Nor Flash

目录 1. 初始化 2. CS控制例子 3. 读ID 3.1 制造商 3.2 容量大小 3.3 设置IO类型 3.3.1 setQSPIWinbond 3.3.2 setQSPIMxic 3.3.3 setQSPIMicrochip 3.3.4 setQSPIMicron 4. 写保护 5. 等待空闲 6. 擦除扇区 7. 页编程 8. 页读 9. 写 10. 读 11. 验证 基于M…

Postman之版本信息查看

Postman之版本信息查看 一、为何需要查看版本信息&#xff1f;二、查看Postman的版本信息的步骤 一、为何需要查看版本信息&#xff1f; 不同的版本之间可能存在功能和界面的差异。 二、查看Postman的版本信息的步骤 1、打开 Postman 2、打开设置项 点击页面右上角的 “Set…

Xshell无法输入命令输入命令卡顿

Xshell是一款功能强大的终端模拟软件&#xff0c;可以让用户通过SSH、Telnet、Rlogin、SFTP等协议远程连接到Linux、Unix、Windows等服务器。然而&#xff0c;在使用Xshell的过程中&#xff0c;我们可能会遇到一些问题。比如输入不了命令&#xff0c;或者输入命令很卡。这些问题…

content-type对数据采集的影响,猿人学58题

在拿猿人学网站 https://www.python-spider.com/api/challenge58 练习的时候发现请求头中少了 content-type之后结果全部不对了 当我设置headers如下时 headers {# accept: application/json, text/javascript, */*; q0.01,content-type: application/x-www-form-urlencode…

445. 两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。 示例1&#xff1a; 输入&#xff1a;l1 [7,2,4,3], l2 [5,6,4]…

2024腾讯一道笔试题--大小写字母移动

题目&#x1f357; 有一个字符数组,其中只有大写字母和小写字母,将小写字母移到前面, 大写字符移到后面,保持小写字母本身的顺序不变,大写字母本身的顺序不变, 注意,不要分配新的数组.(如:wCelOlME,变为wellCOME). 思路分析&#x1f357; 类似于冒泡排序&#xff0c;两两比较…

基于SpringBoot+Vue的疾病防控系统设计与实现(源码+文档+包运行)

一.系统概述 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对疾病防控信息管理的提升&a…

snort安装和使用

win10 x64安装snort 下载snort https://www.snort.org/downloads 下载npcap 0.9984版本 https://npcap.com/dist/ 安装npcap ,snort 安装成功 如果使用npcap版本不对或者使用winpcap会出现错误,winpcap不在win10运行。 snort.conf #-----------------------------------…

多ip证书实现多个ip地址https加密

在互联网快速发展的现在&#xff0c;很多用户会使用由正规数字证书颁发机构颁发的数字证书&#xff0c;其中IP数字证书就是只有公网IP地址网站的用户用来维护网站安全的手段。由于域名网站比较方便记忆&#xff0c;只有公网IP地址的网站是很少的&#xff0c;相应的IP数字证书产…

Python 入门指南(一)

原文&#xff1a;zh.annas-archive.org/md5/97bc15629f1b51a0671040c56db61b92 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 这个学习路径帮助你在 Python 的世界中感到舒适。它从对 Python 的全面和实用的介绍开始。你将很快开始在学习路径的第一部分编写程序…

5. Mysql的binlog介绍

参考&#xff1a;InnoDB学习&#xff08;三&#xff09;之BinLog 1. BinLog介绍 BinLog又称为二进制日志&#xff0c;是MySQL服务层的数据日志&#xff0c;MySQL所有的存储引擎都支持BinLog。 BinLog记录了MySQL中的数据更新和可能导致数据更新的事件&#xff0c;可以用于主从…

逆向案例二十七——某笔网登录接口非对称加密算法RSA,涉及全扣代码,浏览器断点调试,和补环境

网址&#xff1a;aHR0cHM6Ly93d3cuZmVuYmkuY29tL3BhZ2UvaG9tZQ 点击账号密码登录&#xff0c;找到登陆的包&#xff0c;发现password进行了加密。 顿时&#xff0c;老生常谈&#xff0c;开始搜索&#xff0c;找到最有嫌疑的加密代码。进行搜索&#xff0c;进入js文件后&#x…

HarmonyOS开发实例:【任务延时调度】

介绍 本示例使用[ohos.WorkSchedulerExtensionAbility] 、[ohos.net.http]、[ohos.notification] 、[ohos.bundle]、[ohos.fileio] 等接口&#xff0c;实现了设置后台任务、下载更新包 、保存更新包、发送通知 、安装更新包实现升级的功能。 效果预览 使用说明 安装本应用之…

OpenHarmony南向开发案例【智慧中控面板(基于 Bearpi-Micro)】

1 开发环境搭建 【从0开始搭建开发环境】【快速搭建开发环境】 参考鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或复制转到。 【注意】&#xff1a;快速上手教程第六步出拉取代码时需要修改代码仓库地址 在MobaXterm中输入…

vue3 vueUse 连接蓝牙

目录 vueuse安装&#xff1a; useBluetooth: 调用蓝牙API 扫描周期设备 选择设备配对 连接成功 vue3的网页项目连接电脑或者手机上的蓝牙设备&#xff0c;使用vueUse库&#xff0c;可以快速检查连接蓝牙设备。 vueUse库使用参考&#xff1a; VueUse工具库 常用api-CSDN…

Re65:读论文 GPT-3 Language Models are Few-Shot Learners

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名&#xff1a;Language Models are Few-Shot Learners ArXiv网址&#xff1a;https://arxiv.org/abs/2005.14165 2020 NeurIPS&#xff1a;https://papers.nips.cc/paper/2020/hash/1457c0d6bfcb49674…

组织机构代码是哪几位?营业执照怎么看组织机构代码?

组织机构代码是哪几位? 组织机构代码通常指的是组织机构代码证上的一组特定数字&#xff0c;它用于唯一标识一个组织或机构。在中国&#xff0c;组织机构代码由9位数字组成&#xff0c;前8位是本体代码&#xff0c;最后1位是校验码。这组代码是按照国家有关标准编制的&#x…

自定义鼠标软件 SteerMouse最新完整激活版

SteerMouse是一款实用的Mac OS X系统辅助工具&#xff0c;可以帮助用户自定义鼠标和触控板的设置&#xff0c;提高使用效率。它提供了多种功能&#xff0c;如自定义按钮、滚轮和光标速度&#xff0c;以及调整灵敏度等&#xff0c;使用户能够根据自己的需求和习惯进行优化。 Ste…