C 中的賦值運算子過載函式(operator )

2021-08-20 15:37:04 字數 2299 閱讀 7243

首先介紹為什麼要對賦值運算子「=」進行過載。某些情況下,當我們編寫乙個類的時候,,並不需要為該類過載「=」運算子,因為編譯系統為每個類提供了預設的賦值運算子「=」,使用這個預設的賦值運算子操作類物件時,該運算子會把這個類的所有資料成員都進行一次賦值操作。例如有如下類:

class a

;

那麼對這個類的物件進行賦值時,使用預設的賦值運算子是沒有問題的。示例**(operator_test4.cpp)如下:

#include using namespace std;

class classa

;int main()

編譯並執行上述**,結果如下:

從上述結果能夠知道:通過使用系統預設的賦值運算子「=」,可以讓物件obj2中的所有資料成員的值與物件obj1相同。這種情況下,編譯系統提供的預設賦值運算子可以正常使用。

但是,在下面的示例中,使用編譯系統預設提供的賦值運算子,就會出現問題了。示例**(operator_test5.cpp)如下:

#include #include using namespace std;

class classa

classa(const char* pszinputstr)

virtual ~classa()

public:

char* pszteststr;

};int main()

編譯並執行上述**,結果如下:

上述錯誤資訊說明:當obj1和obj2進行析構的時候,由於重複釋放了一塊記憶體,導致程式崩潰報錯。在這種情況下,就需要我們過載賦值運算子「=」了。

我們修改一下前面出錯的**示例,現編寫乙個包含賦值運算子過載函式的類,**(operator_test5.cpp)如下:

#include #include using namespace std;

class classa

classa(const char* pszinputstr)

virtual ~classa()

// 賦值運算子過載函式

classa& operator=(const classa& cls)

pszteststr = new char[strlen(cls.pszteststr) + 1];

strncpy(pszteststr, cls.pszteststr, strlen(cls.pszteststr) + 1);

}return *this;

}public:

char* pszteststr;

};int main()

編譯並執行上述**,結果如下:

通過上述結果能夠看到,我們利用賦值運算子過載函式,解決了物件賦值的情況下,析構函式中過程中多次釋放同一塊記憶體的問題。

對於上述**,有以下幾點需要說明:

示例**(operator_test6.cpp)如下:

#include#includeusing namespace std;

class data

; // 建構函式

data(int _data):data(_data)

// 賦值運算子過載函式

data& operator=(const int _data)

};int main()

編譯並執行上述**,結果如下:

上述結果說明:「data2 = 1;」語句呼叫了我們提供的以int型引數(而非本類或本類的引用)為形參的賦值運算子過載函式,而「data3 = data2;」的成功執行,說明該語句呼叫了編譯器提供的預設的賦值運算子過載函式。

如果將上述**中賦值運算子過載函式去掉,重新編譯執行,結果如下:

上述結果說明,當用乙個非類a的值(如上面的int型別值)為類a的物件賦值時:

綜合上述示例內容,我們可以知道針對以下情況,需要顯式地提供賦值運算子過載函式(即自定義賦值運算子過載函式):

C 賦值運算子的過載函式

賦值運算子的過載函式基本可以確定為兩種寫法,一種是初級程式設計師的寫法,另外一種是高階程式設計師的寫法,下面將對賦值運算子的過載函式的兩種形式進行解析。1 初級程式設計師的寫法 test operator const test src 防止記憶體丟失和淺拷貝 delete ptr 此處存在問題 pt...

c 賦值運算子的過載函式

首先我們來看object這個類,有以下幾個成員函式 class object object const object obj value obj.value 拷貝建構函式 object 析構函式 object operator const object obj 賦值運算子的過載函式 先來解釋一下運算...

C 運算子過載賦值運算子

自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...