c++操作符重载实现
来源:互联网 发布:软件系统技术说明书 编辑:程序博客网 时间:2024/06/05 04:21
为什么要用操作符重载
首先我们看一个例子。
class Complex
{
public:
int a;
int b;
public:
Complex(int a = 0,int b=0)
{
this->a = a;
this->b = b;
}
void print()
{
cout << "a:" << a << endl;
cout << "b:" << b << endl;
}
};
void main01()
{
Complex c1(1, 2), c2(3, 4);
int a = 10, b = 20;
a = a + b;// int 是基础类新,编译器已经为这些类型提供+操作了。
//c1 = c1 + c2;// c1的类型是complex,这种类型是自定义类型,编译器根本不知道如何加。
}
通过这个例子我们知道对于自定义数据类型,编译器根本不知道如何解析操作符。但是c++编译器会给你提供一种机制,让你实现自定义类型加。这就引入了操作符重载的概念。
C++允许用户通过自定义的方式实现操作符重载。
操作符重载初探:
class Complex
{
public:
int a;
int b;
public:
Complex(int a = 0,int b=0)
{
this->a = a;
this->b = b;
}
void print()
{
cout << "a:" << a << endl;
cout << "b:" << b << endl;
}
};
Complex add(Complex& c1,Complex& c2)
{
Complex tmp;
tmp.a = c1.a + c2.a;
tmp.b = c1.b + c2.b;
return tmp;
}
// 操作符重载首先是通过函数实现的。记住operator+是函数名。
Complex operator+(Complex& c1, Complex& c2)
{
Complex tmp;
tmp.a = c1.a + c2.a;
tmp.b = c1.b + c2.b;
return tmp;
}
void main()
{
Complex c1(1, 2), c2(3, 4);
// Complex c3 = add(c1, c2);
// Complex c3 = operator+(c1, c2);
Complex c3 = c1 + c2;
c3.print();
}
上面的例子我们发现add(c1, c2); operator+(c1, c2); c1 + c2是等价的,换句话说,重载的操作符本质上是一个函数名。
C++操作符重载有两种方式实现:友元函数,成员函数。
1 友元函数实现操作符重载
class Complex
{
private:
int a;
int b;
friend Complex operator+(Complex &c1, Complex& c2);
friend Complex& operator++(Complex &c2);
public:
Complex(int a = 0, int b = 0)
{
this->a = a;
this->b = b;
}
void print()
{
cout << "a:" << a << endl;
cout << "b:" << b << endl;
}
};
// 操作符重载首先是通过函数实现的。operator+是函数名。
Complex operator+(Complex &c1, Complex& c2)
{
Complex tmp;
tmp.a = c1.a + c2.a;
tmp.b = c1.b + c2.b;
return tmp;
}
// 实现前置++;operator++是函数名。
Complex& operator++(Complex &c2)
{
c2.a++;
c2.b++;
return c2;
}
void main()
{
Complex c1(1, 2), c2(3, 4);
Complex c3 = c1 + c2; //等价于:Complex c3 = operator+(c1, c2);
c3.print();
Complex c4(5, 6);
++c4; //等价于: operator++(c4);
c4.print();
}
注释:
c++中不能用友元函数重载的运算符有:= () [ ] ->
2 成员函数实现操作符重载
class Complex
{
private:
int a;
int b;
public:
Complex(int a = 0, int b = 0)
{
this->a = a;
this->b = b;
}
void print()
{
cout << "a:" << a << endl;
cout << "b:" << b << endl;
}
// 操作符重载首先是通过函数实现的。operator+是函数名。
Complex& operator+(Complex& c2)
{
a = a + c2.a;
b = b + c2.b;
return *this;
}
Complex& operator++()
{
this->a++;
this->b++;
return *this;
}
};
void main()
{
Complex c1(1, 2), c2(3, 4);
Complex c3 = c1 + c2;//相当于Complex c3 = c1.operator+(c2);
c3.print();
Complex c4(5, 6);
++c4;//相当于 c4.operator++();
c4.print();
}
- C++【操作符重载】
- c++::操作符重载
- C++:操作符重载
- 操作符重载(C++)
- C++-重载操作符<< >> = + - * /
- c++_操作符重载
- C/C++ 之 ‘++’、‘+’、‘+=’、‘-’、‘()’、‘--’ 操作符的重载实现重载
- c++操作符重载实现
- C/C++: 操作符重载案例
- 操作符重载专题-实现基本操作符重载
- C++操作符重载专题(C++)
- 类型转换和操作符重载 (c#)
- C++——操作符重载
- 重载操作符 (c++primer 4e)
- 【C++】 重载操作符类编程
- 自定义数据类型,操作符重载实例[C#]
- C++primer读书笔记8-重载操作符
- C/C++ 之 操作符重载
- 常见对象-把数组拼接成指定格式的字符串案例
- 在servlet中创建和应用session
- 数据结构---链表队
- 仅仅作为计划提醒
- 洛谷OJ
- c++操作符重载实现
- SAP GUI 750全新风采
- JavaScript中运算符的优先级
- 《RDF Graph Partitions: a Brief Survey》——笔记
- 未来物联网全栈开发 --JavaScript or Python?
- Construct Binary Tree from Inorder and Postorder Traversal
- Java虚拟机(三)垃圾标记算法与Java对象的生命周期
- 【C语言】、杨氏矩阵
- TensorFlow 实战资料汇总