[源碼下載]
作者: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
[源碼下載]