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
三种传递方式比较
- 适用对象作为函数参数。当进行函数调用时,需要给形参分配存储单元,形参和实参的结合是值传递,实参将自己的值传递给形参,形参实际上是实参的副本。这是一种单向传递,形参的变化不会影响到实参。
- 使用指针作为函数参数。当进行函数调用时,需要给形参分配存储单元,形参和实参的结合是地址传递,实参将自己的地址传递给形参。这是一种双向传递,形参的变化会直接影响带实参。缺点是阅读性较差。
- 使用引用作为函数参数。当进行函数调用时,在内存中并没有产生实参的副本,它是直接对实参操作。这种方式是双向传递,形参的变化会直接影响到实参。与指针作为函数参数相比,它更容易使用、更清晰。当参数传递的数据较大时,用引用比一般变量传递参数的效率要高,所占用空间更少。
内联函数
在程序设计中,效率是一个很重要的指标。在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~5行代码,而且不能含有复杂的分支或循环语句等。
- 在类内定义的成员函数默认为内联函数。
- 在类外给出函数体的成员函数,若要定义为内联函数,则必须加上关键字inline。否则,编译器将它作为普通成员函数。
- 递归调用的函数不能定义为内联函数。
函数重载
函数名可以看作一个操作的名字。当多个函数实现的是同一类功能,只是部分细节不同(如参数的个数或参数类型不同)时,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;
}
【注】
-
重载函数必须具有不同的参数个数或不同的参数类型,若只是返回值的类型不同或参数名不同时不行的。
-
重载函数应满足:函数名相同,函数的返回值类型可以相同也可以不同,当各函数的参数表中的参数个数或类型必须有所不同,这样才能进行区分,从而正确地调用函数。
-
匹配重载函数的顺序:a.通过内部类型转换寻求一个匹配,若找到,则调用该函数;b.通过强制类型转换寻求一个匹配,若找到,则调用函数。
-
不能将不同功能的函数定义为重载函数,以免产生误解。
-
创建重载函数时,必须让编译器能区分两个(或更多)的重载函数。当创建的多个重载函数编译器不能区分时,编译器就认为这些函数具有多义性,即调用是错误的,编译器不会编译该程序。例如:
#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){| ^~~
-
当函数的重载带有默认参数值时,要避免产生二义性。
成员函数重载
成员函数重载主要是为了适应相同成员函数的参数多样性。成员函数重载的一个很重要的应用就是重载构造函数。因为构造函数的名字预先有类的名字确定,所以只能有一个构造函数名。但在解决实际问题时,可能会需要创建具有不同形态的对象,因此,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
函数的默认参数值
-
当函数既有声明和定义时,默认参数值只能在声明中指定,不能再函数定义中指定。
void Fun(int x = 0, int y = 0);//正确,在函数声明中指定默认参数值 void Fun(int x = 0, int y = 0){ // ....} //错误,不能再函数定义中指定默认参数值
-
在函数声明中,所有带默认值的参数都必须出现再没有默认值参数的右边。也就是说,一旦开始定义带默认值的参数,在其后面就不能再定义没有默认值的参数了。例如:
void Fun(int i, int j = 0, int k); //错误
-
在函数调用时,若某个参数省略,则其后面的参数皆应省略而采用默认参数值。例如:
Fun(,9);//错误的调用
-
当重载函数带有默认参数值时,要注意避免二义性。
友元
类的主要特点之一是数据隐藏,类的私有成员或保护成员只能通过其成员函数来访问。那么有没有办法允许再类外对某个对象的私有成员或保护成员进行操作?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 不及格
【注】
-
非成员函数成为类的友元函数后,若再类外定义,则不能再函数名前加”类名::“,因为他不是该类的成员函数;非成员函数作为类的友元函数没有this指针;调用友元函数时必须在其实参标中给出要访问的对象。
-
友元函数既可以在类的私有部分进行声明,也可以再类的公有部分进行声明。
-
当一个函数需要访问多个类时,应该把这个函数同时定义为这些类的友元函数,这样,该函数才能访问这些类的私有或保护成员,例如。
#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; }
-
若友元函数带了两个不同的类的对象,其中一个对象所对应的类要在后面声明。
类的成员函数作为友元函数
一个类的成员函数可以作为另一个类的友元函数,这种成员函数不仅可以访问自己所在类中的成员,还可以通过对象名访问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
总学生人数:1
第2个学生:张三 2 85
总学生人数:2
【注】
- 静态数据成员的声明需加关键字static,访问格式:类名::静态数据成员名
- 静态数据成员的初始化应在类外生命并在对象生成之前进行。默认时,静态成员被初始化为零。
- 静态数据成员在编译时创建并初始化,不能用构造函数进行初始化。静态数据成员不能再任何函数内分配存储空间和初始化。
静态成员函数
与静态数据成员一样,用户也可以创建静态成员函数,静态成员函数不能访问一般的数据成员和成员函数,它只能访问静态数据成员和其他的静态成员函数。静态成员函数时独立于类对象而存在的,因此没有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的每个程序至少有一个函数,即主函数main(),函数也是类的方法的实现手段。C的函数包括两类:预定于函数和用户自定义函数。 函数的定义格式为: <返回值类型><函数名>(<参数列表>) <函…...
Linux网络编程:libevent事件通知库
文章目录: 一:libevent库 二:libevent框架 1.常规事件event 1.1 创建事件event(event_new) 1.2 添加事件到 event_base(event_add) 1.3 从event_base上摘下事件(event_del&a…...
java.lang.reflect.InvocationTargetException:null报未知异常
在项目上线过程中,突然出现大量异常信息,堆栈信息如下: 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环境相关信息: go envgo env -w GOPROXYhttps://goproxy.cn...
金融市场中的机器学习;快手推出自研语言模型“快意”
🦉 AI新闻 🚀 OpenAI可能面临《纽约时报》的起诉,侵犯知识产权引发争议 摘要:OpenAI使用《纽约时报》的文章和图片来训练AI模型,违反了《纽约时报》的服务条款,可能面临巨大损失。此前,也有其…...
【面试刷题】——什么是深拷贝和浅拷贝?
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在编程中用来描述对象拷贝的两个概念,特别是在涉及对象包含其他对象(如嵌套数据结构、指针等)的情况下。 浅拷贝(Shallow Copyÿ…...
物联网(IoT)安全挑战与解决方案: 分析物联网设备面临的安全威胁,以及如何设计和管理安全的IoT生态系统
第一章:引言 随着科技的飞速发展,物联网(IoT)作为连接世界的桥梁,已经成为现代社会不可或缺的一部分。然而,随着IoT设备数量的不断增加,其安全问题也日益显著。本文将深入探讨IoT领域面临的安全…...
Ubuntu 22.04.3 LTS 维护更新发布
近日消息,Canonical 今天发布了代号为 Jammy Jellyfish、长期支持的 Ubuntu 22.04 第 3 个维护版本更新,距离上个版本相隔 6 周时间。 Ubuntu 22.04.3 LTS 最大的亮点在于内核升级到 Linux Kernel 6.2,此外 Mesa 图形堆栈也升级到 23.0.4 版…...
平安健康,找到了医疗服务的价值密码
健康是人类的永恒需求,围绕医疗和健康服务衍生的产业,却苦于无法和用户建立足够紧密、长期的联系。由此,也不得不面临价值从何而来的问题。 作为医疗服务领域的代表性企业,平安健康医疗科技有限公司(股票简称“平安好…...
❤ vue 使用原生组件
❤ vue 使用原生组件 1、做一个input输入框验证开始 ① 想让我们的input输入框类型为时间,只需要为我们的输入框简单的加一个类型的type即可 <input type"date" id"birthday" name"birthday" placeholder"年/月/日"&…...
4.12 TCP 连接,一端断电和进程崩溃有什么区别?
目录 TCP keepalive TCP 的保活机制 主机崩溃 进程崩溃 有数据传输的场景 客户端主机宕机,又迅速重启 客户端主机宕机,一直没有重启 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地址跳转的地方。如果后端采用了前端传进来的(可能是用户传参,或者之前预埋…...
贝叶斯公式中的动词 命名技巧
一项血液化验有95%的把我诊断某种疾病,但是,这项化验用于健康人也会有1%的“伪阳性”结果(即如果一个健康人接受这项化验,则化验结果乌镇此人患有该疾病的概率是0.01)。如果该疾病的患者事实上只占总人口的0.5%,若某人化验结果为阳…...
ctfshow-web13 文件上传
0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 首先看到是一个上传页面,测试其他无果,遂进行目录遍历,发现upload.php.bak文件 可以看到这里的限制条件,大小,以及内容,这里可以使用.use…...
Python项目开发案例————学生信息管理系统(附源码)
一、学生信息管理系统 本文使用Python语言开发了一个学生信息管理系统,该系统可以帮助教师快速录入学生的信息,并且对学生的信息进行基本的增、删、改、查操作;还可以实时地将学生的信息保存到磁盘文件中。 1.1 需求分析 为了顺应互联网时代…...
2023-08-25力扣每日一题
链接: 1448. 统计二叉树中好节点的数目 题意: 判断根节点到每个节点X的过程中,如果没有值大于X,则该节点为好节点,求好节点数量 解: 由于求根节点到其他节点的路径,则使用dfs算法ÿ…...
Vue3中的计算属性和属性监听
compute计算属性 Vue3中可以通过 compute进行监听计算属性,他返回的是一个ref的对象,也就是说 通过compuye这种方式计算属性实际上是进行了ref的操作 import { computed } from vue const user reactive({firstName: A,lastName: B }) // 只有getter的…...
微信开发之一键修改群公告的技术实现
简要描述: 设置群公告 请求URL: http://域名地址/setChatRoomAnnouncement 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必…...
【git】工作场景中常用的git命令
工作场景中常用的git命令 1. 必备改名改邮箱拉代码下来并且创建新分支git commit回滚某个文件删除分支 工作场景中常用的git命令,记录下来方便调取 1. 必备 改名改邮箱 一般与他人合作,至少你提交的名字得被人熟知或者遵循规范,因此需要更改…...
Vue路由(详解)
目录 路由原理 路由到底有什么作用? 路由安装和使用(vue2) 路由跳转 跳转实例: 路由的传值和取值 传值实例: 查询参和路由参的区别: 嵌套路由 嵌套实例: 路由守卫 守卫实例࿱…...
打开软件提示msvcp140.dll丢失的解决方法,msvcp140主要丢失原因
今天,我将为大家介绍一种非常常见的问题——msvcp140.dll丢失。这个问题可能会导致许多应用程序无法正常运行,甚至崩溃。但是,请不要担心,我会为大家提供5种解决方法,帮助大家轻松解决问题。 首先,我们来看…...
关于路由器和DNS解析的一些新理解
其实我本人对于交换机和路由器这些网络硬件是比较感兴趣的,也在一点一点的学习相关知识,每次解决一个问题,就让我对一些事情有新的思考。。 今天前台同事,的机器突然上不了网,,和领导一起去看了一波&#…...
vscode 与 C++
序 具体流程的话,官方文档里都有的:C programming with Visual Studio Code 浏览器下载一个mingw64,解压,配置环境变量vscode里安装c相关的插件没了 第一步只看文字,可能有点抽象,相关视频: …...
水果flstudio好用吗?中文版FL21最新版本如何下载
FL Studio21版是一款功能强大的音乐制作软件,广泛应用于电子音乐、流行音乐、电影配乐等领域。它提供了丰富多样的音频合成和编辑工具,使音乐制作变得更加灵活多样。无论是初学者还是专业音乐制作人,都可以通过直观的界面和丰富的音频特效来实…...
PHP is_array()函数详解,PHP判断是否为数组
「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 is_array 一、基本使用二、空数组三、同时判断多个…...
面试题-React(三):什么是JSX?它与常规JavaScript有什么不同?
在React的世界中,JSX是一项引人注目的技术,它允许开发者在JavaScript中嵌套类似HTML的标签,用于描述UI组件的结构。本篇博客将通过丰富的代码示例,深入探索JSX语法,解析其在React中的用法和优势。 一、JSX基础语法 在…...
纯前端实现图片上传七牛云
首先安装下依赖: 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解释器
目的:创建一个ubuntu系统下的python解释器,作为win平台下的pycharm的解释器。 这样做的好处是可以直接在win系统里操作文件,相比于linux方便一点,而且也不用对wsl的子系统进行迁移。 一、安装前准备 1. 设置-Windows更新-window…...
EL与JSTL
目录 EL EL语法 EL运算符 JSTL JSTL标签分类 JSP脚本:代码结构混乱、脚本与HTML 混合易出错、代码不易维护。 EL表达式:优化程序代码,增加程序可读性。 EL EL语法 EL表达式 ${ EL 表达式 } EL操作符 操作符“ . ” 获取对象的属性&a…...
备案 网站首页url/磁力岛引擎
监控对于我们来说到底有多重要? 网络监控是企业IT运维中必不可少的重要一环,传统的监控工具以监控各个服务的健康和性能为中心。而随着数字化时代的到来,我们需要一个更加全面的监控视图,能够把不同环境下所有资源间的流量信息进行…...
网站可以在手机上做吗/谷歌搜索引擎入口google
HttpClient相关的实体类官方文档地址:http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/ 使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可:1. 创建HttpClient对象,HttpClient httpClientnew Defa…...
asp.net 房产局政府网站模板/搜索引擎的四个组成部分及作用
因為網頁上有個欄位允許使用者輸入多行文字,可是如果只是單純的把該欄位直接跟Label Binding起來時,顯示出來的結果不會有換行的效果,只要改用自行繫結,然後用下面的方法,把輸出文字裡面的換行文字"\n"轉換成…...
wordpress创建插件/网站建设与网站设计
当前位置:我的异常网 Java Web开发 请教怎样处理退后刷新页面的重复提交有关问题?多谢请教怎样处理退后刷新页面的重复提交有关问题?多谢www.myexceptions.net 网友分享于:2013-01-19 浏览:13次请问怎样处理退后刷新页面的重复…...
为加强政协网站建设/网站源码建站
这里提供两种方法供选择:第一:手写代码。第二:利用HttpClient php类库第一种方法:$flag 0;//要post的数据$argv array(var1>abc,var2>你好吗);//构造要post的字符串foreach ($argv as $key>$value) {if ($flag!0) {$pa…...
论坛网站建设费用/找培训机构的app
朋友们在使用Windows系统过程中,随着使用时间越长,产生的临时文件越多,一方面占用了磁盘空间,另一方面也拖慢了系统运行速度。市面上已经有很多清理软件了,编者下面介绍一种不用软件清理临时文件的方法。原理是用批处理…...