C++学习13(23.10.27)运算符与重载

83 阅读4分钟

1 运算符

1.1 优先级

常见的运算符按照优先级从高到低的顺序:

  1. 一元运算符:+-++--*(解引用)等
  2. 算术运算符:*/%
  3. 算术运算符:+-
  4. 移位运算符:<<>>
  5. 关系运算符:<><=>=
  6. 相等运算符:==!=
  7. 位运算符:&
  8. 位运算符:^
  9. 位运算符:|
  10. 逻辑运算符:&&
  11. 逻辑运算符:||
  12. 条件运算符:?:
  13. 赋值运算符:=
  14. 逗号运算符:,(最低优先级)

1.2 vector:

在C++中,vector是一个动态数组,可以根据需要自动增长或缩小大小。它是标准模板库(STL)中的一部分,提供了许多有用的函数和操作,使得使用动态数组变得非常方便。

1创建vector:可以使用默认构造函数创建一个空的vector,也可以使用带有初始值的构造函数创建一个包含初始元素的vector。

// 创建空的vector 
std::vector v1;
// 创建包含三个初始元素的vector
std::vector v2 = {1, 2, 3};

2 访问vector元素:可以使用下标运算符[]或者at()函数来访问vector中的元素

std::vector<int> v = {1, 2, 3};

// 使用下标运算符访问第二个元素
int second = v[1];

// 使用at()函数访问第三个元素
int third = v.at(2);

3 添加元素:可以使用push_back()函数在vector的末尾添加一个元素

std::vector v = {1, 2, 3};
// 在末尾添加一个元素
v.push_back(4); 

4 删除元素:可以使用pop_back()函数删除vector末尾的一个元素,也可以使用erase()函数删除指定位置的一个或多个元素

std::vector<int> v = {1, 2, 3, 4};

// 删除末尾的一个元素
v.pop_back();

// 删除第二个元素
v.erase(v.begin() + 1);

5 获取vector大小:可以使用size()函数获取vector中元素的数量

std::vector<int> v = {1, 2, 3};

// 获取vector中元素的数量
int size = v.size();

6 遍历vector:可以使用for循环或者迭代器来遍历vector中的元素

std::vector<int> v = {1, 2, 3};

// 使用for循环遍历vector中的元素
for (int i = 0; i < v.size(); i++) {
    std::cout << v[i] << " ";
}

// 使用迭代器遍历vector中的元素
for (auto it = v.begin(); it != v.end(); it++) {
    std::cout << *it << " ";
}

需要注意的是,由于vector是一个动态数组,它可以自动增长或缩小大小,因此在访问vector元素时需要确保下标不越界。另外,由于vector是一个对象,因此在传递vector参数时应该使用引用,以避免不必要的复制。

#include <iostream>
#include <vector>

// 函数接受一个vector参数,并修改其中的元素
void modifyVector(std::vector<int>& vec) {
    vec.push_back(4);
    vec[0] = 10;
}

int main() {
    std::vector<int> myVector = {1, 2, 3};

    // 通过引用传递vector参数
    modifyVector(myVector);

    // 输出修改后的vector
    for (int num : myVector) {
        std::cout << num << " ";
    }

    return 0;
}

解析:

定义了一个名为modifyVector的函数,它接受一个vector参数,并在其中添加一个元素并修改第一个元素的值。注意函数参数的类型是std::vector&表示传递的是一个vector的引用。 在main函数中,我们创建了一个vector对象myVector,然后将其传递给modifyVector函数。由于使用了引用传递,modifyVector函数直接操作了原始的myVector对象,而不是创建副本。因此,在函数结束后,我们可以看到myVector已经被修改。 总结起来,当需要在函数中修改vector对象时,应该使用引用作为参数类型。这样可以避免不必要的复制,并确保对原始对象的修改能够生效。

1.3  运算符重载

在C++中,运算符重载是一种特殊的函数重载,它允许我们为自定义类型定义运算符的行为。通过运算符重载,我们可以使用常见的运算符(如+-*/等)来操作自定义类型的对象,使代码更加简洁和直观。

 允许我们为自定义的类或结构体定义操作符的行为。这样我们就可以使用自定义类型的对象,就像使用内置类型一样,使代码更加直观和易读。

举个例子,假设我们有一个名为Vector2的结构体,表示二维向量。我们可以通过重载+运算符来实现向量的加法操作,使得可以使用vector1 + vector2这样的语法来执行向量相加的操作。

代码示例1

#include <iostream>
class Complex{
private:
   double real;
   double imaginary;

public:
   Complex(double r,double i):real(r),imaginary(i){}
   //加法运算符的重载
   Complex operator+(const Complex& other) const {
      return Complex(real + other.real,imaginary + other.imaginary);
   }
   //输出运算符的重载
   friend std::ostream& operator<<(std::ostream& os, const Complex& c ){
      os << c.real << "+" << c.imaginary << "i";
      return os;
   }

};

int main(){
   Complex c1(2.0, 3.0);
   Complex c2(1.0, 2.0);

   //使用加法运算符重载
   Complex result = c1 + c2;
   std::cout << "result:" << result << std::endl;

   return 0;
}

代码示例2

#include <iostream>
#include <string>

struct Vector2
{
   float x,y;
   Vector2(float x, float y)
      : x(x), y(y) {}
   Vector2 Add(const Vector2& other) const
   {
      return Vector2(x + other.x, y + other.y);
   }

   Vector2 operator+(const Vector2& other) const
   {
      return Add(other);
   }

   Vector2 Multiply(const Vector2& other) const
   {
      return Vector2(x * other.x, y * other.y);
   }
   Vector2 operator*(const Vector2& other)const
   {
      return Multiply(other);
   }

   bool operator==(const Vector2& other) const
   {
      return x == other.x && y == other.y;
   }
   bool operator!=(const Vector2& other) const
   {
      return !(*this == other);
   }

};

std::ostream& operator << (std::ostream& stream, const Vector2& other)
{
   stream << other.x << "," << other.y;
   return stream;
}


int main()
{
   Vector2 position(4.0f, 4.0f);
   Vector2 speed(0.5f, 1.5f);

   //Vector2 result = position.Add(speed);
   Vector2 powerup(1.1f, 1.1f);

   Vector2 result1 = position.Add(speed.Multiply(powerup));
   Vector2 result2 = position + speed * powerup;

   std::cout << result2 << std::endl;
   std::cin.get();
}