Problem A
Complex numbers
For this lab you will create a class that represents a complex number. In essence, you will create a class that can handle addition, subtraction, multiplication and division. Do investigate what constructors are called and how or if they should be implemented.
How complex numbers work can be found out by reading the wikipedia page. You may refresh conjugate algebra when implementing division. You can also reference how the standard library implementation works. You will need to use at least c++11 (std=c++11) for this assignment. From now on, do use at least c++11 for the upcoming assignments.
You shall upload two files named Complex.cpp and Complex.h containing the implementation of your solution.
Functions
In the style of cppreference the following things should be defined:
Member functions 
 
(constructor) 
constructs a complex number (see guidance below) 
operator= 
assigns the contents 
real 
accesses the real part of the complex number 
imag 
accesses the imaginary part of the complex number 
operator+= = /= *= 
compound assignment of two complex numbers or a complex and a scalar 
Nonmember functions 
 
operator+  
applies unary operators to complex numbers 
operator+  * / 
performs complex number arithmetics on two complex values or a complex and a scalar 
operator== != 
compares two complex numbers or a complex and a scalar 
real 
returns the real component 
imag 
returns the imaginary component 
abs 
returns the magnitude of a complex number 
operator< 
returns true if the magnitude of the left complex number is lesser than the right complex number, and false otherwise 
operator<< 
Writes to output stream the complex number in the form textit(real,imaginary) 
operator>> 
Reads a complex number from is. The supported formats are real, (real) and (real,imaginary) Where the input must be convertible to Double 
operator""_i 
Forms a complex literal representing an imaginary number (note the underscore) 
Guidance
The type that you use to save the values should be doubles.
These are the constructor signatures that you will need:

Complex();

Complex(double real); // Note: make this constructor non explicit to allow expressions such as z = 3;

Complex(double real, double imaginary);

Complex(const Complex &rhs);
This thing enables you to write complex numbers in literal form.

constexpr Complex operator""_i(long double arg);
Any constexpr is resolved in compile time. That means that any constructor called by operator""_i must also be resolved in compile time. To ensure that, use member initializer list, whose syntax is the colon character :, followed by the commaseparated list of one or more memberinitializers and let the body of the constructor be empty.
Make your own design decisions
operator+= = /= *= =
You need to think about what the return type of operator= and operator+= = /= *= should be. The design decision is up to you. Given Complex x; Complex y; should all of these work or only a few? Make your own design decisions and motivate them.

Complex x; Complex y;

x = y + 1;

x = y + y + 1 + 5; // chaining

x = 2 + y;

x += y += 4; // chaining

x = y = 0; // chaining
Basic test examples
Examples of things that should work. Note you must test more extensively on your own.

Complex x;

Complex x2 = 5;

Complex y(6, 2);

Complex z = x + y;

Complex k = 3 + 5_i;

k = 5 + 1_i * Complex(5, 3);

std::cout << Complex(6, 6) / 6 << std::endl;