提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
运算符重载的浅显理解
前言
提示:这里可以添加本文要记录的大概内容:
记性不太好,学过就忘记.
所以做好笔记很重要.
提示:以下是本篇文章正文内容,下面案例可供参考
一.对重载的理解
C++的函数重载很重要.
将符号带入到函数名的重载函数也就是运算符重载.
运算符重载本质是拥有特殊函数名的函数
if(d1== d2) 等价于 d1.operate==(d2);
二.函数结构
[返回值类型] [关键字operate] [操作符] [参数列表]
T operate+(T d1,T d2){return {d1.a+d2.a , d1.b+d2.b};}
三.注意
1.作为类成员的重载函数时.其形参默认有一个是this.不填就是1个参数.填1个就是2个参数
*this解引用后就是参数的具体数值了.
2.操作符必须是已有的.不能自己创造.例如@就不是操作符所以不能重载.
3.这五个运算符不支持重载 .* :: sizeof ?: .
4.负号和减号重载的区别.检查参数.只有1个参数那就是负数.如果有两个参数就是减号
5.后++的声明中多一个形参.不需要实参
创建一个同类对象作为副本返回值.且返回类型不能是引用.因为局部变量的引用是没用的…应该直接返回对象.
自增后返回对象副本.直接返回自增对象就成前++了
6.赋值运算符必须是类内成员(=等号)
返回值必须是this对象的引用
和拷贝构造是有区别的
赋值运算符:不创建新对象.是对已有对象的赋值
拷贝构造:会创建一个新的对象.例如对象初始化,参数的非引用传递
MyInt &operator=(int i){
a=i;
return *this;
}
7.类型转换符
1.必须是成员函数.
2.没有返回值类型
3.形参表为空
class MyInt {
int a=5;
public:
operator int(){
return a;
}
}
int main(){
MyInt m;
int n =m;//这里是不是也等价于 int n = int(m); 此时int对应重载的函数名
}
8.[]下标符号重载
只能在类内声明,且只有一个参数(默认有一个this)
class MyInt {
int a[]={1,2,3,4};
public:
int& operator[](int index){
return a[index];//这里返回的是数组的引用,所以可以给返回值再赋值
}
}
9.()重载函数调用符
class MyInt {
int a = 5;
public:
bool operator()(int x){
return x>5;//参数大于成员变量返回真,否则返回假
}
}
int main(){
MyInt a;
a(10);//返回真
a(3);//返回假
}
调用lambda表达式相当于直接调用它的operator()函数