before|正文之前:
c++实验代码及学习笔记(七)
你好! 这是一个高程实验课的代码记录及学习笔记。我将记录一些重要的知识点、易错点。但是作为大学生,水平很低,敬请指点教导、优化代码。
1问题
我们本节课详细讲解了运算符重载,这次的题目就是对知识的一次简单应用。关于题目,我们无需讲解,只需要再提炼一下运算符重载的精华。
2精讲
有一篇文章写得相当好:C++_运算符重载 总结
阅读那篇文章足矣。是什么,为什么不讲,只讲怎么做。
- 运算符重载的方式
类的成员函数 | 友元函数 |
---|---|
建议 一元运算符 | 建议 二元运算符 |
运算符需要改变类对象的状态 | 有数和对象混合运算 |
= ( ) [ ] -> | 二元,第一个操作符非对象 如<< |
- 运算符重载的规则
可以重载、不能重载的运算符
可以重载 | 不可重载 | |
---|---|---|
单目 | ++ – -(取负)*(指针)~ ! & | |
双目 | + - * / % > < >> <<(移位) | |
其他 | [] () -> | . .*(类指针)::(作用域)sizeof :?(条件运算) |
-
参数和返回值
当参数不会被改变,一般使用const传递
返回值看返回的是=左还是=右。一般右值可以返回const -
其他
a++(函数返回temp)/++a(函数返回*this)
重载()、<< >> 等(见参考文章)
类型转换函数
3代码实现
#include<iostream>
using namespace std;
class vec3
{
private:
double _x, _y, _z;
public:
vec3()
{}
vec3(double a,double b,double c):_x(a),_y(b),_z(c)
{}
~vec3()
{}
void set(double a, double b, double c)
{
_x = a;
_y = b;
_z = c;
}
void print() const
{
cout << "(" << _x << "," << _y << "," << _z <<")"<< endl;
}
bool equal(const vec3 &v)
{
if ((_x == v._x) && (_y == v._y) && (_z == v._z))
{
return true;
}
return false;
}
vec3 operator+(const vec3 &v)const
{
vec3 v1;
v1._x = _x + v._x;
v1._y = _y + v._y;
v1._z = _z + v._z;
return v1;
}
vec3 operator-(const vec3 &v)const
{
vec3 v1;
v1._x = _x - v._x;
v1._y = _y - v._y;
v1._z = _z - v._z;
return v1;
}
vec3 operator*(const vec3 &v)const
{
return(vec3(_x*v._x, _y*v._y, _z*v._z));
}
vec3 operator/(const vec3 & v)const
{
return(vec3(_x / v._x, _y / v._y, _z / v._z));
}
vec3& operator++()
{
*this = *this + vec3(1, 1, 1);
return *this;
}
vec3& operator+=(const vec3 &v)
{
*this = *this + v;
return *this;
}
friend bool operator==(const vec3&v1, const vec3&v2)
{
return v1._x == v2._x&&v1._y == v2._y&&v1._z == v2._z;
}
friend ostream& operator<<(ostream &os, const vec3&v)
{
os<< "(" << v._x << "," << v._y << "," << v._z <<")"<< endl;
return os;
}
};
int main()
{
vec3 v(1, 1, 1);
vec3 v1(-1, -1, 0);
v = v * v1;
cout << v ;
cout << bool(v == v1);
getchar();
return 0;
}
4最终效果
本次课程内容相对简单,重要的是练习与应用。如何将运算符重载发挥出它最大的作用,综合运用看似简单实则复杂的知识,将是有待进一步研究的问题。
感谢大家阅读,鞠躬下台!