C++中複製建構函式和賦值運算子的區別
C++是一種通用的、中級語言、區分大小寫、與平臺無關的程式語言,支援面向物件程式設計的概念。C++由Bjarne Stroustrup於1979年在貝爾實驗室建立。由於C++是一種與平臺無關的程式語言,因此它可以用於各種系統,包括Windows、Mac OS和各種UNIX版本。
C++中的運算子用於對值和變數執行特定操作。以下是C++中使用的運算子列表:
算術運算子
賦值運算子
比較運算子
關係運算符
邏輯運算子
位運算子
一元運算子
三元/條件運算子。
在上述組中,賦值運算子用於為變數賦值。
在學習複製建構函式之前,讓我們簡要了解一下建構函式。C++中的建構函式是一種特殊的方法,其名稱與類名相同,並帶有括號“()”,在建立物件時會自動呼叫。建構函式用於初始化新建立的物件的變數。
複製建構函式是一種建構函式,它使用同一類中先前建立的另一個物件來初始化物件。
現在讓我們詳細瞭解一下,並比較和對比複製建構函式和賦值運算子的各種特性。
什麼是賦值運算子?
賦值運算子用於為變數賦值。賦值運算子的左運算元是變數名,右運算元是該變數的值。如果兩種運算元的資料型別不同,則會引發編譯錯誤。
賦值運算子的型別有:
= 運算子 − 它只為變數賦值。例如,“a=10”,這裡值10將被賦給變數“a”。
+= 運算子 −此運算子首先將變數的當前值加上右邊的值,然後將新值賦給變數。
-= 運算子 −此運算子首先將變數的當前值減去右邊的值,然後將新值賦給變數。
*= 運算子 −此運算子首先將變數的當前值乘以右邊的值,然後將新值賦給變數。
/= 運算子 −此運算子首先將變數的當前值除以右邊的值,然後將新值賦給變數。
賦值運算子示例
讓我們來看一個賦值運算子的例子。這裡我們使用賦值運算子為不同的變數賦值。
#include <iostream> int main() { // Write C++ code here int a=5,b; b=a; std::cout << "The value of a is "<<a<<"\n"; std::cout << "The value of b is "<<b; return 0; }
輸出
在上面的例子中,我們使用了兩個變數“a”和“b”,首先我們透過賦值運算子“=”將a的值賦為5。我們將a的值賦給變數b。上述程式碼將產生如下輸出。
The value of a is 5. The value of b is 5.
什麼是複製建構函式?
這在程式設計中通常是必需的,以便在不影響原始物件的情況下建立物件的單獨副本。在這些情況下,複製建構函式派上用場。複製建構函式是一種建構函式,它透過使用同一類中先前建立的物件來初始化物件來建立物件。複製建構函式有兩種型別。
預設複製建構函式 − 當未聲明覆制建構函式時,C++編譯器會建立一個預設建構函式,它按原樣複製所有成員變數。
使用者定義的複製建構函式 − 使用者定義的複製建構函式稱為使用者定義的複製建構函式。
語法
複製建構函式的語法為:
Class_Name(Class_name & oldobject) { // Body of constructor }
複製建構函式 - 示例
複製建構函式用於從同一類的另一個物件初始化一個物件,將物件複製為函式的引數,以及將物件複製為函式的引數。要從函式返回物件,請複製該物件。
示例
讓我們來看一個例子,瞭解我們如何精確地使用複製建構函式。
#include<iostream> using namespace std; class Example { int x, y; //data members public: Example(int a, int b) { x = a; y = b; } /* Copy constructor */ Example(Example & ex) { x = ex.x; y = ex.y; } void display() { cout << x << " " << y << endl; } }; /* main function */ int main() { Example obj1(20, 30); // Normal constructor Example obj2 = obj1; // Copy constructor cout << "Normal constructor : "; obj1.display(); cout << "Copy constructor : "; obj2.display(); return 0; }
在上面的例子中,我們把類名定義為Example,並建立了一個建構函式,並將值20和30傳遞給建構函式。語句Example (Example &ex) 表示複製建構函式。它複製先前建立的資料成員的值。
輸出
上述程式碼將產生以下輸出:
Normal constructor : 20 30 Copy constructor : 20 30
在我們的示例中,我們建立了兩個物件obj1和obj2,我們將obj1的值賦給obj2。
複製建構函式和賦值運算子的比較
C++中這兩個概念的主要目的是賦值,但兩者之間的主要區別在於,複製建構函式建立一個新物件並賦值,而賦值運算子不會建立新物件,而是將值賦給同一物件的資料成員。
下表重點介紹了複製建構函式和賦值運算子之間的主要區別。
比較依據 | 複製建構函式 | 賦值運算子 |
---|---|---|
基本比較 |
|
|
記憶體管理 | 已建立的舊物件和呼叫的新物件將共享不同的記憶體位置。 | 第一個物件和第二個物件(第二個物件被賦予第一個物件的值)共享相同的記憶體位置。 |
語法 | 複製建構函式的語法為:Class_name(Class_name &Old_obj); | 賦值運算子的語法為:Class name Obj1, Obj2; Obj2=Obj1; |
呼叫 | 當用舊物件初始化新物件時,會呼叫複製建構函式;當物件作為非引用引數傳遞給函式時,也會呼叫複製建構函式。 | 當舊物件的值被賦給新物件時,會呼叫賦值運算子。 |
結論
複製建構函式和賦值運算子的區別在於,複製建構函式有助於建立已存在物件的副本,而不會改變已建立物件的原始值,而賦值運算子有助於為程式中的資料成員或物件賦予新值。