补充:
函数重载
相同:函数名
不同:参数的类型,个数或顺序
注意:认为这些类型相同
int a and int&a 认为引用在函数调用的时候写法一样f(a)
int*a and int a[]
都属于同一类型的不同名字,调用函数的时候写法一样
不能区分:形参名 or 返回值
具体请见函数重载与函数模板
友元关系
友元函数
实现:类外函数访问类内所有数据成员(甚至是私有的)
友元类
格式:
B是A的友元:
在类A中
friend class B;
友元关系
总结
1)单向
2)不可传递
多态性
定义:
发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。
实现:
》重载:运算符&&函数重载
》虚函数
运算符号重载
限制:
1)不能够重载的符号有
. (成员访问运算符)
.* (成员指针访问运算符)
:: (域运算符)
sizeof (长度运算符)
?: (条件运算符)
2)只能重载已有的运算符,不能创造新的
3)不改变原有运算符的优先级和结核性
注意:
只能重载为成员函数的运算符:
=
->
()
[]
分类:
1)赋值运算符:=
2)计算运算符: +,-,*,/,(单目运算符)++,–
3)关系运算符: >,<,>=,<=,==,!=
4)下标:[]
5)输入输出:>>, <<
6)类型转换运算符:double, int…
重载形式:
1)类的成员函数
2)友元函数
注意:前置后置运算符重载时参数的区别
前置:
A& A::operator++();成员函数
friend A& operator++(A&a);友元函数
后置:
A& A::operator++(int);成员函数
friend A& operator++(A&a,int);友元函数
规律:
- 如果返回值可能出现在=号左边, 则
可能作为左值, 返回非const引用。 - 如果返回值只能出现在=号右边, 则
只需作为右值, 返回const型引用、
const型值或者值。
e.g.1重载输入输出流
ostream& operator<<( ostream& out, const complex& obj)
{
out << obj.real << "."<< obj.imag;
return out;
}输出
istream& operator>>(istream& in, complex& obj)
{
in >> obj.real>> obj.imag;
return in;
}输入
重载下标运算符
int A::operator[](int c)
{
return b[c];
}
类型转换运算符
1)类型转换运算符的使用
隐式使用:
int i=3;
i=i+7.5;先将3转换成double,相加后得到的10.5转换成int类型,最后赋值给i
注意:最后的类型要符合左值的类型
2)重载
要求:
1)只能作为成员函数
2)不能规定返回值的类型,返回值类型自动根据函数名判断
e.g.编写complex复数类实现main函数
int main()
{
complex c1(3, 4), c2(5, -10), c3;
double d;
d = double(c1);
d = 2.5 + c1;
cout << d << endl;
return 0;
}
方式一:类型转换重载
{
double real, imag;
public:
complex(double a=0,double b=0):real(a),imag(b){}
operator double() { return real; }重载类型运算符
在这里, d = 2.5 + c1;语句可以认为先将c1转换成double类型再运算,不需要重载加号
};
方式二:组合类型重载和加号重载
operator double() { cout << "change" <<endl; return real; }
friend double operator+(double a, const complex& b);
注意:
对象在加号后面,不能使用成员函数
d = 2.5 + c1;优先使用加号重载,不再走方式一的途径
方式三:类型转换重载+加号重载+两个对象的加号重载
operator double() { cout << "change" <<endl; return real; }
friend double operator+(double a, const complex& b);
friend complex operator+(const complex& op1, const complex& op2);
最后一个重载不使用