operator overloading in c++

#include <iostream>

class Complex {
private:
    double real;
    double imag;

public:
    Complex() : real(0), imag(0) {}

    Complex(double r, double i) : real(r), imag(i) {}

    Complex operator + (const Complex& obj) const {
        Complex temp;
        temp.real = real + obj.real;
        temp.imag = imag + obj.imag;
        return temp;
    }

    Complex operator - (const Complex& obj) const {
        Complex temp;
        temp.real = real - obj.real;
        temp.imag = imag - obj.imag;
        return temp;
    }

    Complex operator * (const Complex& obj) const {
        Complex temp;
        temp.real = (real  obj.real) - (imag  obj.imag);
        temp.imag = (real  obj.imag) + (imag  obj.real);
        return temp;
    }

    friend std::ostream& operator << (std::ostream& out, const Complex& obj);
};

std::ostream& operator << (std::ostream& out, const Complex& obj) {
    out << obj.real << " + " << obj.imag << "i";
    return out;
}

int main() {
    Complex c1(3, 4);
    Complex c2(1, 2);

    Complex sum = c1 + c2;
    Complex diff = c1 - c2;
    Complex prod = c1 * c2;

    std::cout << "Sum: " << sum << std::endl;
    std::cout << "Difference: " << diff << std::endl;
    std::cout << "Product: " << prod << std::endl;

    return 0;
}