文章目录
重载
函数重载
函数同名,可以通过不同的参数表来区分,定义不同的行为。
构造/析构函数
构造函数可以重载为多种形式。析构函数不能被重载。
复制构造函数
当类中有指针或引用指向外部空间时,需要考虑对象的深拷贝和浅拷贝的问题。
可以通过重载一个传入同类对象参数的构造函数,来创建复制构造函数(Copy Constructor),实现显式的深拷贝。
Class::Class(const Class& obj)
{
// Deep copy implementation.
}
同时,需要通过重载赋值元素运算符 =
来完成隐式的深拷贝,避免用户在使用过程中出现不易察觉的错误。
算符重载
算符重载本质上是定义和调用函数的另外一种方式(语法糖)。
C++内置类型的算符无法被修改,只能够重载用户自定义类的算符,以告知程序如何对某个自定类做算符运算。所以算符的重载是以类成员函数/友元函数定义的方式进行的。显然,也只有参数至少有一个自定义类的算符能够被重载。
ReturnType Class::operator@(Argument List)
{
// Implementation.
}
可以看出本质上是在定义一个名为 operator@
的成员函数。 a@b
本质上为 a.operator@(b)
。
注意,重载不能够改变算符原生存在的运算优先顺序。
算符
只能够重载C++语言中原生的算符,无法定义新的算符。算符数量不足时,额外功能只能通过函数定义实现。
在类定义时, = & ,
等算符已经被预定义。可以重载 =
算符在实现赋值时的深拷贝(否则默认情况下仅仅为浅拷贝)。
重载算符的操作变量数与重载前其原生操作变量数相同,一元操作符仍为一元,二元操作符仍为二元。其中 -
例外,其原生状态下有一元(取负)和二元(减法)两种功能。
-
不是所有的算符都能够被重载,不能被重载的算符有: