操作符重载应该设计成类成员函数还是普通非成员函数?
来源:互联网 发布:java程序员成长之路 编辑:程序博客网 时间:2024/05/02 00:54
四小点:
1.=,[ ],( ),->这四个操作符重载必须定义为类成员函数。
2.复合赋值操作符重载通常应定义为类成员函数。复合赋值操作符如*=,+=等。但是不一定得这么做。
3.改变对象状态或者与给定对象联系紧密的操作符,如++,---,*等,通常定义为类成员函数。
4.对称操作符,如算术,相等,关系,位操作符,最好定义成普通非成员函数。
下面是自己N年之前写过的一个3D类:
#include <iostream>using namespace std;class Vector3{public:double x,y,z;public:Vector3(double nx = 0.0,double ny = 0.0,double nz = 0.0):x(nx),y(ny),z(nz){}Vector3(const Vector3 &rhs){operator = (rhs);}Vector3& operator =(const Vector3 &rhs){if(this != &rhs){x = rhs.x;y = rhs.y;z = rhs.z;}return *this;}void zero(){x = 0.0;y = 0.0;z = 0.0;}Vector3 operator - () const{return Vector3(-x,-y,-z);}Vector3& operator += (const Vector3 &rhs){x += rhs.x;y += rhs.y;z += rhs.z;return *this;}Vector3& operator -= (const Vector3 &rhs){x -= rhs.x;y -= rhs.y;z -= rhs.z;return *this;}Vector3& operator *= (double a){x *= a;y *= a;z *= a;return *this;}Vector3& operator /= (double a){double oneOverA = 1 /a; x *= oneOverA;y *= oneOverA;z *= oneOverA;return *this;}void normalize() //标准化{double Mag = sqrt(x * x + y * y + z * z);if(Mag > 0.0){double oneOverMag = 1.0 / Mag;x *= oneOverMag;y *= oneOverMag;z *= oneOverMag;}}void print() const{cout << x << " " << y << " " << z << endl;}};bool operator ==(const Vector3 &lhs, const Vector3 &rhs){return lhs.x == rhs.x && lhs.y == rhs.y && lhs.z ==rhs.z;}bool operator !=(const Vector3 &lhs, const Vector3 &rhs){return !(lhs == rhs);}Vector3 operator + (const Vector3 &lhs, const Vector3 &rhs){Vector3 temp(lhs);temp += rhs;return temp;}Vector3 operator - (const Vector3 &lhs, const Vector3 &rhs){Vector3 temp(lhs);temp -= rhs;return temp;}Vector3 operator * (const Vector3 &lhs, double a) //标量右乘{Vector3 temp(lhs);temp *= a;return temp;}Vector3 operator * (double a,const Vector3 &rhs) //标量左乘{Vector3 temp(rhs);temp *= a;return temp;}Vector3 operator * (const Vector3 &lhs, const Vector3 &rhs) //点乘{return Vector3(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z);}Vector3 crossProduce(const Vector3 &lhs, const Vector3 &rhs) //叉乘{return Vector3(lhs.y * rhs.z - lhs.z * rhs.y,lhs.z * rhs.x - lhs.x * rhs.z,lhs.x * rhs.y - lhs.y * rhs.x);}double vectorMag(const Vector3 &a) //求模{return sqrt(a.x * a.x + a.y* a.y + a.z * a.z);}double Distance(const Vector3 &lhs, const Vector3 &rhs) //求距离{Vector3 temp = rhs - lhs;return vectorMag(temp);}int main(){Vector3 a(1,2,3);Vector3 b(1,1,1);Vector3 c = a * 3;c.print();Vector3 d = 3 * a;d.print();Vector3 e = -a;e.print();return 0;}
0 0
- 操作符重载应该设计成类成员函数还是普通非成员函数?
- 将重载运算符定义为成员函数还是普通的非成员函数
- 重载的操作符成员函数与非成员函数
- 操作符重载成员还是非成员函数选择【c++ primer 】
- 操作符重载为成员函数还是友元函数?
- 重载操作符时选择成员还是非成员实现
- 普通函数和类成员函数const重载
- 操作符重载:类成员函数和全局函数
- 运算符重载 定义为类成员函数or非成员函数
- C++基础知识复习--运算符重载(非成员函数重载和成员函数重载)
- 4.操作符重载:成员还是非成员 和 5.重载、缺省值以及省略符
- Day41、静态成员变量、静态成员函数、单例模式、成员/成员函数指针、操作符重载、友元函数
- C#学习之静态成员和非静态成员,构造函数,方法,方法参数,操作符重载,事件
- 二元运算符应设计成非成员函数
- 运算符重载函数:友元函数 成员函数 普通函数
- 函数指针--成员函数(静态,非静态)&普通函数
- 在类中const成员函数和非const成员函数可以作为重载成员函数同时存在
- C++ 友元函数和非成员运算符重载
- 【分享】国内某B2C电子商务网站的数据集
- jq如何获取id名带.(点)的标签
- 提高编程能力的7条建议
- 软件开发流程
- Android DES加密工具
- 操作符重载应该设计成类成员函数还是普通非成员函数?
- windows下连接linux环境共享文件的配置过程
- Conversion Operators in OpenCascade
- Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
- Android & Linux的suspent和resume执行流程
- sql函数能判断字段是否包含英文
- 电脑技术(1)服务器常见故障代码
- 【OpenCV】高斯混合背景建模
- 护民图库CAD制图