C++程序 创建自定义向量类的程序

C++程序 创建自定义向量类的程序

前言

向量是在很多科学、工程和数学领域都经常用到的一个重要数据结构。在C++中,我们可以使用STL库中的vector来实现向量操作,但是在某些情况下,需要自定义向量类,以便于更好地满足实际的应用需求。下面,我将介绍如何在C++中创建自定义向量类的程序,并提供相应的示例代码。

创建Vector类

首先,在C++中,我们可以用一个类来表示向量,该类可以包含向量长度、向量的起点、终点等信息。代码如下:

#include <iostream>
#include <cmath>

using namespace std;

class Vector {
public:
    Vector(int x=0, int y=0) : x(x), y(y) {}

    int getX() const {
        return x;
    }

    int getY() const {
        return y;
    }

    double length() const {
        return sqrt(x*x + y*y);
    }

    friend Vector operator+(const Vector& v1, const Vector& v2) {
        return Vector(v1.x+v2.x, v1.y+v2.y);
    }

    friend Vector operator-(const Vector& v1, const Vector& v2) {
        return Vector(v1.x-v2.x, v1.y-v2.y);
    }

private:
    int x, y;
};

int main() {
    Vector v1(3, 4), v2(1, 2);
    Vector v3 = v1 + v2;
    Vector v4 = v1 - v2;
    cout << "v1 = (" << v1.getX() << ", " << v1.getY() << ")" << endl;
    cout << "v2 = (" << v2.getX() << ", " << v2.getY() << ")" << endl;
    cout << "v1 + v2 = (" << v3.getX() << ", " << v3.getY() << "), length = " << v3.length() << endl;
    cout << "v1 - v2 = (" << v4.getX() << ", " << v4.getY() << "), length = " << v4.length() << endl;
    return 0;
}

在上面的代码中,我们定义了一个Vector类,并实现了向量的加、减、求长度等操作。

操作符重载

为了方便使用,我们可以为自定义的向量类重载各种操作符,例如加法、减法、乘法等。下面是一个重载加法和减法运算符的例子:

friend Vector operator+(const Vector& v1, const Vector& v2) {
    return Vector(v1.x+v2.x, v1.y+v2.y);
}

friend Vector operator-(const Vector& v1, const Vector& v2) {
    return Vector(v1.x-v2.x, v1.y-v2.y);
}

使用重载后的加法和减法运算符,可以更方便地实现向量加、减等操作,例如:

Vector v1(3, 4), v2(1, 2);
Vector v3 = v1 + v2;
Vector v4 = v1 - v2;

封装和继承

在实际应用中,我们会遇到一些需求,例如需求输出两个向量夹角的余弦值,或者将向量类拓展为二维或三维向量类等。这些需求可以通过封装和继承来实现。下面给出相应的代码示例。

封装:

class Vector {
public:
    Vector(int x=0, int y=0) : x(x), y(y) {}

    ...

    double angle(const Vector& v) const {
        double cosTheta = dotProduct(*this, v) / (this->length() * v.length());
        return cosTheta;
    }

private:
    int x, y;

    static double dotProduct(const Vector& v1, const Vector& v2) {
        return v1.x*v2.x + v1.y*v2.y;
    }
};

在上面的代码中,我们实现了一个夹角函数,该函数能够计算出两个向量的夹角余弦值。这里我们使用了静态成员函数来实现点积运算,而不必在类外部实现相应的函数。

继承:

class Vector2D : public Vector {
public:
    Vector2D(int x=0, int y=0) : Vector(x, y) {}

    double crossProduct(const Vector2D& v) const {
        return this->getX()*v.getY() - this->getY()*v.getX();
    }
};

class Vector3D : public Vector {
public:
    Vector3D(int x=0, int y=0, int z=0) : Vector(x, y), z(z) {}

    int getZ() const {
        return z;
    }

    Vector3D crossProduct(const Vector3D& v) const {
        int x = this->getY()*v.getZ() - this->getZ()*v.getY();
        int y = this->getZ()*v.getX() - this->getX()*v.getZ();
        int z = this->getX()*v.getY() - this->getY()*v.getX();
        return Vector3D(x, y, z);
    }

private:
    int z;
};

在上面的代码中,我们定义了两个类:二维向量类和三维向量类,它们都继承自Vector类。这里我们使用了继承来实现向量类的拓展,使得我们可以更方便地操作二维或三维向量。

总结

在C++中创建自定义向量类可以帮助我们更好地满足实际应用的需求。通过封装、继承等技术,我们可以扩展自定义向量类的功能,使得它适用于更广泛的应用领域。希望读者能够通过本文所述内容,掌握如何在C++中创建自定义向量类,并应用到实际的编程中。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 示例