美文网首页
c++ 操作符重载

c++ 操作符重载

作者: 简书网abc | 来源:发表于2024-01-16 23:14 被阅读0次
#include <iostream>
//#include <vector>

using namespace std;

template<typename T>
class complex {
public:
    complex() : re(0), im(0)
    { }
    complex(T r, T i)
        : re(r) , im(i)     // 初值列,初始列
    { }

    complex& operator += (const complex<T>&);
//    ostream& operator << (ostream& os, const complex& x) {
//        return os << "(" << real(x) << "," << imag(x) << ")";
//    }


    T getReal () const { return re; }  // const 表示返回值不会改变内容
//    void setReal (T r) { re = r; }

    T getImag () const {  return im; } // const 表示返回值不会改变内容
//    void setImag(T i) { im = i; }

private:
    T re, im;
//    friend complex<T>& doapl(complex<T>*, const complex<T>&);
};

// 全域函数
template<typename T>        // 范型定义
inline T                    // 返回值定义
getImag(const complex<T>& x) {
    return x.getImag();
}

// 全域函数
template<typename T>        // 范型定义
inline T                    // 返回值定义
getReal(const complex<T>& x) {
    return x.getReal();
}

// 成员函数的外部定义
// 成员函数的操作符重载外部定义, 该情景下返回值建议使用引用
// 区别在于 已经存在的变量返回引用,函数内部生成的对象不能返回引用.
template<typename T>
inline complex<T>&
complex<T>::operator += (const complex<T>& r){
    this->re += r.re;
    this->im += r.im;

    return *this;
}

//template<typename T>
//inline complex<T>&
//complex<T>::doapl(complex<T>* ths, const complex<T>& x) {
//    ths->re += x.re;
//    ths->im += x.im;
//    return *ths;
//}

// 类外部定义操作符重载
template<typename T>
inline complex<T>       // 这里可以返回value, 也可以返回ref
operator + (const complex<T>& x) {
    return x;
}

// 类外部定义操作符重载
template<typename T>
inline complex<T>       // 这里必须返回value
operator - (const complex<T>& x) {
    return complex<T>(-getReal(x), -getImag(x));
}

// 类外部定义操作符重载, 判断两个对象是否相等
template<typename T>
inline bool
operator == (const complex<T>& x, const complex<T>& y) {
    return getReal(x) == getReal(y) && getImag(x) == getImag(y);
}

// 类外部定义操作符重载, 判断两个对象是否不相等
template<typename T>
inline bool
operator != (const complex<T>& x, const complex<T>& y) {
    return getReal(x) != getReal(y) || getImag(x) != getImag(y);
}

// 打印符号<< 重载.
//#include <iostream>
template<typename T>
ostream&
operator << (ostream& os, const complex<T> x) {
    return os << "(" << getReal(x) << ", " << getImag(x) << ")";
}


int main()
{

    complex<double> c1(2, 4);
    cout << "c1.real: " << c1.getReal() << endl;
    cout << "c1.imag: " << c1.getImag() << endl;

    complex<double> c2(2, 4);
    // 使用成员函数的操作符重载
    c2 += c1;
    cout << "c1.real: " << c2.getReal() << endl;
    cout << "c1.imag: " << c2.getImag() << endl;

    // 使用全域函数
    cout << "getReal(c2): " << getReal(c2) << " getImag(c2): " << getImag(c2) << endl;

    // 使用外部定义的操作符重载
    complex<double> c3(33, 44);
    complex<double> c4(33, 44);
    cout << "(-c3).getReal(): " << (-c3).getReal() << endl;
    cout << "(+c4).getReal(): " << (+c4).getReal() << endl;
    cout << "c3 == c4: " << (c3 == c4 ) << endl;
    cout << "c3 != c4: " << (c3 != c4 ) << endl;

    cout << "c3: " << c3 << "  c2" << c2 << endl;
    return 0;
}

相关文章

  • Kotlin --- Operator Overloading

    简述 Kotlin的操作符重载与C++类似,虽然没有C++那么强大,但是仍然可以实现Kotlin的操作符重载。 操...

  • C++基础-(重载)

    C++基础 重载 哪些运算符可以被重载:::,.,->,*,?:不能被重载 重载操作符的标志(operator) ...

  • C++中的操作符重载

    操作符重载 C++中的重载能够扩展操作符的功能 操作符的重载以函数的方式进行 本质:用特殊形式的函数扩展操作符的功...

  • C++学习笔记(七)操作符重载(上)

    1、基本操作符重载 操作符重载指的是将C++提供的操作符进行重新定义,使之满足我们所需要的一些功能。 在C++中可...

  • C++ 操作符重载

    操作符重载 操作符的重载是在实际的C++编程过程中不太容易引人注意但却非常实用的一个特性。合理的实现操作符重载可以...

  • 《C++ Primer Plus》第11章学习笔记

    内容思维导图 1. 操作符重载 操作符重载(Operator overloading)是一种形式的C++多态。第8...

  • 1.2.20_C++ 下标运算符 [] 重载

    C++ 重载运算符和重载函数 下标操作符 [] 通常用于访问数组元素。重载该运算符用于增强操作 C++ 数组的功能...

  • Geekband C++ 第五周

    概述 C++模板简介 函数模板 C++类模板 操作符重载 泛型编程 容器

  • 没有学不会的C++:复制操作符怎么写

    C++ 中的操作符重载可以让我们的代码更符合人们的阅读习惯,而 operator= 赋值操作符又是最常被重载的操作...

  • C++操作符重载

    重载操作符的限制 可以重载的操作符 不能重载的算符 操作符重载的语法形式 重载赋值操作符 重载+-*/运算操作符操...

网友评论

      本文标题:c++ 操作符重载

      本文链接:https://www.haomeiwen.com/subject/sxklodtx.html