日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 重载赋值运算符

發布時間:2025/3/12 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 重载赋值运算符 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在定義的同時進行賦值叫做初始化(Initialization),定義完成以后再賦值(不管在定義的時候有沒有賦值)就叫做賦值(Assignment)。初始化只能有一次,賦值可以有多次。

當以拷貝的方式初始化一個對象時,會調用拷貝構造函數;當給一個對象賦值時,會調用重載過的賦值運算符。

即使我們沒有顯式的重載賦值運算符,編譯器也會以默認地方式重載它。默認重載的賦值運算符功能很簡單,就是將原有對象的所有成員變量一一賦值給新對象,這和默認拷貝構造函數的功能類似。

對于簡單的類,默認的賦值運算符一般就夠用了,我們也沒有必要再顯式地重載它。但是當類持有其它資源時,例如動態分配的內存、打開的文件、指向其他數據的指針、網絡連接等,默認的賦值運算符就不能處理了,我們必須顯式地重載它,這樣才能將原有對象的所有數據都賦值給新對象。

我們以 Array 類為例,該類擁有一個指針成員,指向動態分配的內存。為了讓 Array 類的對象之間能夠正確地賦值,我們必須重載賦值運算符。請看下面的代碼:

#include <iostream> #include <cstdlib> using namespace std;//變長數組類 class Array{ public:Array(int len);Array(const Array &arr); //拷貝構造函數~Array(); public:int operator[](int i) const { return m_p[i]; } //獲取元素(讀取)int &operator[](int i){ return m_p[i]; } //獲取元素(寫入)Array & operator=(const Array &arr); //重載賦值運算符int length() const { return m_len; } private:int m_len;int *m_p; };Array::Array(int len): m_len(len){m_p = (int*)calloc( len, sizeof(int) ); }Array::Array(const Array &arr){ //拷貝構造函數this->m_len = arr.m_len;this->m_p = (int*)calloc( this->m_len, sizeof(int) );memcpy( this->m_p, arr.m_p, m_len * sizeof(int) ); }Array::~Array(){ free(m_p); }Array &Array::operator=(const Array &arr){ //重載賦值運算符if( this != &arr){ //判斷是否是給自己賦值this->m_len = arr.m_len;free(this->m_p); //釋放原來的內存this->m_p = (int*)calloc( this->m_len, sizeof(int) );memcpy( this->m_p, arr.m_p, m_len * sizeof(int) );}return *this; }//打印數組元素 void printArray(const Array &arr){int len = arr.length();for(int i=0; i<len; i++){if(i == len-1){cout<<arr[i]<<endl;}else{cout<<arr[i]<<", ";}} }int main(){Array arr1(10);for(int i=0; i<10; i++){arr1[i] = i;}printArray(arr1);Array arr2(5);for(int i=0; i<5; i++){arr2[i] = i;}printArray(arr2);arr2 = arr1; //調用operator=()printArray(arr2);arr2[3] = 234; //修改arr1的數據不會影響arr2arr2[7] = 920;printArray(arr1);return 0; }

運行結果:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9 0, 1, 2, 3, 4 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

將 arr1 賦值給 arr2 后,修改 arr2 的數據不會影響 arr1。如果把 operator=() 注釋掉,那么運行結果將變為:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9 0, 1, 2, 3, 4 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 0, 1, 2, 234, 4, 5, 6, 920, 8, 9

去掉operator=()后,由于 m_p 指向的堆內存會被 free() 兩次,所以還會導致內存錯誤。

分析重載過的賦值運算符。

1 operator=() 的返回值類型為Array &,這樣不但能夠避免在返回數據時調用拷貝構造函數,還能夠達到連續賦值的目的。下面的語句就是連續賦值:
arr4 = arr3 = arr2 = arr1;

2 if( this != &arr)語句的作用是「判斷是否是給同一個對象賦值」:如果是,那就什么也不做;如果不是,那就將原有對象的所有成員變量一一賦值給新對象,并為新對象重新分配內存。下面的語句就是給同一個對象賦值:

arr1 = arr1; arr2 = arr2;

3 return *this表示返回當前對象(新對象)。

4 operator=() 的形參類型為const Array &,這樣不但能夠避免在傳參時調用拷貝構造函數,還能夠同時接收 const 類型和非 const 類型的實參。

5 賦值運算符重載函數除了能有對象引用這樣的參數之外,也能有其它參數。但是其它參數必須給出默認值,例如:

Array & operator=(const Array &arr, int a = 100);

總結

以上是生活随笔為你收集整理的C++ 重载赋值运算符的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。