导航:首页 > 源码编译 > 重载编译时

重载编译时

发布时间:2022-01-12 10:09:57

‘壹’ 重载的编程语言中的重载

编程中重载的定义:函数名相同,函数的参数列表不同(包括参数个数和参数类型),至于返回类型可同可不同。
重载是可使函数、运算符等处理不同类型数据或接受不同个数的参数的一种方法,关于重载一词在词义上有两种不同的说法: 重载是一种多态(如C++,java),有四种形式的多态:
1.虚函数多态
2模板多态
3重载
4转换
所谓的动态和静态区分是另一种基于绑定时间的多态分类,严格来说,重载是编译时多态,即静态多态,根据不同类型函数编译时会产生不同的名字如int_foo和char_foo等等,以此来区别调用。故重载仍符合多态定义——通过单一标识支持不同特定行为的能力,只是重载属于静态多态,而不是通过继承和虚函数实现的动态多态。 重载(overloaded)和多态无关,真正和多态相关的是覆盖(inheritance)。
当派生类重新定义了基类的虚拟方法后,基类根据赋给它的不同的派生类引用,动态地调用属于派生类的对应方法,这样的方法调用在编译期间是无法确定的。因此,这样的方法地址是在运行期绑定的(动态绑定)。
重载只是一种语言特性,是一种语法规则,与多态无关,与面向对象也无关。
不过针对所谓的第二种重载,有一个专门的名词--重写或重定义。重载与重写的区别就在于是否覆盖,重写一般多发生在不同的类且存在继承关系之间,而重载多是在一个类里或者一块代码段里。
特点:
由于重载可以在同一个类中定义功能类似的函数,这给程序员管理类的相似函数提供了极大的方便。例如,在一个定义圆的类中,需要设定圆心和半径来确定一个圆对象,程序员不需要设定setRadius(float r)和SetPoint(float x,float y)两个不同名函数,而只需要设定一个CSetCicle函数名就够了。在这个简单的例子中重载并没有明显的优势,可是当一个类中相似功能函数有几十、上百个的时候,重载的优势就显现出来了,这时程序员不需要去记这么繁多的函数名,可以把更多的精力放在程序本身上。重载的方法只属于子类。
函数:
1.函数名必须相同,返回值可以相同,也可以不同,但是特征标必须不同。是函数名来确定函数的不同,是特征标是函数可以重载。编译器首先选在函数名,然后再根据特征标在众多重载的函数中找到合适的。
2.匹配函数时,编译器将不区分类型引用和类型本身,也不区分const和非const变量。(小注:因为这些在定义和声明时可能不同,但是在调用时都是一样的,编译器将无法区分)。但是值得注意的是,形参与const形参的等价性仅适于非引用形参。有const引用形参的函数与有非const引用形参的函数是不同的。类似的,如果函数带有指向const类型的指针形参,则与带有指向相同类型的非const对象的指针形参的函数不相同。
3.名称修饰(name decoration)。编译器将根据原型中指定的形参对每个函数名进行加密
重定义:
被重载的函数有不同版本,这些函数地位是一样的,可以根据特征标的不同选择不同的函数。被重定义的函数也有不同的版本,但是你不能随意选择,你只能选择最新的版本,被重定义多发生在类之间的继承里。
4.函数会有那么多版本,那么编译将选哪一个呢。当然,理想情况是,实参与形参的数据类型完全匹配,但是当不完全匹配时会怎样呢?这就要牵扯到c++里复杂的类型转换了。
在重载及函数模板重载里,编译器选择函数,要经过以下三步,这个过程称为重载解析。
第一步:创建候选函数列表,其中包含有与被调函数名称相同的函数与模板函数。
第二步:使用候选函数列表创建可行函数列表。这些都是参数数目正确的函数。
第三步:确定是否有最佳可行的函数。如果有,则使用。
确定最佳函数,只考虑其特征标,而不考虑返回类型(也无从考虑,但是要是硬想办法的话,也有,不过没有必要为了不必要的性能而浪费资源)。确定最佳函数,匹配特征标要依次经过以下判断:(1)完全匹配(常规函数优于模板;允许无关紧要的转换)(2)提升匹配(如char和short自动转换为int)(3)标准转换(int转换为char,long转换为double)(4)用户自定义的转换(如类声明中定义的转换函数)。
完全允许无关紧要的转换,这些转换包括引用,指针与实体之间,数组与指针之间,函数与函数指针之间,const与非const等等。
其次还要注意匹配的优先级。1,指向非const数据的指针和引用优先于const的指针和引用参数匹配(这种优先级只有当指针或引用出现时产生)。2,非模板函数,优于模板函数,显示具体化的模板将优于隐式具体化的模板,总之较具体的优先(注意,具体并不是由于显隐决定的,术语“最具体”是指编译器推断使用哪种类型时执行的转换最少)。 通常,派生类继承基类的方法,因此,在调用对象继承方法的时候,调用和执行的是基类的实现.但是,有时需要对派生类中的继承方法有不同的实现.
例如,假设动物类存在跑的方法,从中派生出马和狗,马和狗的跑得形态是各不相同的,因此同样方法需要两种不同的实现,这就需要重新编写基类中的方法.
重写基类方法就是修改它的实现或者说在派生类中重新编写 //java代码//方法重写publicclassFather{publicvoidovel(inti){/*dosomething...*/}publicStringovef(){/*dosomething...*/return***;}}publicclassSonextendsFather{publicvoidovel(inti){/*doothersomething...*/}publicStringovef(){/*doothersomething...*/returnXXX;}}

‘贰’ JAVA 的重载是运行时决定还是编译的时候决

重载属于编译时多态。运行时会根据参数的个数和类型调用相应的方法。

‘叁’ C++函数重载的编译后的一个奇怪的问题

是的,对于编译器来说,名字是不一样而且唯一的,编译器会对函数名“修饰”。


classCTest
{
......
private:
voidFunction(int);
protected:
voidCopyInfo(constCTest&src);
public:
longDrawText(HDChdc,longpos,constTCHAR*text,RGBQUADcolor,BYTEbUnder,boolbSet);
longInsightClass(DWORDdwClass)const;
......
};

对于成员函数Function,其函数修饰名为“?Function@CTest@@AAEXH@Z”,字符串“@@AAE”表示这是一个私有函数。成员函数CopyInfo只有一个参数,是对类CTest的const引用参数,其函数修饰名为“?CopyInfo@CTest@@IAEXABV1@@Z”。DrawText是一个比较复杂的函数声明,不仅有字符串参数,还有结构体参数和HDC句柄参数,需要指出的是HDC实际上是一个HDC__结构类型的指针,这个参数的表示就是“PAUHDC__@@”,其完整的函数修饰名为“?DrawText@CTest@@QAEJPAUHDC__@@JPBDUtagRGBQUAD@@E_N@Z”。InsightClass是一个共有的const函数,它的成员函数标识是“@@QBE”,完整的修饰名就是“?InsightClass@CTest@@QBEJK@Z”。

‘肆’ c++6.0编译运算符的重载时 结果不正确的问题

char a;
char b;

::strcpy(&this->a,&s.a);
::strcpy(&this->b,&s.b);
::strcpy(&m.a,&this->a);
::strcpy(&m.b,&this->b);

上面是错的地方,你要仔细理解一下 char 和char *,或者char 数组的区别

‘伍’ 函数重载相同函数名编译时函数名不同是啥意思

意思是说,我们看到的函数重载名称相同,但编译的时候系统会自动给他们另外起一个唯一的名称,各不相同,这里你不用纠结

‘陆’ Java里,重载的方法为何是静态编译,而没有重载的方法却是动态编译这么设计有什么原因吗

java允许在一个类中,多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载,编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多个可能的匹配就会产生编译时错误,这个过程被称为重载的解析
1 普通方法的重载
普通方法的重载是Java实现多态技术的重要手段,为编程带来了很多便利
当方法同名时,为了让编译器区别他们,至少需要下面之一不同
1 参数个数不同
2 对应位置上的参数类型不同
不允许参数完全相同而只是返回值不同的情况出现。无法进行编译,程序在eclips中显示错误
2 构造方法的重载
见文章构造方法的继承
重载的解析
当类的设计者提供了重载方法之后,类的使用者在使用这些方法时编译器需要确定调用哪一个方法,确定的唯一依据是参数列表,确定的过程被称为重载的解析。

以下举些例子说明:
show(int a ,int b,int c) //1
show(int a ,int b,double c) //2
show(int a ,double b,double c)//3
show(double a,double b,int c) //4
下面是调用
show(1,2,3);//1,2,3,4都是可行方法所有参数完全匹配1
show(1.0,2.0,3.0);//没有一个可行方法
show(1.0,2,3);//4是最佳可行方法
show(1,2.0,3);//3,4都是可行方法,没有最佳可行方法,报错

重载和覆盖都是多态的表现,他们在某些地方很相似,很容易引起初学者的疑惑,这里将它们之间的区别总结如下
1 重载和覆盖的方法名称都相同,但重载要求参数列表不同,而覆盖要求参数列表完全相同。
2 重载对于方法前面的修饰符没有限制,而覆盖则对这些修饰符的使用有限制
3 重载时编译器在编译期间就可以确定调用那一个方法,而覆盖则有可能在运行期间才能确定。

‘柒’ 重载>>,编译报错(重载其他运算符都没问题,就是这个有问题)

为什么:
头文件里的:
friend std::ostream& operator >>(std::ostream &is,ccomplex &a);
cpp文件里的:
std::istream& operator >>(std::istream &is,ccomplex &a)

为什么函数签名不一样呢?

‘捌’ C++多态性。 基类的虚函数和重载函数的区别,是不是一个是在运行时发生,一个是在编译时发生

是的,函数的重载是在编译的时候发生,而虚函数是在运行的时候确定。其实有时候称函数的重载为静态多态性,而虚函数为动态多态性

‘玖’ VC++运算符重载时编译问题

int operator +(int g,a &p) //这里应该也用&,因为前面用了,见friend int operator +(int ,a &);

‘拾’ c++函数重载"<<"为什么编译通不过

把iostream、ostream、using namespace std三行去掉,换成 iostream.h
我记得这是vc6的bug,它们和友元会冲突。
本来昨晚就可以答的,结果由于网络知道故障而回答不了

阅读全文

与重载编译时相关的资料

热点内容
kafka删除topic命令 浏览:757
phpsql单引号 浏览:84
英雄联盟压缩壁纸 浏览:450
办公app需要什么服务器 浏览:626
安卓服务器怎么获得 浏览:806
空调压缩机冷媒的作用 浏览:779
淘宝app是以什么为利的 浏览:655
java提取图片文字 浏览:922
我的世界手机版指令复制命令 浏览:33
java判断字符串为数字 浏览:924
androidrpc框架 浏览:488
云服务器essd和ssd 浏览:522
家用网关的加密方式 浏览:1
怎么从ppt导出pdf文件 浏览:971
换汽车空调压缩机轴承 浏览:845
平板怎么登录安卓端 浏览:195
图像拼接计算法 浏览:255
怎么打开饥荒服务器的本地文件夹 浏览:291
usb扫描枪编程 浏览:673
博易大师手机app叫什么 浏览:663