不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换
不可或缺 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
[源码下载]