从Vec3实现复习运算符重载
三维向量是计算几何中常用的基本类
下面对其进行解析
代码来源:https://github.com/GPSnoopy/RayTracingInOneWeekend/blob/master/cpp/Vec3.h
三五法则定义类
一个基本的类构成
Vec3() = default;
Vec3(const Vec3&) = default;
Vec3(Vec3&&) = default;
~Vec3() = default;
Vec3& operator = (const Vec3&) = default;
Vec3& operator = (Vec3&&) = default;
构造函数
拷贝构造函数
移动构造函数
析构函数
拷贝赋值函数
移动赋值函数
额外的构造函数
explicit Vec3(const float a) : x_(a), y_(a), z_(a) { }
Vec3(const float x, const float y, const float z) : x_(x), y_(y), z_(z) { }
防止隐式调用
运算符重载
运算符重载有两个操作
一个是写成内部 一个是写成外部
外部一半要写成友元函数的形式
在本代码中通过两个操作规避了写友元函数的形式
1、利用已经实现的函数直接操作
inline Vec3 operator + (const Vec3& left, const Vec3& right) { return Vec3(left) += right; }
这里注意Vec3(left)
相当于创建了一个临时变量因此最终返回值是Vec3
而不是Vec3&
2、利用外置接口
{
float x() const { return x_; }
float y() const { return y_; }
float z() const { return z_; }
}
inline Vec3 operator + (const float left, const Vec3& right) { return { left + right.x(), left + right.y(), left + right.z() }; }
运算符重载的返回值根据实际类型决定
例如+ - * /都要返回类型
如a=b+3 a肯定和b是两个
<< 运算符要写在外部
osstream& operator<<(ostream& cout, const 结构& g);{ return cout}
单目运算符的两个形式
成员函数版:CGirl &operator++(); // ++前置
成员函数版:CGirl operator++(int); // 后置++