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

C++:函数

函数参数的传递机制

C++的每个程序至少有一个函数,即主函数main(),函数也是类的方法的实现手段。C++的函数包括两类:预定于函数和用户自定义函数

函数的定义格式为:

<返回值类型><函数名>(<参数列表>)

<函数体>

其中,<返回值类型>实值函数返回值的数据类型,可以是任意一种基本数据类型或用户自定义数据类型,以及类类型。<函数名>是给函数指定的名字,函数名应遵循标识符的命名规定。<参数列表>是指参数的个数、名称和类型,函数定义中的参数成为形参。<函数体>实值函数完成的功能,由说明语句和执行语句组成。

在C++语言中,函数的参数传递有三种方式:按变量值传递、按变量的地址传递和引用传递。C++语言可以用简单变量作为参数进行传递,也可以将对象作为参数传递给函数,其方法与传递其他类型的数据一样。

使用对象作为函数参数

对象作为函数参数时,其参数传递机制与其他类型的数据作为函数参数相同。在进行函数调用时,可将实参对象的值复制一份给对应的形参对象。因此,作为形参的对象,其数据的改变并不会影响实参对象。

实例

#include "iostream"
using namespace std;
class Point{
public:Point(int a, int b):x(a),y(b){}void Move(Point p){p.x = p.x + 1;p.y = p.y + 1;}void Print(){cout << "x:" << x << ", y:" << y << endl;}
private:int x, y;
};int main(){Point p1(1, 2);cout << "before move:";p1.Print();p1.Move(p1);cout << "after  move:";p1.Print();return 0;
}

运行结果:

before move:x:1, y:2
after  move:x:1, y:2

使用对象指针作为函数参数

在进行函数调用时,以对象指针作为参数,其实质是传地址调用,即参数与实参共享同一内存单元。因此,作为形参的对象,其数据的改变将影响实参对象,从而实现函数之间的信息传递。此外,使用对象指针作为参数仅将对象的地址传递给形参,而不进行副本的复制,可以提高运行效率,减少时空开销。

实例

#include "iostream"
using namespace std;
class Point{
public:Point(int a, int b):x(a),y(b){}void Move(Point *p){(*p).x = (*p).x + 1;//也可以写成p->x=p->x + 1(*p).y = (*p).y + 1;}void Print(){cout << "x:" << x << ", y:" << y << endl;}
private:int x, y;
};int main(){Point p1(1, 2);cout << "before move:";p1.Print();p1.Move(&p1);cout << "after  move:";p1.Print();return 0;
}

运行结果

before move:x:1, y:2
after  move:x:1, y:2

使用对象引用作为函数参数

用对象引用作为函数参数不但具有用对象指针作为函数参数的优点,而且相比之下,用对象引用作为函数参数可更简单、更直接。

实例

#include "iostream"
using namespace std;
class Point{
public:Point(int a, int b):x(a),y(b){}void Move(Point &p){p.x = p.x + 1;p.y = p.y + 1;}void Print(){cout << "x:" << x << ", y:" << y << endl;}
private:int x, y;
};int main(){Point p1(1, 2);cout << "before move:";p1.Print();p1.Move(p1);cout << "after  move:";p1.Print();return 0;
}

运行结果

before move:x:1, y:2
after  move:x:1, y:2

三种传递方式比较

  1. 适用对象作为函数参数。当进行函数调用时,需要给形参分配存储单元,形参和实参的结合是值传递,实参将自己的值传递给形参,形参实际上是实参的副本。这是一种单向传递,形参的变化不会影响到实参。
  2. 使用指针作为函数参数。当进行函数调用时,需要给形参分配存储单元,形参和实参的结合是地址传递,实参将自己的地址传递给形参。这是一种双向传递,形参的变化会直接影响带实参。缺点是阅读性较差。
  3. 使用引用作为函数参数。当进行函数调用时,在内存中并没有产生实参的副本,它是直接对实参操作。这种方式是双向传递,形参的变化会直接影响到实参。与指针作为函数参数相比,它更容易使用、更清晰。当参数传递的数据较大时,用引用比一般变量传递参数的效率要高,所占用空间更少。

内联函数

在程序设计中,效率是一个很重要的指标。在C语言中,保护效率的一个方法是使用宏(Macro)。宏可以不用函数调用,但看起来像函数调用。宏是用预处理器来实现的。预处理器直接用宏代码代替宏调用,因此就不需要函数调用所需的保存调用时的现场状态和返回地址、进行参数传递等的时间花费。然而C++的预处理器不允许存取私有数据,这意味着预处理器宏在用作成员函数时变得非常无用。为了既保持预处理器宏的效率又增加安全性,而且还能像一般成员函数一样可以在类里访问自如,C++引入了内联函数(Inline Function)。内联函数时一个函数,它与一般函数的区别是,在使用时可以像宏一样展开,所以没有函数调用的开销。因此,使用内联函数可以提高系统的执行效率。但在内联函数体中,不能含有复杂的结构控制语句,如语句switch和while等。内联函数实际是一种空间换时间的方案,因此其缺点是增大了系统空间方面的开销。在类内给出函数体定义的成员函数被默认为内联函数。

内联函数的定义格式为:inline 返回值类型 函数名(形式参数表){//函数体}

例如:大小写字母转换

#include "iostream"
using namespace std;
inline char Trans(char ch){if(ch >= 'a' && ch <= 'z') return ch - 32;else return ch + 32;
}int main(){char ch;while((ch = getchar()) != '\n')cout << Trans(ch);cout << endl;return 0;
}

【注】

  1. 内联函数代码不宜太长,一般是1~5行代码,而且不能含有复杂的分支或循环语句等。
  2. 在类内定义的成员函数默认为内联函数。
  3. 在类外给出函数体的成员函数,若要定义为内联函数,则必须加上关键字inline。否则,编译器将它作为普通成员函数。
  4. 递归调用的函数不能定义为内联函数。

函数重载

函数名可以看作一个操作的名字。当多个函数实现的是同一类功能,只是部分细节不同(如参数的个数或参数类型不同)时,C++提供了函数重载机制,即将这些函数取成相同的名字,从而时程序已于阅读和理解,方便记忆和使用。

函数重载实质两个或两个以上的函数具有相同的函数名,但其参数类型不一致或参数个数不同。函数重载包括非成员函数的重载和成员函数重载。

非成员函数重载

非成员函数重载是指对用户所编写的那些功能相同或类似、参数个数或类型不同的用户自定义函数,C++可以采用相同的函数名,从而提高程序的可读性。支持函数重载时C++多态性的体现之一。

例如:求两个数的积

#include "iostream"
using namespace std;
int Mul(int x, int y){return x * y;
}
double Mul(double x, double y){return x * y;
}int main(){int x, y;double a, b;cout << "input x, y:";cin >> x >> y;cout << "x*y=" << Mul(x, y) << endl;cout << "input a, b:";cin >> a >> b;cout << "a*b=" << Mul(a, b) << endl;return 0;
}

【注】

  1. 重载函数必须具有不同的参数个数或不同的参数类型,若只是返回值的类型不同或参数名不同时不行的。

  2. 重载函数应满足:函数名相同,函数的返回值类型可以相同也可以不同,当各函数的参数表中的参数个数或类型必须有所不同,这样才能进行区分,从而正确地调用函数。

  3. 匹配重载函数的顺序:a.通过内部类型转换寻求一个匹配,若找到,则调用该函数;b.通过强制类型转换寻求一个匹配,若找到,则调用函数。

  4. 不能将不同功能的函数定义为重载函数,以免产生误解。

  5. 创建重载函数时,必须让编译器能区分两个(或更多)的重载函数。当创建的多个重载函数编译器不能区分时,编译器就认为这些函数具有多义性,即调用是错误的,编译器不会编译该程序。例如:

    #include "iostream"
    using namespace std;
    float Mul(float x){return 2 * x;
    }
    double Mul(double x){return 2 * x;
    }int main(){cout << Mul(10.2) << endl;cout << Mul(10) << endl;//错误。产生二义性return 0;
    }
    

    报错

    error: call of overloaded 'Mul(int)' is ambiguous400 |     cout << Mul(10) << endl;//错误。产生二义性
    |             ~~~^~~~note: candidate: 'float Mul(float)'391 | float Mul(float x){|       ^~~note: candidate: 'double Mul(double)'394 | double Mul(double x){|        ^~~
    
  6. 当函数的重载带有默认参数值时,要避免产生二义性。

成员函数重载

成员函数重载主要是为了适应相同成员函数的参数多样性。成员函数重载的一个很重要的应用就是重载构造函数。因为构造函数的名字预先有类的名字确定,所以只能有一个构造函数名。但在解决实际问题时,可能会需要创建具有不同形态的对象,因此,C++提供了函数重载机制。通过对构造函数进行重载,可以实现定义对象时初始化赋值的多样性。但是析构函数不能重载,因为一个类中只允许有且仅有一个析构函数。

例如:求了两个复数的和

#include "iostream"
using namespace std;
class Complex{
public:Complex(double r, double i):real(r),imag(i){}Complex(double r):real(r),imag(0){}Complex():real(0),imag(0){}Complex Add(Complex a){Complex temp;temp.real = real + a.real;temp.imag = imag + a.imag;return temp;}void Print(){cout << real;if(imag > 0) cout << "+";if(imag != 0) cout << imag << "i" << endl;}
private:double real, imag;
};int main(){Complex com1(1.1, 2.2), com2(3.3, 4.4), com3(5.5), total;total = com1.Add(com2);total.Print();total = com1.Add(com3);total.Print();return 0;
}

运行结果:

4.4+6.6i
6.6+2.2i

函数的默认参数值

  1. 当函数既有声明和定义时,默认参数值只能在声明中指定,不能再函数定义中指定。

    void Fun(int x = 0, int y = 0);//正确,在函数声明中指定默认参数值
    void Fun(int x = 0, int y = 0){ // ....} //错误,不能再函数定义中指定默认参数值
    
  2. 在函数声明中,所有带默认值的参数都必须出现再没有默认值参数的右边。也就是说,一旦开始定义带默认值的参数,在其后面就不能再定义没有默认值的参数了。例如:

    void Fun(int i, int j = 0, int k); //错误
    
  3. 在函数调用时,若某个参数省略,则其后面的参数皆应省略而采用默认参数值。例如:

    Fun(,9);//错误的调用
    
  4. 当重载函数带有默认参数值时,要注意避免二义性。

友元

类的主要特点之一是数据隐藏,类的私有成员或保护成员只能通过其成员函数来访问。那么有没有办法允许再类外对某个对象的私有成员或保护成员进行操作?C++中提供了友元机制来解决这个问题。

友元函数

友元函数不是当前类中的成员函数,它不仅可以是一个不属于任何一个类的一般函数(非成员函数),也可以是另外一个类的成员函数。当函数被声明为一个类的友元函数后,它就可以通过对象名访问类的私有成员和保护成员。

非成员函数作为友元函数

非成员函数作为类的友元函数后,就可以通过对象访问封装再类内部的数据。声明友元函数的方法是,在类的定义中用关键字friend进行声明,格式为:friend 函数返回值 函数名(形参表);

例如:使用友元函数将百分制学生的成绩转换成相应的分数等级。

#include "iostream"
#include "iomanip"
#include "cstring"using namespace std;
class Student{
public:Student(char na[], int sco){strcpy_s(name, strlen(na) + 1, na);score = sco;}friend void Trans(Student *s){if (s->score >= 90) strcpy_s(s->level, strlen("优") + 1, "优");else if(s->score >= 80) strcpy_s(s->level, strlen("良") + 1,"良");else if(s->score >= 70) strcpy_s(s->level, strlen("中") + 1,"中");else if(s->score >= 60) strcpy_s(s->level, strlen("及格") + 1,"及格");else  strcpy_s(s->level, strlen("不及格") + 1,"不及格");}void Print(){cout << name << setw(10) << score << setw(8) << level << endl;}
private:char name[10];int score;char level[7];
};int main(){Student stu[] = {Student("李明", 76), Student("李华", 82), Student("王明", 96), Student("星星", 52)};cout << "输出结果:" << endl;cout << "姓名" << setw(10) << "成绩" << setw(8) << "等级" << endl;for(int i = 0; i< 4; i++){Trans(&stu[i]);stu[i].Print();}return 0;
}

运行结果

输出结果:
姓名      成绩    等级
李明        76      中
李华        82      良
王明        96      优
星星        52  不及格

【注】

  1. 非成员函数成为类的友元函数后,若再类外定义,则不能再函数名前加”类名::“,因为他不是该类的成员函数;非成员函数作为类的友元函数没有this指针;调用友元函数时必须在其实参标中给出要访问的对象。

  2. 友元函数既可以在类的私有部分进行声明,也可以再类的公有部分进行声明。

  3. 当一个函数需要访问多个类时,应该把这个函数同时定义为这些类的友元函数,这样,该函数才能访问这些类的私有或保护成员,例如。

    #include "iostream"
    using namespace std;
    class Time;
    class Date{
    private:int year, month, day;
    public:Date(int y, int m, int d):year(y),month(m),day(d){}friend void Calcutetime(Date d, Time t);
    };
    class Time{
    private:int hour, minute, second;
    public:Time(int h, int m, int s):hour(h),minute(m),second(s){}friend void Calcutetime(Date d, Time t);
    };
    void Calcutetime(Date d, Time t){int mom[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int days = d.day, total;for(int i = 1; i < d.month; i++){days = days + mom[i - 1];}if((d.year % 4 == 0 && d.year % 100 != 0 || d.year % 400 == 0) && d.month >= 3) days = days + 1;total = ((days * 24 + t.hour) * 60 + t.minute) * 60 + t.second;cout << d.year << "-" << d.month << "-" << d.day << "    ";cout << t.hour << ":" << t.minute << ":" << t.second << endl;cout << "total time:   " << total << "   seconds" << endl;
    }
    int main(){Date d(2018, 11, 13);Time t(14, 20, 25);Calcutetime(d, t);return 0;
    }
    
  4. 若友元函数带了两个不同的类的对象,其中一个对象所对应的类要在后面声明。

类的成员函数作为友元函数

一个类的成员函数可以作为另一个类的友元函数,这种成员函数不仅可以访问自己所在类中的成员,还可以通过对象名访问friend声明语句所在类的私有成员和保护成员,从而使两个类相互合作。

#include "iostream"
using namespace std;
class Time;
class Date{
private:int year, month, day;
public:Date(int y, int m, int d):year(y),month(m),day(d){}void Calcutetime(Time t);
};
class Time{
private:int hour, minute, second;
public:Time(int h, int m, int s):hour(h),minute(m),second(s){}friend void Date::Calcutetime(Time t);
};
void Date::Calcutetime(Time t){int mom[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int days = day, total;for(int i = 1; i < month; i++){days = days + mom[i - 1];}if((year % 4 == 0 && year % 100 != 0 || year % 400 == 0) && month >= 3) days = days + 1;total = ((days * 24 + t.hour) * 60 + t.minute) * 60 + t.second;cout << year << "-" << month << "-" << day << "    ";cout << t.hour << ":" << t.minute << ":" << t.second << endl;cout << "total time:   " << total << "   seconds" << endl;
}
int main(){Date d(2018, 11, 13);Time t(14, 20, 25);d.Calcutetime(t);return 0;
}

友元类

友元函数可以使函数能够访问某个类中的私有或保护成员。若类A的所有成员函数都想访问类B的私有或保护成员,一种方法使将类A的所有成员函数都声明为类B的友元函数,但这样会让程序显得冗余。为此,C++提供了友元类。一个类也可以作为另一个类的友元类。若类A声明为类B的友元类,则类A中的每个成员函数都具有访问类B的保护或私有数据成员的特权,方法如下:

class A{//.....void fa();
};
class B{//.....friend class A;
};

例如:将一个复数转换为二维向量

#include "iostream"
using namespace std;
class Complex{
private:double real, imag;
public:Complex(double r, double i):real(r),imag(i){}friend class Vector;
};
class Vector{
private:double x, y;
public:void Change(Complex c){x = c.real;y = c.imag;}void Print(Complex c){cout << "复数:" << c.real;if(c.imag > 0) cout << "+";cout << c.imag << "i" << endl;cout << "二维向量:" << "(" << x << "," << y << ")" << endl;}
};
int main(){Complex c(1.2, 3.4);Vector v;v.Change(c);v.Print(c);return 0;
}

【注】:友元关系是单向的。若类A是类B的友元,则类A中的所有成员函数都可以直接访问类B的保护或私有数据成员。但反过来,类B中的所有成员函数不能访问类A中的保护和私有成员。友元关系不能进行传递。友元在声明时即可以放在类的私有部分,也可以放在类的公有部分。

静态成员

C++允许在函数内部创建一个static对象,这个对象将存储在程序的静态数据区中,而不是在堆栈中,它只在函数第一次调用时初始化一次,以后将在两次函数之间保持其值。

静态数据成员

当声明一个类后,考研建立该类的多个对象,每个对象都有类中所定义数据成员的拷贝,对应不同的存储空间,各个对象相互独立,实现了数据的封装与隐藏。但在有些情况下,类中的某个数据成员是该类所有对象所共有的,若采用数据成员的定义方法,则不能实现数据成员的共享。C++为此提供了静态数据成员,类的静态数据成员拥有一块单独的存储区,不管用户创建了多少个对象,所有这些对象的静态数据成员都共享这块静态存储区,进而为这些对象提供了一种互相通信的方法。

静态数据成员的定义格式为:static 类型名 静态成员名;

静态数据成员的初始化格式:类型 类名::静态数据成员=初始化值;

例如

#include "iostream"
#include "iomanip"
#include "cstring"using namespace std;
class Student{
private:char *name;int no;float score;static int total;//定义静态数据成员
public:Student(char *na, int sno, float sco):no(sno),score(sco){name = new char(strlen(na) + 1);strcpy_s(name, strlen(na) + 1, na);total++;}~Student(){delete []name;}void Print(){cout << "第" << total << "个学生:" << name << setw(4) << no << setw(4) << score << endl;cout << "总学生人数:" << total << endl;}
};
int Student::total = 0;//初始化静态数据成员
int main(){Student s1("张明", 1, 90);s1.Print();Student s2("张三", 2, 85);s2.Print();return 0;
}

运行结果:

1个学生:张明   1  90
总学生人数:12个学生:张三   2  85
总学生人数:2

【注】

  1. 静态数据成员的声明需加关键字static,访问格式:类名::静态数据成员名
  2. 静态数据成员的初始化应在类外生命并在对象生成之前进行。默认时,静态成员被初始化为零。
  3. 静态数据成员在编译时创建并初始化,不能用构造函数进行初始化。静态数据成员不能再任何函数内分配存储空间和初始化。

静态成员函数

与静态数据成员一样,用户也可以创建静态成员函数,静态成员函数不能访问一般的数据成员和成员函数,它只能访问静态数据成员和其他的静态成员函数。静态成员函数时独立于类对象而存在的,因此没有this指针。

静态成员函数的定义格式为:static 返回类型 静态成员函数名(参数表);

调用格式为:类名::静态成员函数名(实参表);

静态对象

在定义对象时,可以定义类的静态对象,静态对象的析构函数是在主函数结束时才自动执行的,与普通对象相同,静态对象的析构函数和构造函数的执行顺序相反。

静态对象定义格式:static 类名 静态对象名;

例如:

#include "iostream"
#include "iomanip"
#include "cstring"using namespace std;
class Student{
private:char name[10];
public:Student(char na[]){strcpy_s(name, strlen(na) + 1, na);cout << "inside construct:" << name << endl;}~Student(){cout << "inside destruct:" << name << endl;}
};
void Fun(){static Student s2("Student B");Student s3("Student C");
}
Student s1("Student A");
int main(){cout << "inside main" << endl;Fun();Fun();cout << "outside main" << endl;return 0;
}

运行结果:

inside construct:Student A
inside main
inside construct:Student B
inside construct:Student C
inside destruct:Student C
inside construct:Student C
inside destruct:Student C
outside main
inside destruct:Student B
inside destruct:Student A

相关文章:

C++:函数

函数参数的传递机制 C的每个程序至少有一个函数&#xff0c;即主函数main()&#xff0c;函数也是类的方法的实现手段。C的函数包括两类&#xff1a;预定于函数和用户自定义函数。 函数的定义格式为&#xff1a; <返回值类型><函数名>(<参数列表>) <函…...

Linux网络编程:libevent事件通知库

文章目录&#xff1a; 一&#xff1a;libevent库 二&#xff1a;libevent框架 1.常规事件event 1.1 创建事件event&#xff08;event_new&#xff09; 1.2 添加事件到 event_base&#xff08;event_add&#xff09; 1.3 从event_base上摘下事件&#xff08;event_del&a…...

java.lang.reflect.InvocationTargetException:null报未知异常

在项目上线过程中&#xff0c;突然出现大量异常信息&#xff0c;堆栈信息如下&#xff1a; java.lang.reflect.InvocationTargetException: null at jdk .internal.reflect.GeneratedMethodAccessor792 .invoke(Unknown Source) ~[?:?] at jdk.internal.reflect.DelegatingM…...

MySQL高级篇——MySQL架构篇1(Linux下MySQL8的安装与使用)

目录 0 安装前0.1 Linux系统及工具的准备0.2 查看是否安装过MySQL0.3 MySQL的卸载 1 MySQL8的Linux版安装1.1 MySQL的4大版本1.2 下载MySQL指定版本1.3 CentOS7下检查MySQL依赖1.4 CentOS7下MySQL安装过程 2 MySQL登录2.1 首次登录2.2 修改密码2.3 设置远程登录 3 MySQL 8 的密…...

解决 go mod tidy 加载模块超时

如果go mod tidy 加载模块超时 解决方法 修改GOPROXY: 查看go环境相关信息&#xff1a; go envgo env -w GOPROXYhttps://goproxy.cn...

金融市场中的机器学习;快手推出自研语言模型“快意”

&#x1f989; AI新闻 &#x1f680; OpenAI可能面临《纽约时报》的起诉&#xff0c;侵犯知识产权引发争议 摘要&#xff1a;OpenAI使用《纽约时报》的文章和图片来训练AI模型&#xff0c;违反了《纽约时报》的服务条款&#xff0c;可能面临巨大损失。此前&#xff0c;也有其…...

【面试刷题】——什么是深拷贝和浅拷贝?

深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是在编程中用来描述对象拷贝的两个概念&#xff0c;特别是在涉及对象包含其他对象&#xff08;如嵌套数据结构、指针等&#xff09;的情况下。 浅拷贝&#xff08;Shallow Copy&#xff…...

物联网(IoT)安全挑战与解决方案: 分析物联网设备面临的安全威胁,以及如何设计和管理安全的IoT生态系统

第一章&#xff1a;引言 随着科技的飞速发展&#xff0c;物联网&#xff08;IoT&#xff09;作为连接世界的桥梁&#xff0c;已经成为现代社会不可或缺的一部分。然而&#xff0c;随着IoT设备数量的不断增加&#xff0c;其安全问题也日益显著。本文将深入探讨IoT领域面临的安全…...

Ubuntu 22.04.3 LTS 维护更新发布

近日消息&#xff0c;Canonical 今天发布了代号为 Jammy Jellyfish、长期支持的 Ubuntu 22.04 第 3 个维护版本更新&#xff0c;距离上个版本相隔 6 周时间。 Ubuntu 22.04.3 LTS 最大的亮点在于内核升级到 Linux Kernel 6.2&#xff0c;此外 Mesa 图形堆栈也升级到 23.0.4 版…...

平安健康,找到了医疗服务的价值密码

健康是人类的永恒需求&#xff0c;围绕医疗和健康服务衍生的产业&#xff0c;却苦于无法和用户建立足够紧密、长期的联系。由此&#xff0c;也不得不面临价值从何而来的问题。 作为医疗服务领域的代表性企业&#xff0c;平安健康医疗科技有限公司&#xff08;股票简称“平安好…...

❤ vue 使用原生组件

❤ vue 使用原生组件 1、做一个input输入框验证开始 ① 想让我们的input输入框类型为时间&#xff0c;只需要为我们的输入框简单的加一个类型的type即可 <input type"date" id"birthday" name"birthday" placeholder"年/月/日"&…...

4.12 TCP 连接,一端断电和进程崩溃有什么区别?

目录 TCP keepalive TCP 的保活机制 主机崩溃 进程崩溃 有数据传输的场景 客户端主机宕机&#xff0c;又迅速重启 客户端主机宕机&#xff0c;一直没有重启 TCP连接服务器宕机和进程退出情况总结 TCP keepalive TCP 的保活机制 TCP 保活机制需要通过 socket 接口设置 S…...

十二、pikachu之URL重定向

文章目录 1、URL重定向概述2、实战3、URL跳转的几种方式:3.1 META标签内跳转3.2 javascript跳转3.3 header头跳转 1、URL重定向概述 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的&#xff08;可能是用户传参&#xff0c;或者之前预埋…...

贝叶斯公式中的动词 命名技巧

一项血液化验有95%的把我诊断某种疾病&#xff0c;但是&#xff0c;这项化验用于健康人也会有1%的“伪阳性”结果(即如果一个健康人接受这项化验&#xff0c;则化验结果乌镇此人患有该疾病的概率是0.01)。如果该疾病的患者事实上只占总人口的0.5%&#xff0c;若某人化验结果为阳…...

ctfshow-web13 文件上传

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 首先看到是一个上传页面&#xff0c;测试其他无果&#xff0c;遂进行目录遍历&#xff0c;发现upload.php.bak文件 可以看到这里的限制条件&#xff0c;大小&#xff0c;以及内容&#xff0c;这里可以使用.use…...

Python项目开发案例————学生信息管理系统(附源码)

一、学生信息管理系统 本文使用Python语言开发了一个学生信息管理系统&#xff0c;该系统可以帮助教师快速录入学生的信息&#xff0c;并且对学生的信息进行基本的增、删、改、查操作&#xff1b;还可以实时地将学生的信息保存到磁盘文件中。 1.1 需求分析 为了顺应互联网时代…...

2023-08-25力扣每日一题

链接&#xff1a; 1448. 统计二叉树中好节点的数目 题意&#xff1a; 判断根节点到每个节点X的过程中&#xff0c;如果没有值大于X&#xff0c;则该节点为好节点&#xff0c;求好节点数量 解&#xff1a; 由于求根节点到其他节点的路径&#xff0c;则使用dfs算法&#xff…...

Vue3中的计算属性和属性监听

compute计算属性 Vue3中可以通过 compute进行监听计算属性&#xff0c;他返回的是一个ref的对象&#xff0c;也就是说 通过compuye这种方式计算属性实际上是进行了ref的操作 import { computed } from vue const user reactive({firstName: A,lastName: B }) // 只有getter的…...

微信开发之一键修改群公告的技术实现

简要描述&#xff1a; 设置群公告 请求URL&#xff1a; http://域名地址/setChatRoomAnnouncement 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必…...

【git】工作场景中常用的git命令

工作场景中常用的git命令 1. 必备改名改邮箱拉代码下来并且创建新分支git commit回滚某个文件删除分支 工作场景中常用的git命令&#xff0c;记录下来方便调取 1. 必备 改名改邮箱 一般与他人合作&#xff0c;至少你提交的名字得被人熟知或者遵循规范&#xff0c;因此需要更改…...

Vue路由(详解)

目录 路由原理 路由到底有什么作用&#xff1f; 路由安装和使用&#xff08;vue2&#xff09; 路由跳转 跳转实例&#xff1a; 路由的传值和取值 传值实例&#xff1a; 查询参和路由参的区别&#xff1a; 嵌套路由 嵌套实例&#xff1a; 路由守卫 守卫实例&#xff1…...

打开软件提示msvcp140.dll丢失的解决方法,msvcp140主要丢失原因

今天&#xff0c;我将为大家介绍一种非常常见的问题——msvcp140.dll丢失。这个问题可能会导致许多应用程序无法正常运行&#xff0c;甚至崩溃。但是&#xff0c;请不要担心&#xff0c;我会为大家提供5种解决方法&#xff0c;帮助大家轻松解决问题。 首先&#xff0c;我们来看…...

关于路由器和DNS解析的一些新理解

其实我本人对于交换机和路由器这些网络硬件是比较感兴趣的&#xff0c;也在一点一点的学习相关知识&#xff0c;每次解决一个问题&#xff0c;就让我对一些事情有新的思考。。 今天前台同事&#xff0c;的机器突然上不了网&#xff0c;&#xff0c;和领导一起去看了一波&#…...

vscode 与 C++

序 具体流程的话&#xff0c;官方文档里都有的&#xff1a;C programming with Visual Studio Code 浏览器下载一个mingw64&#xff0c;解压&#xff0c;配置环境变量vscode里安装c相关的插件没了 第一步只看文字&#xff0c;可能有点抽象&#xff0c;相关视频&#xff1a; …...

水果flstudio好用吗?中文版FL21最新版本如何下载

FL Studio21版是一款功能强大的音乐制作软件&#xff0c;广泛应用于电子音乐、流行音乐、电影配乐等领域。它提供了丰富多样的音频合成和编辑工具&#xff0c;使音乐制作变得更加灵活多样。无论是初学者还是专业音乐制作人&#xff0c;都可以通过直观的界面和丰富的音频特效来实…...

PHP is_array()函数详解,PHP判断是否为数组

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 is_array 一、基本使用二、空数组三、同时判断多个…...

面试题-React(三):什么是JSX?它与常规JavaScript有什么不同?

在React的世界中&#xff0c;JSX是一项引人注目的技术&#xff0c;它允许开发者在JavaScript中嵌套类似HTML的标签&#xff0c;用于描述UI组件的结构。本篇博客将通过丰富的代码示例&#xff0c;深入探索JSX语法&#xff0c;解析其在React中的用法和优势。 一、JSX基础语法 在…...

纯前端实现图片上传七牛云

首先安装下依赖&#xff1a; npm install qiniu-js crypto-js 然后封装一下 uploaderHelper.ts import * as qiniu from qiniu-js; // ts-ignore import CryptoJS from crypto-js// 请求接口上传图片 export function uploadFile(file: File) {const uptoken getToken(你的…...

win10+wsl2+Ubuntu20.2+Pycharm+WSL解释器

目的&#xff1a;创建一个ubuntu系统下的python解释器&#xff0c;作为win平台下的pycharm的解释器。 这样做的好处是可以直接在win系统里操作文件&#xff0c;相比于linux方便一点&#xff0c;而且也不用对wsl的子系统进行迁移。 一、安装前准备 1. 设置-Windows更新-window…...

EL与JSTL

目录 EL EL语法 EL运算符 JSTL JSTL标签分类 JSP脚本&#xff1a;代码结构混乱、脚本与HTML 混合易出错、代码不易维护。 EL表达式&#xff1a;优化程序代码&#xff0c;增加程序可读性。 EL EL语法 EL表达式 ${ EL 表达式 } EL操作符 操作符“ . ” 获取对象的属性&a…...

【Linux】动态库和静态库

动态库和静态库 软链接硬链接硬链接要注意 自定义实现一个静态库(.a)解决、使用方法静态库的内部加载过程 自定义实现一个动态库&#xff08;.so&#xff09;动态库加载过程 静态库和动态库的特点 软链接 命令:ln -s 源文件名 目标文件名 软链接是独立连接文件的&#xff0c;他…...

R语言:联合多指标的ROC曲线

# 加载数据和包rm(list=ls())library(pROC)library(ggplot2)setwd("C:/Users/syy/Desktop/MRI_lab/")data<- read.csv("test1.csv", header = T)data$Groups...

将一个树形结构的数据平铺成一个一维数组(vue3)

一、需求描述 由于自带组件库没有具体完善,无法实现像element-ui这种可以多选选择任意一级的选项,也就是说,选择父级的时候不会联动选择子级的全部 例如: 所以,才会出现【二、案例场景】类似的场景,可以用来多选 ,并可以实现单选父级而不关联子级,选择了将树状数据进…...

OSCS开源安全周报第 56 期:Apache Airflow Spark Provider 任意文件读取漏洞

本周安全态势综述 OSCS 社区共收录安全漏洞 3 个&#xff0c;公开漏洞值得关注的是 Apache NiFi 连接 URL 验证绕过漏洞(CVE-2023-40037)、PowerJob 未授权访问漏洞(CVE-2023-36106)、Apache Airflow Spark Provider 任意文件读取漏洞(CVE-2023-40272)。 针对 NPM 、PyPI 仓库…...

CleanMyMac2024永久版Mac清理工具

Mac电脑作为相对封闭的一个系统&#xff0c;它会中毒吗&#xff1f;如果有一天Mac电脑产生了疑似中毒或者遭到恶意不知名攻击的现象&#xff0c;那又应该如何从容应对呢&#xff1f;这些问题都是小编使用Mac系统一段时间后产生的疑惑&#xff0c;通过一番搜索研究&#xff0c;小…...

软考高级系统架构设计师(一)计算机硬件

【原文链接】软考高级系统架构设计师&#xff08;一&#xff09;计算机硬件 1.1 计算机硬件组成 1.1.1 计算机的基本硬件组成 运算器控制器存储器输入设备输出设备 1.1.2 中央处理单元&#xff08;CPU&#xff09; 中央处理单元&#xff08;CPU&#xff09;的组成 运算器…...

bat文件中自定义cmd命令;执行完退出命令提示符窗口

1. bat中启动cmd命令 start cmd /k " cmd中命令行里自定义的命令 " 2.编写规则 start cmd /k "命令1 & 命令2 & 命令3" (无论前面命令是否成功, 后面都会执行start cmd /k "命令1 && 命令2 && 命令3 " (仅…...

深度学习的经典算法的论文、解读和代码实现

文章目录 CNN网络的经典算法LeNet-5AlexNetVGGInceptionInception-v1(GoogLeNet)BN-Inception ResNetR-CNNR-CNNFast R-CNNFaster R-CNN YOLOYOLO v1YOLO v2YOLO v3YOLO v4 RNN的经典算法RNNGRULSTMEncoder-DecoderAttentionTransformer CNN网络的经典算法 LeNet-5 来源论文&…...

开源TTS+gtx1080+cuda11.7+conda+python3.9吊打百度TTS

一、简介 开源项目&#xff0c;文本提示的生成音频模型 https://github.com/suno-ai/bark Bark是由Suno创建的基于变换器的文本到音频模型。Bark可以生成极为逼真的多语种演讲以及其他音频 - 包括音乐、背景噪音和简单的声音效果。该模型还可以产生非言语沟通&#xff0c;如…...

【私有GPT】CHATGLM-6B部署教程

【私有GPT】CHATGLM-6B部署教程 CHATGLM-6B是什么&#xff1f; ChatGLM-6B是清华大学知识工程和数据挖掘小组&#xff08;Knowledge Engineering Group (KEG) & Data Mining at Tsinghua University&#xff09;发布的一个开源的对话机器人。根据官方介绍&#xff0c;这是…...

基于“R语言+遥感“水环境综合评价方法教程

详情点击链接&#xff1a;基于"R语言遥感"水环境综合评价方法教程 一&#xff1a;R语言 1.1 R语言特点&#xff08;R语言&#xff09; 1.2 安装R&#xff08;R语言&#xff09; 1.3 安装RStudio&#xff08;R语言&#xff09; &#xff08;1&#xff09;下载地址…...

To_Heart—题解——P6234 [eJOI2019] T形覆盖

link. 突然很想写这篇题解。虽然题目不算难。 考场只有30分是为什么呢&#xff1f;看来是我没有完全理解这道题目吧&#xff01; 首先很明显的转换是&#xff0c;把 T 型覆盖看成十字形&#xff0c;再考虑最后减去某一块的贡献。 然后然后直接往原图上面放十字形!对于每一个…...

[软件工具]精灵标注助手目标检测数据集格式转VOC或者yolo

有时候我们拿到一个数据集发现是xml文件格式如下&#xff1a; <?xml version"1.0" ?> <doc><path>C:\Users\Administrator\Desktop\test\000000000074.jpg</path><outputs><object><item><name>dog</name>…...

Spring BeanName自动生成原理

先看代码演示 项目先定义一个User类 public class User {private String name;Overridepublic String toString() {return "User{" "name" name \ };}public String getName() {return name;}public void setName(String name) {this.name name;} }…...

论文阅读_图形图像_U-NET

name_en: U-Net: Convolutional Networks for Biomedical Image Segmentation name_ch: U-Net&#xff1a;用于生物医学图像分割的卷积网络 addr: http://link.springer.com/10.1007/978-3-319-24574-4_28 doi: 10.1007/978-3-319-24574-4_28 date_read: 2023-02-08 date_publi…...

基于热交换算法优化的BP神经网络(预测应用) - 附代码

基于热交换算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于热交换算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.热交换优化BP神经网络2.1 BP神经网络参数设置2.2 热交换算法应用 4.测试结果&#xff1a;5.Matlab代…...

基于秃鹰算法优化的BP神经网络(预测应用) - 附代码

基于秃鹰算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于秃鹰算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.秃鹰优化BP神经网络2.1 BP神经网络参数设置2.2 秃鹰算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…...

2.文章复现《热电联产系统在区域综合能源系统中的定容选址研究》(附matlab程序)

0.代码链接 1.简述 光热发电是大规模利用太阳能的新兴方式&#xff0c;其储热系 统能够调节光热电站的出力特性&#xff0c;进而缓解光热电站并网带来的火电机组调峰问题。合理配置光热电站储热容量&#xff0c;能够 有效降低火电机组调峰成本。该文提出一种光热电站储热容 量配…...

如何开启esxi主机的ssh远程连接

环境&#xff1a;esxi主机&#xff0c;说明&#xff1a;esxi主机默认ssh是不开启的&#xff0c;需要人工手动启动&#xff0c;也可以设置同esxi主机一起开机启动。 1、找到esxi主机&#xff0c;点击“配置”那里&#xff0c;再点击右边的属性&#xff0c;如图所示&#xff1a; …...

Android Studio实现解析HTML获取json,解析json图片URL,将URL存到list,进行瀑布流展示

目录 效果build.gradle&#xff08;app&#xff09;添加的依赖&#xff08;用不上的可以不加&#xff09;AndroidManifest.xml错误activity_main.xmlitem_image.xmlMainActivityImage适配器ImageModel 接收图片URL 效果 build.gradle&#xff08;app&#xff09;添加的依赖&…...