C++实现:自定义数组类型实现相关运算符重载
運算符重載說明
這次我們通過來自定義數組類型重載[]、<<、>>、==、!=運算符來學習C++運算符重載相關知識。
C++的運算符重載是C++相對于其他編程語言的一大特色。
在C++里面,我們用class自定義一個類型后,為啥可以直接使用 = 賦值運算符呢?因為 C++自動為我們做了這個動作,
我們定義的類型中沒有顯示定義=運算符,它會自動為我們添加默認的operator=重載函數。
我們進行運算符重載是應該改變其原來的意義!比如說原來是加的含義,你給重載為減的含義那就不應該了。
運算符重載方式
進行運算符重載有2種方式。
第一種:將運算符重載放在全局函數,這種方式的函數參數,至少有一個是我們自定義類型,不然就改變運算符的本來的意義了。
第二種:將運算符重載放在自定義class類中,這種方法方便訪問類中的私有成員。第一種如果要頻繁的訪問類中的私有成員,可以使用將其作為類的友元函數。
友元函數說明
如果一個函數要頻繁的訪問類的私有成員,必須通過方法進行調用,這樣會增加函數調用壓棧出棧的開銷,我們可以將這個函數定義為類的友元函數,這樣就函數可以無私處的訪問的類的私有成員了。
友元函數定義類的內部,一般是先聲明后定義,和普通函數聲明一樣,不過在前面加一個friend 關鍵字。
運算符重載函數的參數
如果在全局函數進行運算符重載,那么所有的參數都必須作為函數參數。
如果是在類中進行運算符重載,函數中自動會把運算符操作的對象作為this指針傳入的函數中,所以參數會少一個。如果我們要對傳送的參數進行修改,如果是的c話只能傳指針,c++為了更方便我們開發,添加了引用,一般我們使用引入傳遞。如果不是引用傳遞 修改只會對參數副本進行修改不會影響原對象。
運算符重載函數的返回值
返回值應該根據這個運算符運算之后的結果來確定。打個比方比如前置運算符++,可以++++a吧,那么返回值一定可以在原來的基礎上繼續進行改變,這樣的返回值我們一般返回引用。就好比 我們重載<<運算符 返回的是ostream的引用 這樣我們就可以連續使用 << 操作符了。
代碼展示
代碼中重載了[]、<<、>>、==、!=運算符和友元函數的使用。
MyArray.h
#pragma once #ifndef __MY_ARRAY_H__ #define __MY_ARRAY_H__ #include <iostream> using namespace std;class MyArray { public:MyArray();MyArray(int len);MyArray(const MyArray &another);int getData(int index);void setData(int index, int data);int getLengh();//重載cout<<運算符 cout<< arr1 << arr2friend ostream& operator<<(ostream &cout,MyArray& myArray);//重載cout>>運算符 cin >> arr1 實現對數組元素的輸入friend istream& operator >> (istream &cin, MyArray& myArray);//重載賦值操作符MyArray& operator=(MyArray& another);//重載下標操作符int& operator[](int index);//重載==操作符bool operator==(MyArray& another);bool operator!=(MyArray& another);~MyArray();private:int len;int* arr; }; #endif // !__MY_ARRAY_H__MyArray.cpp
#include <cstdio> #include <iostream> #include <ostream> #include "MyArray.h" using namespace std;MyArray::MyArray() {this->len = 0;this->arr = NULL; }MyArray::MyArray(int len) {this->len = len;this->arr = new int[len];memset(this->arr, 0, sizeof(int)*len); } MyArray::MyArray(const MyArray& another) {this->len = another.len;this->arr = new int[this->len];for (size_t i = 0; i < this->len; i++){this->arr[i] = another.arr[i];} }int MyArray::getData(int index) {return this->arr[index]; }void MyArray::setData(int index, int data) {this->arr[index] = data; }int MyArray::getLengh() {return this->len; }ostream& operator<<(ostream &cout, MyArray& myArray) {cout << "[";for (size_t i = 0; i < myArray.len-1; i++){cout << myArray.arr[i] <<",";}cout << myArray.arr[myArray.len - 1] << "]" << endl;return cout; }istream& operator >> (istream &cin, MyArray& myArray) {cout << "請輸入" << myArray.len << "個數字:" << endl;for (size_t i = 0; i < myArray.len; i++){int d = 0;cin >> d;myArray.arr[i] = d;}return cin; }MyArray & MyArray::operator=(MyArray & another) {//1、防止自身賦值if (this == &another){return *this;}//2、將自身開辟的空間回收if (this->arr != NULL){delete this->arr;this->arr = NULL;this->len = 0;}//3、執行深拷貝this->len = another.len;this->arr = new int[another.len];for (size_t i = 0; i < this->len; i++){this->arr[i] = another.arr[i];}//4、返回本身return *this; }int & MyArray::operator[](int index) {return this->arr[index]; }bool MyArray::operator==(MyArray & another) {if (this == &another){return true;}if (this->len != another.len){return false;}for (size_t i = 0; i < another.len; i++){if (another.arr[i] != this->arr[i]){return false;}}return true; }bool MyArray::operator!=(MyArray & another) {return !(*this==another); }MyArray::~MyArray() {this->len = 0;delete[] this->arr; }main.cpp
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <iostream> #include "MyArray.h" using namespace std;int main(int argc, char *argv[]) {MyArray arr1(10);cout << arr1 << arr1;cin >> arr1;cout<<"arr1:" << arr1;MyArray arr2 = arr1;cout <<"MyArray arr2 = arr1\narr2:"<< arr2;cout << "arr2 == arr1:" << boolalpha << (arr2 == arr1) << endl;cout << "arr2 != arr1:" << boolalpha << (arr2 != arr1) << endl;arr2[9] = 666;cout << "arr2[9] = 666\narr2:" << arr2;cout << "arr2 == arr1:" << boolalpha << (arr2 == arr1)<<endl;cout << "arr2 != arr1:" << boolalpha << (arr2 != arr1) << endl;return 0; }驗證結果
總結
以上是生活随笔為你收集整理的C++实现:自定义数组类型实现相关运算符重载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019-05-27 Java学习日记
- 下一篇: Mysql ERROR 1418 (HY