zoukankan      html  css  js  c++  java
  • 不可或缺 Windows Native (24)

    [源码下载]


    不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换



    作者:webabcd


    介绍
    不可或缺 Windows Native 之 C++

    • 运算符重载
    • 自定义类型转换



    示例
    CppOperator.h

    #pragma once 
    
    #include <string>
    
    using namespace std;
    
    namespace NativeDll
    {
        class CppOperator
        {
        public:
            string Demo();
        };
    }


    CppOperator.cpp

    /*
     * 运算符重载, 自定义类型转换
     */
    
    #include "pch.h" 
    #include "CppOperator.h"
    #include "cppHelper.h"
    #include <iostream>
    
    using namespace NativeDll;
    
    void cppoperator_demo1();
    void cppoperator_demo2();
    void cppoperator_demo3();
    void cppoperator_demo4();
    void cppoperator_demo5();
    void cppoperator_demo6();
    void cppoperator_demo7();
    void cppoperator_demo8();
    
    string CppOperator::Demo()
    {
        // 通过成员函数重载“+”运算符
        cppoperator_demo1();
    
        // 通过友元函数重载“*”运算符
        cppoperator_demo2();
    
        // 通过友元函数重载“==”运算符
        cppoperator_demo3();
    
        // 通过成员函数重载“前置++”运算符
        cppoperator_demo4();
    
        // 通过成员函数重载“后置++”运算符
        cppoperator_demo5();
    
        // 通过友元函数重载 ostream 的 <<
        cppoperator_demo6();
    
        // 类型转换函数(type conversion function),可以隐式转换或显式转换
        cppoperator_demo7();
    
        // 通过构造函数实现隐式转换
        cppoperator_demo8();
    
    
        // 运算符重载时,如果第一个操作数不是本类对象,则只能用 friend 的方式重载(此时不能用成员函数的方式重载)
        // 习惯来说:通过成员函数重载单目运算符;通过友元函数重载双目运算符
        // 不可以自定义新的运算符,只能重载已有运算符,其中不可重载的运算符有:“.”, “.*”, “sizeof()”, “::”, “?:”
    
    
        return "看代码及注释吧";
    }
    
    
    
    class CppOperatorComplex
    {
    private:
        string Name;
    public:
        CppOperatorComplex() : Name("")
        {
    
        }
        CppOperatorComplex(string name) : Name(name)
        {
    
        }
        string ToString()
        {
            return Name;
        }
    
        // 通过成员函数重载“+”运算符(左边是本类对象,右边是指定的 CppOperatorComplex 对象)
        CppOperatorComplex operator+(CppOperatorComplex &coc);
    
        // 通过友元函数重载“*”运算符(左边是指定的 CppOperatorComplex 对象,右边是指定的 CppOperatorComplex 对象)
        friend CppOperatorComplex operator*(CppOperatorComplex &coc1, CppOperatorComplex &coc2); 
        // 通过友元函数重载“==”运算符(左边是指定的 string 对象,右边是指定的 CppOperatorComplex 对象)
        friend bool operator==(string &name, CppOperatorComplex &coc);
    
        // 通过成员函数重载“前置++”运算符
        CppOperatorComplex operator++();
        // 通过成员函数重载“后置++”运算符(这里需要加一个 int 类型的参数,这是 c++ 的约定,用以区分“前置++”)
        CppOperatorComplex operator++(int);
    
        // 通过友元函数重载 ostream 的 <<
        friend ostream& operator<<(ostream &, CppOperatorComplex &);
    
        // 类型转换函数,用以支持将 CppOperatorComplex 转换(隐式或显式)为 int
        operator int(); 
    };
    
    CppOperatorComplex CppOperatorComplex::operator+(CppOperatorComplex &coc) 
    {
        CppOperatorComplex result;
        result.Name = this->Name + "+" + coc.Name;
        return result;
    }
    
    CppOperatorComplex operator*(CppOperatorComplex &coc1, CppOperatorComplex &coc2) 
    {
        CppOperatorComplex result;
        result.Name = coc1.Name + "*" + coc2.Name;
        return result;
    }
    
    bool operator==(string &name, CppOperatorComplex &coc) 
    {
        CppOperatorComplex result;
        return name == coc.Name;
    }
    
    CppOperatorComplex CppOperatorComplex::operator++() // 前置++
    {
        this->Name = "++" + this->Name;
        return *this;// 返回自加后的当前对象
    }
    CppOperatorComplex CppOperatorComplex::operator++(int) // // 后置++
    {
        CppOperatorComplex temp(*this);
        this->Name += "++";
        return temp;  // 返回的是自加前的对象
    }
    
    ostream& operator<<(ostream &output, CppOperatorComplex &coc)
    {
        output << "name: " << coc.Name;
        return output;
    }
    
    CppOperatorComplex::operator int() //定义重载运算符的函数
    {
        if (this->Name == "webabcd")
            return 100;
        return 10;
    }
    
    
    
    // 通过成员函数重载“+”运算符
    void cppoperator_demo1()
    {
        CppOperatorComplex coc1("webabcd");
        CppOperatorComplex coc2("wanglei");
    
        CppOperatorComplex coc = coc1 + coc2;
        string result = coc.ToString(); // webabcd+wanglei
    }
    
    
    
    // 通过友元函数重载“*”运算符
    void cppoperator_demo2()
    {
        CppOperatorComplex coc1("webabcd");
        CppOperatorComplex coc2("wanglei");
    
        CppOperatorComplex coc = coc1 * coc2;
        string result = coc.ToString(); // webabcd*wanglei
    }
    
    
    
    // 通过友元函数重载“==”运算符
    void cppoperator_demo3()
    {
        string name = "wanglei";
        CppOperatorComplex coc2("wanglei");
    
        bool result = (name == coc2); // true
    }
    
    
    
    // 通过成员函数重载“前置++”运算符
    void cppoperator_demo4()
    {
        CppOperatorComplex coc("wanglei");
    
        string s1 = (++coc).ToString(); // ++wanglei
        string s2 = coc.ToString(); // ++wanglei
    }
    
    
    
    // 通过成员函数重载“后置++”运算符
    void cppoperator_demo5()
    {
        CppOperatorComplex coc("wanglei");
    
        string s1 = (coc++).ToString(); // wanglei
        string s2 = coc.ToString(); // wanglei++
    }
    
    
    
    // 通过友元函数重载 ostream 的 <<
    void cppoperator_demo6()
    {
        CppOperatorComplex coc("wanglei");
    
        cout << coc << endl; // name: wanglei
    }
    
    
    
    // 类型转换函数的演示,隐式转换和显式转换
    void cppoperator_demo7()
    {
        CppOperatorComplex coc1("webabcd");
        CppOperatorComplex coc2("wanglei");
    
        // 由于结果是 int 类型,所以 coc1 和 coc2 会被隐式地转换为 int(通过“operator int()”来实现)
        int result = coc1 - coc2; // 90
    
        // 显式转换(通过“operator int()”来实现)
        result = int(coc1) - int(coc2); // 90
    }
    
    
    
    class CppOperatorA
    {
    private:
        string Name;
        int Age;
    public:
        CppOperatorA(string name) : Name(name), Age(0)
        {
    
        }
        CppOperatorA(int age) : Age(age), Name("")
        {
    
        }
        string ToString()
        {
            return Name + int2string(Age);
        }
    };
    
    class CppOperatorB
    {
    private:
        string Name;
        int Age;
    public:
        explicit CppOperatorB(string name) : Name(name), Age(0)
        {
    
        }
        explicit CppOperatorB(int age) : Age(age), Name("")
        {
    
        }
        string ToString()
        {
            return Name + int2string(Age);
        }
    };
    
    // 演示如何通过构造函数实现隐式转换
    void cppoperator_demo8()
    {
        CppOperatorA a1 = "webabcd"; // 编译器会调用 CppOperatorA(string name); 构造函数
        CppOperatorA a2 = 100; // 编译器会调用 CppOperatorA(int age); 构造函数
    
        string result1 = a1.ToString(); // webabcd0
        string result2 = a2.ToString(); // 100
    
    
        // CppOperatorB b1 = "webabcd"; // 由于构造函数 CppOperatorB(string name); 被修饰为 explicit,所以不能隐式调用此构造函数
        // CppOperatorB b2 = 100; // 由于构造函数 CppOperatorB(int age); 被修饰为 explicit,所以不能隐式调用此构造函数
    }



    OK
    [源码下载]

  • 相关阅读:
    zoj 3792 Romantic Value
    uva 563
    uva 10779 Collectors Problem 网络流
    什么是撞库,如何预防撞库攻击?
    linux install redis-cli
    python远程调试及celery调试
    python HttpServer共享文件
    python引用,浅复制,深复制
    redis 查询key数量
    ubuntu查询可用安装包
  • 原文地址:https://www.cnblogs.com/webabcd/p/4660401.html
Copyright © 2011-2022 走看看