一.函数重载
1.什么是函数重载?
函数重载指的是在同一个作用域下,一组函数的函数名相同,但是形参列表(类型、顺序、个数)不同,这样的函数就构成了函数重载。
注意:函数返回值类型和函数重载无关
函数重载示例:
//构成函数重载
int add(int a, int b)
{
return a + b;
}
int add(int a, int b,int c)
{
return a + b + c;
}
float add(float a, int b)
{
return a + b;
}
float add(int a, float b)
{
return a + b;
}
//下面两个函数不构成函数重载
//返回值类型不是函数重载的决定因素
float add(int a, float b)
{
return a + b;
}
double add(int a, float b)
{
return a + b;
}
2.c语言不支持函数重载的原因
c语言进行函数修饰时只用到了函数名的信息,函数名相同修饰之后也是一样的名字,对于同名函数编译器没办法区分,会认为函数重定义,所以不支持函数重载。
3.C++函数重载的底层原理
对于同名函数,C++根据函数名和参数列表对函数名进行修饰,修饰之后同名的函数编译器也能进行区分。
例如:
g++的函数修饰规则是
_Z+函数名字符个数+函数名+形参列表类型首字母
因此,同名函数如果只有返回值类型不相同,修饰之后编译器还是没办法区分,会认为函数重定义。
二.运算符重载
运算符重载可以认为是函数重载的一种特殊形式
1.运算符重载的作用
让自定义类型可以和基础类型一样进行多种形式的运算,让内置类型的运算符支持自定义类型的运算,为编程带来便捷
2.运算符重载的格式
返回值类型 operator+运算符(参数列表)
{}
示例:
Date& operator+=(const Date& date)
{
//-------
return *this;
}
3.运算符重载的特点
(1) 只能重载已有的运算符,不能创造新的运算符;
(2) 内置类型的运算逻辑不能修改,也就是说不能改变已有的运算符的基本功能,比如将+改为-;
(3) 作为类成员的运算符重载函数,参数比正常函数少一个,第一个参数为隐含的this指针;
示例:
(4) 运算符重载函数的完整形式:
对象1. + operator + 运算符 + 对象2
简写形式:对象1+运算符+对象2(可读性高)
示例:
完整形式:d1.operator==(d2)
简写形式:d1==d2
(5) 如果要进行连续赋值,返回值类型不能为空,返回值类型必须是当前类型的引用
关于此处知识点我犯的错误:
d4是一个新创建的对象,不能使用赋值操作,赋值操作是对一个已经存在的对象进行的,上面代码的最后一行语句实际上调用的是拷贝构造。