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;
呼叫
當用舊物件初始化新物件時,會呼叫複製建構函式;當物件作為非引用引數傳遞給函式時,也會呼叫複製建構函式。
當舊物件的值被賦給新物件時,會呼叫賦值運算子。

結論

複製建構函式和賦值運算子的區別在於,複製建構函式有助於建立已存在物件的副本,而不會改變已建立物件的原始值,而賦值運算子有助於為程式中的資料成員或物件賦予新值。

更新於:2022年7月27日

9K+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告