delphi 重载问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 重载问题相关的知识,希望对你有一定的参考价值。
我在一flash里看到一段代码,想改成delphi的,但遇到一个问题,我是新手,烦请高手指点
flash里是这样的
function kk(a1, a2, a3, a4, a5)
....
调用时却这样
kk("password", [148, 160, 18, 230, 222, 79, 31, 14], 0)
或kk("a",c, 0, 1,"123")
几次参数类型 个数都不同,而kk在flash里的定义就上面那种
我在delphi里写了同样的kk函数,却在调用时不知所措,
问题1:如何才能实上上面两种调用方式?就是参数个数不同
问题2:[148, 160, 18, 230, 222, 79, 31, 14] 这种类型是什么数型,在delphi如何实现?
新手提问,可能没说清楚,烦请指点,如能通过hi 指点,那更好了,我一定再追加几百分,谢了
谢谢两位的回答,我想细问下,烦请通过hi指点,谢了,到时再加分,谢了
as和js是动态脚本 所以 变量不需要定义类型的,所以会出现函数中各个参数不一样,delphi里面如果想这样 用oleVariant类型吧.
其他的让别人说了 我就不说了. 参考技术A 问题1 用方法重载就行了
function kk(参数1, 参数2, 参数3): string; overload;
function kk(参数1, 参数2, 参数3, 参数4,参数5): string; overload;
问题2 这种类型是一维数组
array [1..8] of integer 参考技术B [148, 160, 18, 230, 222, 79, 31, 14] 可以是数组类型,也可以是集合类型。
函数重载用overload
例如:function kk(a1, a2, a3, a4, a5:int):int;ovrload;//所有参数都是int类型的,返回值也是int
function kk(a1:string;a2: array[0..7] of int; a3:int):string;ovrload;
function kk(a1:string;a2, a3:int;a4:string):real;ovrload;
除了函数名字一样外,参数的个数,类型都可以不一样,返回值也可以不一样 参考技术C 第一个:用OVERLOAD多定义几个就行了
第二:[148, 160, 18, 230, 222, 79, 31, 14] 是数组或集合,但集合实际使用的很少,一般也表示不了什么含义,所以这里肯定是数组,你可以看看DELPHI关于数组的介绍,动态数组,开放数组,类型安全的开放数组,功能更强大。数组的大小、类型、甚至维数都可以是动态的
重载运算符问题
关于运算符重载:
不允许用户自定义新的运算符,只能对已有的运算符进行重载
重载运算符不允许改变运算符原操作数的个数
重载运算符不能改变运算符的优先级
重载运算符函数不能有默认的参数,会导致参数个数不匹配
可以在类内实现,作为类的成员函数,也可定义为类的友元函数
当运算符重载函数作为类的成员函数时,要求操作数左边必须是一个对象,而函数的参数可以是同类的对象也可以是普通的变量。
//作为类成员函数定义: Complex operator+(Complex &c1){ return new Complex(this.real+c1.real,this.image+c1.image); } //调用: (1)c3 = c1+c2; 即 c3 = c1.operator+(c2) //正确 (2)c3 = c1+5; 函数原型:Complex operator+(int i){} //正确 (3)c3 = 5+c1; //错误
这是因为没有办法调用i.operator+(c1)。那么如果想要这么做,只能作为类的非成员函数,而且当要访问的数据为对象的私有成员函数时,则必须声明为类的友元函数。
总结来说:(1)类的成员函数实现运算符重载,必须保证左操作数已经处于正确的形式。
(2)全局版本的自动类型(友元)转换可以针对左右任意操作数。
(3)各自的优势:成员函数保证了封装性,就是指非自身成员不能访问私有成员,而友元属于非自身成员,但是赋予他特权来访问类的私有成员,可以理解为破坏类的封闭性。但是友元函数实现比较灵活。
所以对于运算符重载,有必须定义为成员函数的,比如[],->,(),=这四个运算符必须基于对象才能用,也有的既可以作为类的成员函数,又可以作为友元函数,当然也有必须定义成友元函数的,比如>>和<<,因为他们的两个操作数都不是对象本身,
ostream& operator<<(ostream& os, const classType& obj);
则第一个参数是该运算符的第一个操作数,然而,却不是类对象,所以当该类运算符重载时写在类的内部时,又为了访问类内除public外的其它变量或函数,
则应当声明为友元函数:
friend ostream& operator<<(ostream& os, const classType& obj);
另外对于运算符重载时的const修饰问题,我总结下,有错误的或者不完整的欢迎指正补充
(1)一般形参用引用传递,因为这样无需在栈内存中开辟空间以装载临时对象,也省去了复制的耗时过程。
(2)当不希望函数改变形参的值时,最好用const修饰。不然在引用传递时,形参改变意味着实参也改变了。
(3)对于函数加const修饰的情况,比如
bool operator<(const node &b) const
那是因为它表示这个函数不会修改该类的任何成员。
如果没有这个const,编译器不会允许这个运算符用于一个const对象
意思就是没有加 const 的函数不能在 const 对象上使用
以上是关于delphi 重载问题的主要内容,如果未能解决你的问题,请参考以下文章
c++builder 重载WindowProcWndProc 截获消息(比Delphi多一个Message Map方法)