zoukankan      html  css  js  c++  java
  • 运算符重载 C++ 编程思想

    class Integer{
        int i;
    public:
        Integer(int ii) : i(ii) {}
        const Integer operator+(const Integer& rv) const {
            cout << "operator+" << endl;
            return Integer(i + rv.i);
        }
        Integer& operator+=(const Integer& rv) {
            cout << "operator+=" << endl;
            i += rv.i;
            return *this;
        }
    };
    
    int main() {
        cout << "build-in types:" << endl;
        int i = 1, j = 2, k = 3;
        k += i + j;
        cout << "user-defined types:" << endl;
        Integer ii(1), jj(2), kk(3);
        kk += ii + jj;
    }
    //: C12:OverloadingUnaryOperators.cpp
    #include <iostream>
    using namespace std;
    
    // Non-member functions:
    class Integer {
        long i;
        Integer* This() { return this;}
        
    public:
        Integer(long ll = 0) : i(ll) {}
        //No side effects takes const& argument:
        friend const Integer& operator+(const Integer& a);
        friend const Integer operator-(const Integer& a);
        friend const Integer operator~(const Integer& a);
        friend const Integer* operator&(Interger& a);
        friend const int operator!(const Integer& a);
        //Side effects have non-const& argument:
        //Prefix:
        friend const Integer& operator++(Integer& a);
        //Postfix:
        friend const Integer operator++(Integer& a, int);
        //Prefix:
        friend const Integer& operator--(Integer& a);
        //Postfix:
        friend const Integer operator--(Integer& a, int);
    };
    
    //Global operators:
    const Integer& operator+(const Integer& a) {
        cout << "+Integer
    ";
        return a; //Unary + has no effect
    }
    const Integer operator-(const Integer& a) {
        cout << "-Integer
    ";
        return Integer(-a.i);
    }
    const Integer operator~(const Integer& a) {
        cout << "~Integer
    ";
        return Integer(~a.i);
    }
    Integer* operator(Integer& a) {
        cout << "&Integer
    ";
        return a.This();
    }
    int operator!(const Integer& a) {
        cout << "!Integer
    ";
        return !a.i;
    }
    //Prefix; return incremented value
    const Integer& operator++(Integer& a) {
        cout << "++Integer
    ";
        a.i ++;
        return a;
    }
    //Postfix; return the value before increment:
    const Integer operator++(Integer& a, int) {
        cout << "Integer++
    ";
        Integer before(a.i);
        a.i ++;
        return before;
    }
    //Prefix; return decremented value
    const Integer& operator--(Integer& a) {
        cout << "--Integer
    ";
        a.i --;
        return a;
    }
    //Postfix; return the value before decrement:
    const Integer operator--(Integer& a, int) {
        cout << "Integer--
    ";
        Integer before(a.i);
        a.i --;
        return before;
    }
    
    //Show that the overloaded operators work:
    void f(Integer a) {
        +a;
        -a;
        ~a;
        Integer *ip = &a;
        !a;
        ++a;
        a++;
        --a;
        a--;
    }
    
    class Byte {
        unsigned char b;
    public:
        Byte(unsigned char bb = 0) : b(bb) {}
        // No side effects: const memeber function:
        const Byte& operator+() const {
            cout << "+Byte
    ";
            return *this;
        }
        const Byte operator-() const {
            cout << "-Byte
    ";
            return Byte(-b);
        }
        const Byte operator~() const {
            cout << "~Byte
    ";
            return Byte(~b);
        }
        Byte operator!() const {
            cout << "!Byte
    ";
            return Byte(!b);
        }
        Byte* operator&() {
            cout << "&Byte
    ";
            return this;
        }
        // Side effects: non-const member function:
        const Byte& operator++() { //Prefix
            cout << "++Byte
    ";
            b ++; 
            return *this;
        }
        const Byte operator++(int) { //Postfix
            cout << "Byte++
    ";
            Byte before(b);
            b ++;
            return before;
        }
        const Byte& operator--() { //Prefix
            cout << "--Byte
    ";
            b --;
            return *this;
        }
        const Byte operator--(int) { //Postfix
            cout << "Byte--
    ";
            Byte before(b);
            b --;
            return before;
        }
    };
    
    void g(Byte b) {
        +b;
        -b;
        ~b;
        Byte *bp = &b;
        !b;
        ++b;
        b++;
        --b;
        b--;
    }
    
    int main() {
        Integer a;
        f(a);
        Byte b;
        g(b);
    }
  • 相关阅读:
    OCM_第十四天课程:Section6 —》数据库性能调优_各类索引 /调优工具使用/SQL 优化建议
    OCM_第十三天课程:Section6 —》数据库性能调优 _结果缓存 /多列数据信息采集统计/采集数据信息保持游标有效
    OCM_第十二天课程:Section6 —》数据库性能调优_ 资源管理器/执行计划
    使用NuGet时的一个乌龙
    .net调用存储过程碰到的一个问题
    数据库的备份与还原
    创建link server链接服务器碰到的问题及解决办法
    如何管理好项目的DLL
    项目中Enum枚举的使用
    .NET开发知识体系
  • 原文地址:https://www.cnblogs.com/unsigned/p/3317308.html
Copyright © 2011-2022 走看看