程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++ 拷貝構造函數優缺點

c++ 拷貝構造函數優缺點

編輯:C++入門知識

c++ 拷貝構造函數優缺點


前一段時間去面試,被人問了一個這個問題, 突然不知道怎麼回答了, 後來查了查,才知道原來是怎麼樣了, 現在總結一下吧。

拷貝構造函數和賦值運算符用於創建對象的副本。在某些情況下由編譯器隱式調用拷貝構造函數,例如按值傳遞對象的時候。

優點:
拷貝構造函數可以很容易地復制對象。 STL容器要求所有內容可拷貝和賦值。拷貝構造函數可以比copyfrom()式的解決方法更有效,因為它們將構造和復制結合在一起。

缺點:
對象的隱式拷貝是C++中是錯誤和性能問題的來源之一。它也降低了代碼的可讀性,並使得對象子程序中的傳遞和改變變得難以跟蹤。

只有很少的類需要拷貝。絕大部分的類既不需要拷貝構造函數,也不需要賦值操作符函數。在大多數情況下,使用指針或引用可以完成相同的任務,並具有更好的性能。例如,可以通過引用或指針,而不是通過值傳遞函數的參數。在STL容器中存儲對象的指針,而不是存儲對象的拷貝。

如果你的類需要拷貝,可以提供用於復制的方法,如copyfrom()或者clone(),而不是使用拷貝構造函數,因為這種方法不能被編譯器隱式調用。如果提供的復制方法不夠用,在具體情況下(如性能方面的原因,或者是因為你的類需要按值存儲在STL容器中),考慮同時提供拷貝構造函數和賦值操作符函數。

如果你的類並不需要拷貝構造函數或賦值操作符函數,你必須顯式地禁用它們。要做到這一點,可以在類的私有(private)部分,添加拷貝構造函數和賦值操作符函數的空申明,但不提供任何相應的定義。因此,任何使用它們的企圖都會導致鏈接錯誤(link error)。

為了方便, 可以使用DISALLOW_COPY_AND_ASSIGN宏:

// A macro to disallow the copy constructor and operator= functions
// This should be used in the private: declarations for a class
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&);               \
void operator=(const TypeName&)

然後在類Foo中這樣使用:

class Foo {
 public:
  Foo(int f);
  ~Foo();
 
 private:
  DISALLOW_COPY_AND_ASSIGN(Foo);
};

這樣就好了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved