complex.h
#pragma once
#include <iostream>
#define FRIEND_FUNC 1
#define INLINE_FUNC 1
class ostream;
class istream;
class Complex {
public:
Complex();
Complex(int real, int imag);
//copy construction and assignment function
Complex(const Complex& a);
Complex& operator = (const Complex & a);
//manipulation
void set_real(int real);
void set_imag(int imag);
int get_real() const;
int get_imag() const;
//unary operator over
friend Complex operator + (const Complex& a, const Complex& b);
friend Complex operator - (const Complex& a, const Complex& b);
friend Complex operator * (const Complex& a, const Complex& b);
friend bool operator == (const Complex& a, const Complex& b);
//binary operator
Complex operator -();
Complex operator +();
//print information
static void print(Complex &a);//C style
friend std::ostream & operator << (std::ostream &os, const Complex &a);
friend std::istream & operator >> (std::istream &os, Complex &a);
private:
int real_;
int imag_;
};
#ifdef INLINE_FUNC
inline Complex operator + (const Complex& a, const Complex& b)
{
Complex c;
#ifdef FRIEND_FUNC
c.real_ = a.real_ + b.real_;
c.imag_ = a.imag_ + b.imag_;
#else
c.set_real(a.get_real() + b.get_real());
c.set_imag(a.get_imag() + b.get_imag());
#endif
return c;
}
inline Complex operator - (const Complex& a, const Complex& b)
{
Complex c;
#ifdef FRIEND_FUNC
c.real_ = a.real_ - b.real_;
c.imag_ = a.imag_ - b.imag_;
#else
c.set_real(a.get_real() - b.get_real());
c.set_imag(a.get_imag() - b.get_imag());
#endif
return c;
}
inline Complex operator * (const Complex& a, const Complex& b)
{
Complex c;
#ifdef FRIEND_FUNC
c.real_ = a.real_ * b.real_ - a.imag_ * b.imag_;
c.imag_ = a.real_ * b.imag_ + a.imag_ * b.real_;
#else
int real = a.get_real() * b.get_real() - a.get_imag() * b.get_imag();
int imag = a.get_real() * b.get_imag() + a.get_imag() * b.get_real();
c.set_real(real);
c.set_imag(imag);
#endif
return c;
}
inline bool operator == (const Complex& a, const Complex& b)
{
bool is_equal = false;
if ((a.real_ == b.real_) && (a.imag_ == b.imag_))
{
is_equal = true;
}
return is_equal;
}
#endif
//友元函数
//inline 函数
//添加迭代器,遍历整个集合
//重载运算符
//overload 重载 同一个类的多个方法名相同,参数列表不同
//override 重写 子类重写基类方法
complex.cpp
#include "complex.h"
#include <iostream>
Complex::Complex():real_(0), imag_(0)
{
}
Complex::Complex(int real, int imag)
{
real_ = real;
imag_ = imag;
}
Complex::Complex(const Complex& a)
{
real_ = a.real_;
imag_ = a.imag_;
}
Complex& Complex::operator = (const Complex & a)
{
real_ = a.real_;
imag_ = a.imag_;
return *this;
}
void Complex::set_real(int real)
{
real_ = real;
}
void Complex::set_imag(int imag)
{
imag_ = imag;
}
int Complex::get_real() const
{
return real_;
}
int Complex::get_imag() const
{
return imag_;
}
#ifndef INLINE_FUNC
Complex operator + (const Complex& a, const Complex& b)
{
Complex c;
#ifdef FRIEND_FUNC
c.real_ = a.real_ + b.real_;
c.imag_ = a.imag_ + b.imag_;
#else
c.set_real(a.get_real() + b.get_real());
c.set_imag(a.get_imag() + b.get_imag());
#endif
return c;
}
Complex operator - (const Complex& a, const Complex& b)
{
Complex c;
#ifdef FRIEND_FUNC
c.real_ = a.real_ - b.real_;
c.imag_ = a.imag_ - b.imag_;
#else
c.set_real(a.get_real() - b.get_real());
c.set_imag(a.get_imag() - b.get_imag());
#endif
return c;
}
#endif
Complex Complex::operator -()
{
this->real_ = -this->real_;
this->imag_ = -this->imag_;
return *this;
}
#ifndef INLINE_FUNC
Complex operator * (const Complex& a, const Complex& b)
{
Complex c;
#ifdef FRIEND_FUNC
c.real_ = a.real_ * b.real_ - a.imag_ * b.imag_;
c.imag_ = a.real_ * b.imag_ + a.imag_ * b.real_;
#else
int real = a.get_real() * b.get_real() - a.get_imag() * b.get_imag();
int imag = a.get_real() * b.get_imag() + a.get_imag() * b.get_real();
c.set_real(real);
c.set_imag(imag);
#endif
return c;
}
bool operator == (const Complex& a, const Complex& b)
{
bool is_equal = false;
if ((a.real_ == b.real_) && (a.imag_ == b.imag_))
{
is_equal = true;
}
return is_equal;
}
#endif
Complex Complex::operator +()
{
return *this;
}
void Complex::print(Complex &a) {
std::cout << "real = " << a.get_real() << ", imag = "<< a.get_imag() <<std::endl;
}
std::ostream & operator <<(std::ostream &os, const Complex &a)
{
#ifdef FRIEND_FUNC
os << "real = " << a.real_ << ", imag = " << a.imag_ << std::endl;
#else
os << "real = " << a.get_real() << ", imag = " << a.get_imag() << std::endl;
#endif
return os;
}
std::istream& operator >> (std::istream &is, Complex &a)
{
is >> a.real_ >> a.imag_;
return is;
}
complex_template.h
#pragma once
template<typename T>
class ComplexT {
public:
ComplexT();
ComplexT(T real, T imag);
//copy construction and assignment function
ComplexT(const ComplexT& a);
ComplexT& operator = (const ComplexT & a);
//manipulation
void set_real(T real);
void set_imag(T imag);
T get_real() const;
T get_imag() const;
private:
T real_;
T imag_;
};
//make sure below class define in .h file
//if define in .cpp file, will report error
template<typename T>
ComplexT<T>::ComplexT() :real_(0), imag_(0)
{
}
template<typename T>
ComplexT<T>::ComplexT(T real, T imag)
{
real_ = real;
imag_ = imag;
}
template<typename T>
ComplexT<T>::ComplexT(const ComplexT<T>& a)
{
real_ = a.real_;
imag_ = a.imag_;
}
template<typename T>
void ComplexT<T>::set_real(T real)
{
real_ = real;
}
template<typename T>
void ComplexT<T>::set_imag(T imag)
{
imag_ = imag;
}
template<typename T>
T ComplexT<T>::get_real() const
{
return real_;
}
template<typename T>
T ComplexT<T>::get_imag() const
{
return imag_;
}
//完成通用魔板
main.cpp
// complex_iterator_operator_test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include "complex.h"
#include "complex_template.h"
//define USE_PRINT 1
int main()
{
Complex a(5, 3);
Complex b(1, 2);
Complex c;
std::cout << "print a:";
#ifdef USE_PRINT
Complex::print(a);
#else
std::cout << a;
#endif
std::cout << "print b:";
#ifdef USE_PRINT
Complex::print(b);
#else
std::cout << b;
#endif
std::cout << "print c:";
#ifdef USE_PRINT
Complex::print(c);
#else
std::cout << c;
#endif
std::cout << "print c = a + b:";
c = a + b;
#ifdef USE_PRINT
Complex::print(c);
#else
std::cout << c;
#endif
std::cout << "print c = a - b:";
c = a - b;
#ifdef USE_PRINT
Complex::print(c);
#else
std::cout << c;
#endif
std::cout << "print c = a * b:";
c = a * b;
#ifdef USE_PRINT
Complex::print(c);
#else
std::cout << c;
#endif
//copy construction and assignment function
Complex d(c);
Complex e = c;
if (d == e)
{
std::cout << "d = e" << std::endl;
}
// test template
ComplexT<float> test;
}