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
    [源码下载]

  • 相关阅读:
    LeetCode 295. Find Median from Data Stream (堆)
    LeetCode 292. Nim Game(博弈论)
    《JavaScript 模式》读书笔记(4)— 函数2
    《JavaScript 模式》读书笔记(4)— 函数1
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数3
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数2
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数1
    《JavaScript 模式》读书笔记(2)— 基本技巧3
    《JavaScript 模式》读书笔记(2)— 基本技巧2
    《JavaScript 模式》读书笔记(2)— 基本技巧1
  • 原文地址:https://www.cnblogs.com/webabcd/p/4660401.html
Copyright © 2011-2022 走看看