//加密函数
functionTfuncs.Encrypt(Src:String;Key:String):String;stdcall;
varKeyLen,KeyPos,Offset,SrcPos,SrcAsc:Integer;
Dest:ShortString;
begin
KeyLen:=Length(Key);
ifKeyLen=0thenKey:='ILoveJFM';
KeyPos:=0;
Randomize;
Offset:=Random(256);
Dest:=Format('%1.2x',[Offset]);
forSrcPos:=1toLength(Src)do
begin
SrcAsc:=(Ord(Src[SrcPos])+Offset)MOD255;
ifKeyPos<KeyLenthenKeyPos:=KeyPos+1
elseKeyPos:=1;
SrcAsc:=SrcAscxorOrd(Key[KeyPos]);
Dest:=Dest+Format('%1.2x',[SrcAsc]);
Offset:=SrcAsc;
end;
Result:=Dest;
end;
偶有一个,但不在手头,先说说原理,不难
1、生成一随机数aa
2、与密码第一字符按位异或,得bb
3、以bb为源与下一字符生成cc
4、bb=cc,重复3、4直到结束
然后将生成的密码再按某种方式打乱即可
解密:
反其道而行之!
构造函数
构造函数,是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载。
基本信息
中文名构造函数外文名constructor特点命名须和类名完全相同等
中国科协权威合作机构
中国科协主办科普信息化平台
目录
主要特点
1.构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;
4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点;
5.构造函数有回滚的效果,构造函数抛出异常时,构造的是一个不完整对象,会回滚,将此不完整对象的成员释放(c++)
6.当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,C#编译器会为其自动生成一个默认的无参的构造函数。
7.在Python中构造函数必须通过重写__init__方法实现
应用
C++构造函数
C++语言为类提供的构造函数可自动完成对象的初始化任务,全局对象和静态对象的构造函数在main()函数执行之前就被调用,局部静态对象的构造函数是当程序第一次执行到相应语句时才被调用。然而给出一个外部对象的引用性声明时,并不调用相应的构造函数,因为这个外部对象只是引用在其他地方声明的对象,并没有真正地创建一个对象。
C++的构造函数定义格式为:
class<类名>
{
public:
<类名>(参数表);
//…(还可以声明其它成员函数)
};
<类名>::<函数名>(参数表)
{
//函数体
}
如以下定义是合法的:
classT
{
public:
T(inta=0){i=a;}//构造函数允许直接写在类定义内,也允许有参数表。
private:
inti;
};
如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提供默认的构造函数:
1、如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;
2、如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);
3、在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数)。
<类名>::<类名>(){},即不执行任何操作。
例子
#include<iostream>usingnamespacestd;classtime{public:time()//constructor.构造函数{hour=0;minute=0;sec=0;}voidset_time();voidshow_time();private:inthour,minute,sec;};intmain(){classtimet1;t1.show_time();t1.set_time();t1.show_time();return0;}voidtime::set_time(){cin>>hour>>minute>>sec;}voidtime::show_time(){cout<<hour<<":"<<minute<<":"<<sec<<endl;}
程序运行情况:
0:0:0
101111回车
10:11:11
任何时候,只要创建类或结构,就会调用它的构造函数。类或结构可能有多个接受不同参数的构造函数。构造函数使得程序员可设置默认值、限制实例化以及编写灵活且便于阅读的代码。
PHP的构造函数
void__construct([mixedargs[,…]])
php5允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
注:如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用parent::__construct()。
例子使用新标准的构造函数
<?phpclassBaseClass{function__construct(){print"InBaseClassconstructor/n";}}classSubClassextendsBaseClass{function__construct(){parent::__construct();print"InSubClassconstructor/n";}}$obj=newBaseClass();$obj=newSubClass();?>
为了实现向后兼容性,如果php5在类中找不到__construct()函数,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。因此唯一会产生兼容性问题的情况是:类中已有一个名为__construct()的方法,但它却又不是构造函数。
Python的构造函数
定义格式为
class<类名>:
__init__(self[,参数表]):
#函数体
#其它的方法和属性
其他特点
1.它的函数名与类名相同;
2.它可以重载;
3.不能指定返回类型,即使是void也不行;
4.虽然在一般情况下,构造函数不被显式调用,而是在创建对象时自动被调用。但是并不是不能被显式调用。有些时候是一定要显式调用的,只要是父类有带参的构造函数,在子类中就必须显式的调用父类的构造函数,因为子类的构造器在实例化时无法找到父类的构造函数(当父类有自己写的无参构造函数时,子类也不用显式调用)。
void__destruct(void)
php5引入了析构函数的概念,这类似于其它面向对象的语言,如C++。析构函数会在到某个对象的所有引。
语法
Java,C++,C#,ActionScript和PHP4中的命名规范会要求构造器函数的名称与它所在类的名称相同。
PHP5建议的构造器函数名称为__construct。为了保证向下兼容,__construct方法无法找到时会调用任何跟类名同名的方法作为构造器。从PHP5.3.3起,这种途径只对非名字空间的类有效。
在Perl里,构造器被约定俗成地命名为"new",并且会完成创建对象的大量工作。
在Perl的Moose对象系统中,构造函数(叫做new)是自动生成的,程序员可以通过指定一个BUILD方法来对其进行扩充。
在VisualBasic.NET里,构造器被命名为New,是个Sub。
Python里构造器的被分为__new__和__init__两个方法。__new__方法负责为实例分配内储存空间,并接受自身的类作为参数(一般命名为cls)。__init__方法接受被新建的实例作为参数(一般称为self)。
ObjectPascal的构造函数用关键字constructor标识,并且可以起任意名字(但一般来说会被起名为Create)。
Objective-C的构造函数分成两个方法,alloc和init。alloc方法分配内存,init负责初始化。new方法会调用alloc和init两者。
内存机制
在Java,C#和VB.NET里,构造器会在一种叫做堆的特殊数据结构里创建作为引用类型的实例。值类型(例如int,double等等)则会创建在叫做栈的有序数据结构里。VB.NETandC#会允许用new来创建值类型的实例。然而在这些语言里,即使使用这种方法创建的对象依然只会在栈里。
在C++里,不用new创建的对象会保存在栈里,使用new创建时则会在堆里。它们必须分别使用析构函数或者delete操作才能被删除。
语言细节
Java
在Java里,构造器和其他方法的主要差别在于:
构造器不具有任何显性返回类型。
构造器无法被直接“new”invokesthem).
构造器无法被标示为synchronized,final,abstract,native,或者static。
Java里的构造器会按照以下顺序完成下列工作:
将类变量初始到缺省值。(byte,short,int,long,float,和double变量会默认设为它们相应的0值,booleans会被设为false,chars会被设为空字符('\u0000'),对象引用会被设为null)
引用父类的构造器,如果没有定义任何构造器。
将实例变量初始化到指定值。
执行构造器内的代码。
在Java中可以通过关键词super访问父类的构造器。
publicclassExample{//Definitionoftheconstructor.publicExample(){this(1);}//OverloadingaconstructorpublicExample(intinput){data=input;//Thisisanassignment}//Declarationofinstancevariable(s).privateintdata;}
//Codesomewhereelse//InstantiatinganobjectwiththeaboveconstructorExamplee=newExample(42);
不接收任何参数的构造器被称作“无参数构造器”。
VisualBasic.NET
在VisualBasic.NET中,构造函数以"New"为定义方法,并且必须是个Sub。
ClassFoobarPrivatestrDataAsString'ConstructorPublicSubNew(ByValsomeParamAsString)strData=someParamEndSubEndClass
'codesomewhereelse'instantiatinganobjectwiththeaboveconstructorDimfooAsNewFoobar(".NET")
C#
publicclassMyClass{privateinta;privatestringb;//ConstructorpublicMyClass():this(42,"string"){}//OverloadingaconstructorpublicMyClass(inta,stringb){this.a=a;this.b=b;}}
//Codesomewhere//InstantiatinganobjectwiththeconstructoraboveMyClassc=newMyClass(42,"string");
C#静态构造函数
在C#中,静态构造函数是用来初始化任何静态数据。静态构造函数也称为“类构造函数”,由于类构造函数在生成的MSIL里名为“.cctor”,因此也被称为“cctor”。
静态构造函数允许复杂的静态变量初始化。
静态构造函数在该类第一次被访问时调用,任何使用该类的操作(无论是调用静态函数、属性还是访问静态变量,还是构造类的实例)都会引发静态构造函数的执行。静态构造函数是线程安全的,并且是单例的。当用在泛型类中时,静态构造函数对于泛型的每个实例化都调用一次。静态变量也同样如此。
publicclassMyClass{privatestaticint_A;//NormalconstructorstaticMyClass(){_A=32;}//StandarddefaultconstructorpublicMyClass(){}}//Codesomewhere//Instantiatinganobjectwiththeconstructorabove//rightbeforetheinstantiation//Thevariablestaticconstructorisexecutedand_Ais32MyClassc=newMyClass();
C++
C++的构造函数以该类的类名为标识,且不写返回值类型也无法返回值:
classC{public:C(void){…}};
构造函数的函数体执行是在各个成员构造完之后才开始,因此要想更改成员的构造方式需要使用成员初始化列表:
classD:publicB{public:D(void):B("Hello,world!"){…}};
复制构造函数接受同类对象的左值引用(一般为constT&)、移动构造函数接受右值引用(一般为T&&):
classE{public:E(constE&e){…}//CopyconstructorE(E&&e){…}//Moveconstructor};
C++中,程序员若未对某类定义构造函数(以及赋值函数、析构函数),编译器在满足条件时会定义相应的函数。
Ruby
irb(main):001:0>classExampleClassirb(main):002:1>definitializeirb(main):003:2>puts"Hellothere"irb(main):004:2>endirb(main):005:1>end=>nilirb(main):006:0>ExampleClass.newHellothere=>#<ExampleClass:0x007fb3f4299118>