【C++进阶】利用重载二元运算符改进平面向量类Vec2D
生活随笔
收集整理的這篇文章主要介紹了
【C++进阶】利用重载二元运算符改进平面向量类Vec2D
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
先前回顧
在【C++進階】 遵循TDD原則,實現平面向量類(Vec2D)中我們初步實現了Vec2D內容,現在做出一定的改進:
實現Vec2D的一半二元算數運算符重載
1、 + - (兩個Vec2D對象運算以及1個Vec2D對象與一個double數運算)
2、*(點乘和數乘)
同時將之前涉及對象拷貝的函數用傳引用的方式進行修改。
注意,若有對象拷貝則需要傳引用,如果只是簡單的值拷貝,則不需要傳引用。
知識點
先看看我們一般是怎么調用二元運算符:
注意最后一個是個“錯誤”的寫法,因為這個不屬于成員函數的寫法,z不是Vec2D類的對象。
但是常識告訴我們,這樣寫和d的寫法應該是一樣的。
下面是這幾個重載函數的原型,注意最后一個是個友元函數,關于友元函數記不清的,請回顧:https://blog.csdn.net/qq_42604176/article/details/109537139
struct Vec2D {Vec2D operator +(Vec2D); //成員函數Vec2D operator +(double); //成員函數friend Vec2D operator +(double, Vec2D); //非成員(友元)函數};Vec2D operator +(double, Vec2D) { // Do something}修改部分
1、首先完善h文件
#pragma once #include <iostream> #include <string> #include <cmath> #include <exception> class Vec2D { private:double x_;double y_; public:Vec2D();Vec2D(double , double );~Vec2D();// 將向量轉換為字符串表達形式std::string toString();// 向量加法Vec2D add(const Vec2D& secondVec2D);//與數值相加Vec2D add(double num);//加法函數的重載Vec2D operator +(const Vec2D& secondVec2D);Vec2D operator +(const double num);// 讀取或修改向量元素double& at(const int index);// 向量減法Vec2D subtract(const Vec2D& secondVec2D);//與數值相減Vec2D subtract(const double num);//減法函數的重載Vec2D operator -(const Vec2D& secondVec2D);Vec2D operator -(const double num);// 向量點積double dot(const Vec2D& secondVec2D);// 向量數乘Vec2D multiply(const double multiplier);//向量乘法的重載double operator *(const Vec2D& secondVec2D);Vec2D operator *(const double multiplier);//補充一個乘法友元函數friend Vec2D operator *(const double multiplier,Vec2D vec2d);// 向量求負值Vec2D negative();// 向量自增1Vec2D& increase();// 向量自減1Vec2D& decrease();// 求向量的范數(長度)double magnitude();// 求Vec2D與x+軸的夾角double direction();// 比較兩個向量的長度。如果firstVec2D小于secondVec2D,返回-1,若大于則返回1,若相等則返回0int compareTo(Vec2D secondVec2D); };2、在cpp文件中補充函數的具體細節
#include "Vec2D.h" Vec2D::Vec2D() {x_ = 0.0;y_ = 0.0; }Vec2D::Vec2D(double x, double y) {x_ = x;y_ = y; }Vec2D::~Vec2D() {}// 將向量轉換為字符串表達形式 std::string Vec2D::toString() {// TODO: 在此處添加實現代碼.return std::string("(" + std::to_string(x_) + ", "+ std::to_string(y_) + ")"); }// 向量加法 Vec2D Vec2D::add(const Vec2D& secondVec2D) {// TODO: 在此處添加實現代碼.return Vec2D(x_ + secondVec2D.x_ , y_ + secondVec2D.y_); } //與數值相加 Vec2D Vec2D::add(double num) {// TODO: 在此處添加實現代碼.return Vec2D(this->x_ + num , this->y_ + num); }//加法重載函數 Vec2D Vec2D::operator +(const Vec2D& secondVec2D) {return this->add(secondVec2D); } Vec2D Vec2D::operator +(const double num) {return this->add(num); }// 向量減法 Vec2D Vec2D::subtract(const Vec2D& secondVec2D) {// TODO: 在此處添加實現代碼.return Vec2D(x_ - secondVec2D.x_ , y_ - secondVec2D.y_); } // 向量減數 Vec2D Vec2D::subtract(const double num) {// TODO: 在此處添加實現代碼.return Vec2D(this->x_ - num , this->y_ - num); }//減法重載函數 Vec2D Vec2D::operator -(const Vec2D& secondVec2D) {return this->subtract(secondVec2D); } Vec2D Vec2D::operator -(const double num) {return this->subtract(num); }// 向量點積 double Vec2D::dot(const Vec2D& secondVec2D) {// TODO: 在此處添加實現代碼.return (x_ * secondVec2D.x_ + y_ * secondVec2D.y_); }// 向量數乘 Vec2D Vec2D::multiply(const double multiplier) {// TODO: 在此處添加實現代碼.return Vec2D(x_ * multiplier ,y_ * multiplier); }//乘法重載函數 Vec2D Vec2D::operator *(const double num) {return this->multiply(num); } double Vec2D::operator *(const Vec2D& secondVec2D) {return this->dot(secondVec2D); } //乘法友元函數,不是Vec2D的成員函數 Vec2D operator *(const double multiplier,Vec2D vec2d) {return vec2d.multiply(multiplier); }// 向量求負值 Vec2D Vec2D::negative() {// TODO: 在此處添加實現代碼.return Vec2D( -x_ , -y_); }// 向量自增1 Vec2D& Vec2D::increase() {x_++;y_++;// TODO: 在此處添加實現代碼.return (*this); }// 向量自減1 Vec2D& Vec2D::decrease() {x_--;y_--;// TODO: 在此處添加實現代碼.return (*this); }// 求向量的范數(長度) double Vec2D::magnitude() {// TODO: 在此處添加實現代碼.return sqrt(x_ * x_ + y_ * y_); }// 求Vec2D與x+軸的夾角 double Vec2D::direction() {// TODO: 在此處添加實現代碼.return atan(y_ / x_); }// 比較兩個向量的長度。如果firstVec2D小于secondVec2D,返回-1,若大于則返回1,若相等則返回0 int Vec2D::compareTo(Vec2D secondVec2D) {// TODO: 在此處添加實現代碼.double m1 = this->magnitude();double m2 = secondVec2D.magnitude();if(abs(m1 - m2) < 1e-10)return 0;elsereturn (m1 > m2 ? 1 : -1); }// 讀取或修改向量元素 double& Vec2D::at(const int index) {if( 0 == index)return x_;else if(1 == index)return y_;//使用異常處理的方式,拋出異常,并且打印攜帶信息elsethrow std::out_of_range("at() only accept 1 or 2 as parameter");// TODO: 在此處添加實現代碼.// TODO: 在此處插入 return 語句 }3、運行測試函數
#include <iostream> #include "Vec2D.h" using std::cout; using std::endl;int main() {//創建向量對象Vec2D v1{ 3,5 }, v2{ 4,6 };//向量轉為字符串cout << "v1 = " << v1.toString() << endl;cout << "v2 = " << v2.toString() << endl;//向量加法: 向量 + 向量 ,向量 + 數//Vec2D v3 = v1.add(v2);//Vec2D v4 = v3.add(10.0);//使用重載operator函數Vec2D v3 = v1 + v2;Vec2D v4 = v3 + 10.0;cout << "v3 = " << v3.toString() << endl;cout << "v4 = " << v4.toString() << endl;//向量減法,向量點積,向量數乘//Vec2D v5 = v2.subtract(v1);//double v6 = v2.dot(v1); //兩個向量的點積是一個數//Vec2D v7 = v3.multiply(2.1);//使用重載operator函數Vec2D v5 = v2 - v1;double v6 = v2 * v1; //兩個向量的點積是一個數Vec2D v7 = v3 * 2.1;cout << "v2 - v1 = " << v5.toString() << endl;cout << "v2 * v1 = " << v6 << endl;cout << "v3 * 2.1 = " << v7.toString() << endl;cout << "2.1 * v3 = " << (2.1 * v3).toString() << endl; //這里使用的是友元函數//向量求負值Vec2D v8 = v2.negative();cout << "-v2 = " << v8.toString() << endl;//向量自增/自減cout << " ++v8 = " << v8.increase().toString() << endl;cout << " --v2 = " << v2.decrease().toString() << endl;//讀取或者修改向量元素cout << "v1.x_ = " << v1.at(0) << endl;cout << "v1.y_ = " << v1.at(1) << endl;//向量的長度magnitude 和角度directioncout << "v1.magnitude = " << v1.magnitude() << endl;cout << "v1.direction = " << v1.direction() << endl;//比較兩個向量cout << "v1 compare v2 :" << v1.compareTo(v2) << endl;return 0; }4、得到測試結果
總結
以上是生活随笔為你收集整理的【C++进阶】利用重载二元运算符改进平面向量类Vec2D的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DSP关于存储器读写、IO读写时序图的注
- 下一篇: 海思3798机顶盒的用户名和密码多少