C++基礎學習筆記:運算子過載
阿新 • • 發佈:2019-01-07
(運算子過載和類轉換的練習程式碼)
標頭檔案:
//MyClass.h #pragma once #include <iostream> //設計一個簡單的類來熟悉運算子過載與類的轉換 class MyClass { private: int num;//私有成員變數 public: //建構函式:物件的初始化操作 //只接受一個引數的構造定義了引數型別到類型別的轉換, //預設為隱式轉換,通過explicit關鍵字限制為顯式轉換。 explicit MyClass(int n=0); //拷貝構造:形如MyClass a(b),其中b是一個MyClass型別 MyClass(MyClass &myc); //賦值運算子:只能為成員函式,物件之間的賦值操作 MyClass &operator=(MyClass &myc); int Add(int n); int Add(MyClass &myc); //成員函式進行運算子過載,使用關鍵字operator加上一個運算子, //a+n如同a.operator+(n),自身通過this指標操作。 int operator+(int n); //轉換函式:必須是類方法、無引數與返回值。 explicit operator int() const; //友元函式進行運算子過載 friend int operator+(MyClass &a,MyClass &b); //輸入輸出流的過載,記得返回一個流引用,方便連續的輸入輸出操作。 friend std::ostream & operator << (std::ostream &os, MyClass &myc); friend std::istream & operator >> (std::istream &is, MyClass &myc); //解構函式 ~MyClass(); };
類實現:
//MyClass.cpp #include "MyClass.h" MyClass::MyClass(int n) { num = n; } MyClass::MyClass(MyClass &myc) { num = myc.num; } MyClass & MyClass::operator=(MyClass &myc) { if (this == &myc) return *this; num = myc.num; return *this; } int MyClass::Add(int n) { num += n; return num; } int MyClass::Add(MyClass &myc) { num += myc.num; return num; } int MyClass::operator+(int n) { return num + n; } MyClass::operator int() const { return num; } int operator+(MyClass &a, MyClass &b) { return a.num + b.num; } std::ostream & operator << (std::ostream &os, MyClass &myc) { os << myc.num; return os; } std::istream & operator >> (std::istream &is, MyClass &myc) { is >> myc.num; return is; } MyClass::~MyClass() { }
使用:
//user.cpp //!時間:2017年9月10日(週日)夜 //!內容:運算子過載與類的轉換 //!最後更新時間:NULL #include <iostream> #include <cstdlib>//rand() #include <ctime>//time() //<>和""表示編譯器在搜尋標頭檔案時的順序不同, //<>表示從系統目錄下開始搜尋,再到PATH環境變數目錄,不搜尋當前目錄, //""是表示從當前目錄開始搜尋,然後是系統目錄和PATH環境變數目錄。 #include "MyClass.h" int main() { using namespace std; /*//插曲:產生隨機數 srand((unsigned)time(nullptr));//種子預設為1 for (int i = 0; i < 10; i++) cout << rand() %10<< '-' << endl;*/ // MyClass a, b; a.Add(5); b = a;//賦值操作 MyClass c(a);//拷貝構造 a = (MyClass)2;//因為使用了explicit關鍵字,需要顯式轉換 int i = (int)a;//因為使用了explicit關鍵字,需要顯式轉換 i = a + b;//使用友元版本+ i = a + 1;//使用成員版本+ cin >> b; cout << i << a << b << c << endl; system("pause"); return 0; }