本文是对"铁道版"c++一书的知识点总结,如果侵权,请及时告知我,将尽快删去,本文禁止转载
运算符重载
运算符重载为类的友元函数和成员函数
友元运算符重载函数
class X
{
…
friend 返回类型 operator 运算符(形参表);
…
};
返回类型 operator 运算符(形参表)
{
函数体
}
@表示运算符
aa@bb;隐式调用
operator@(aa,bb);显式调用
complex operator+(complex &a, complex &b)
{
complex temp;
…
return temp;
}
可以改写为
complex operator+ (complex &a, complex &b)
{
return complex(a.real+b.real,a.imag+b.imag);
}
这种方法建立一个无名对象,它没有对象名,是一个无名对象
在建立临时对象过程中调用构造函数,return语句将此临时对象作为函数返回值,这种方法的执行效率比较高
friend X operator++ (X &op);前缀方式
friend X operator++ (X &op,int);后缀方式
@表示运算符
@aa;隐式调用
operator@(aa);显式调用
- 运算符重载函数operator@()可以返回任何类型,甚至可以是void类型,但通常返回的雷响与它所操作的类的类型相同,这样可使重载运算符用在复杂的表达式中
- 有的运算符不能定义为友元运算符重载函数,如赋值运算符=、下标运算符[]、函数调用运算符()等
- c++编译器根据参数个数和类型来决定调用哪个重载函数,因此,可以为同一个运算符定义几个运算符重载函数来进行不同的操作
成员运算符重载函数
返回类型 operator 运算符(形参表)
{
函数体
}
class X
{
…
返回类型 operator 运算符(形参表);
…
};
返回类型 X::operator 运算符(形参表)
{
函数体
}
双目运算符@
aa@bb;隐式调用
aa.operator@(bb);显式调用
X operator ++();前缀方式
X operator ++(int);后缀方式
单目运算符(前缀)@
@aa;隐式调用
aa.operator@();显式调用
单目运算符(后缀)@
aa@;隐式调用
aa.operator@(int);显式调用,int可以用任意合法整数表示
c++中只能对已有的c++运算符进行重载,不允许用户自己定义新的运算符
c++中绝大部分的运算符允许重载,不能重载的运算符只有以下几个:
. 成员访问运算符
.* 成员指针访问运算符
:: 作用域运算符
sizeof 长度运算符
?: 条件运算符
一般来说,重载的功能应当与原有的功能相类似
重载不能改变运算符的操作对象(即操作数)的个数
重载不能改变运算符原有的优先级
重载不能改变运算符原有的结合特性
运算符重载函数的参数至少应有一个是类对象(或类对象的引用),防止用户修改用于基本类型数据的运算符性质
双目运算符一般可以被重载为友元运算符重载函数或成员运算符重载函数,但是当类AB的一个对象与一个整数相加时,无论整数出现在左侧还是右侧,使用友元运算符重载函数都能得到很好的解决,这就解决了使用成员运算符重载函数时,由于整数出现在运算符”+”的左侧而出现的错误
类的赋值运算符”=”只能重载为成员函数,而不能把它重载为友元函数,双目运算符
下标运算符”[]”只能重载为成员函数,双目运算符
“()” 只能重载为成员函数,双目运算符
重载插入运算符和提取运算符
ostream& operator<<(ostream& out,自定义类名& obj)
{
…
}
istream& operator>>(istream& in,自定义类名& obj)
{
…
}
通过转换构造函数进行类型转换
转换构造函数是构造函数的一种,它具有类型转换的作用,它的作用是将一个其他类型的数据转换成它所在类的对象
class Example
{
public:
Example(int);
private:
int num;
};
Example:: Example(int n)
{
num=n;
};
int main()
{
Example X= Example(3);
}
通常, 使用转换构造函数将一个指定的数据转换为类对象的方法如下:
声明一个类
在这个类中定义一个只有一个参数的构造函数,参数是待转换类型的数据,在函数体中指定转换的方法
使用以下形式进行类型转换
类名(待转换类型的数据)
- 转换构造函数也是一种构造函数,它遵循构造函数的一般规则,转换构造函数只有一个参数,作用是将一个其他类型的数据转换成他所在类的对象,但是有一个参数的构造函数不一定是转换构造函数,它可以是普通的构造函数,仅仅起对象初始化的作用
- 转换构造函数不仅可以将一个系统预定义的标准类型数据转换成类的对象,也可以将另一个类的对象转换成转换构造函数所在的类对象
通过类型转换函数进行类型转换
将一个类的对象转换成另一类型的数据
operator 目标类型()
{
函数体
}
目标类型为希望转换成的类型,它既可以是预定义的标准数据类型也可以是其他类的类型
- 类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数,类型转换函数也可以在类体中声明函数原型,而将函数体定义在类的外部
- 类型转换函数既没有参数,也不能在函数名前指定返回类型
- 类型转换函数中必须有return语句,即必须送回目标类型的数据作为函数的返回值
- 一个类可以定义多个类型转换函数.c++编译器将根据类型转换函数名自动选择一个合适的类型转换函数予以调用
使用类型转换函数可以分为显式转换和隐式转换