重载

来源:互联网 发布:小甲鱼python pdf下载 编辑:程序博客网 时间:2024/04/29 08:20
 
重载的隐患
1.C++不能用返回值标示重载。因为c++会忽略返回值<???>,所以只能用参数
2.
隐式类型转换造成重载的二义性
数字本身没有类型,它不知道将转成int还是float
# include <iostream.h>
void output( int x); // 函数声明
void output( float x); // 函数声明
void output( int x)
{
cout << " output int " << x << endl ;
}
void output( float x)
{
cout << " output float " << x << endl ;
}
void main(void)
{
int x = 1;
float y = 1.0;
output(x); // output int 1
output(y); // output float 1
output(1); // output int 1
// output(0.5); // error! ambiguous call, 因为自动类型转换
output(int(0.5)); // output int 0
output(float(0.5)); // output float 0.5
}
3.
重载/覆盖
重载:
²        在同一作用范围《同一类》
²        函数名相同
²        参数不同
²        有无virtual 不影响
覆盖:
²        不同范围《父类与子类》
²        函数名相同
²        参数相同
²        父类必须有virtual, 利用指向父类的指针实现多态
运算符重载:
如果运算符被重载为全局函数,那么只有一个参数的运算符叫做一元运算符,有两
个参数的运算符叫做二元运算符。
如果运算符被重载为类的成员函数,那么一元运算符没有参数,二元运算符只有一
个右侧参数,因为对象自己成了左侧参数。
从语法上讲,运算符既可以定义为全局函数,也可以定义为成员函数。
对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。
 
运算符 规则
所有的一元运算符 建议重载为成员函数
= () [] -> 只能重载为成员函数
+= -= /= *= &= |= ~= %= >>= <<= 建议重载为成员函数
所有其它运算符 建议重载为全局函数
 
小结:
“C++ 语言中的重载、内联、缺省参数、隐式转换等机制展现了很多优点,但是这些
优点的背后都隐藏着一些隐患。正如人们的饮食,少食和暴食都不可取,应当恰到好处。
我们要辨证地看待C++的新机制,应该恰如其分地使用它们。虽然这会使我们编程时多
费一些心思,少了一些痛快,但这才是编程的艺术。” ---<<高质量C++编程>>
 
参数缺省值
可以使代码变得简洁。但也有隐患。
 
 
 
 
C++有抽象函数?接口?compared with Java?