如果類裡面有指針類型成員的話,需要重載賦值運算符,將指針所指向的內容copy過來,而不是簡單的copy指針的值,那樣在類對象析構時,會導致重複delete指針成員 這樣嚴重的錯誤

只有在默認的拷貝行為(bitwise copy)會導致不安全或不正確的情況下,我們才會需要一個copy assignment operator。

如果我們依賴於C++編譯器的默認行為的話,編譯器會在如下情形下生成一個nontrivial copy assignment operator:

* 類內成員有copy assignment operator時

* 當基類有copy assignment operator時* 當類內有virtual function時

* 當類繼承一個virtual base class時

其它的情形下,都是bitwise copy語意。除非你自己聲明一個copy assignment operator。

====分==隔==線====// 以下討論的是第二個問題,與上文關係不大 //

對於copy ctor和copy assignment operator的調用時機的問題,可以看如下的代碼做為參考

程序的具體行為如何,請參考C++ standard。

#include &
#include &
#include &
#include &
#include &

using namespace std;

#define print(x) do {cout &&> x;} while(0)

class Foo {
public:
Foo(int ival):val(ival) { print("ctor"); }
Foo(const Foo foo) { print("copy ctor"); val = foo.val; }
Foo operator = (const Foo foo) { print("copy assignment operator"); val = foo.val; return *this;}
void show() { print(val); }
private:
Foo(){}
int val;
};

int main()
{
Foo a(-1); // -&> ctor
a.show(); // -&> -1
Foo b = a; // -&> copy ctor
b.show(); // -&> -1
Foo c(1); // -&> ctor
c.show(); // -&> 1
c = a; // -&> copy assignment operator
c.show(); // -&> -1

return 0;
}


想埋坑的時候用,其他時候別用。
從語義上上講,還是用move吧!!!
如果你這個類成員裡面有指針 動態分配了內存一定要把 A::A(const A ) 和 A A::operator=(const A )

給重載掉 否則可能出現二次釋放什麼的


如果你不寫,編譯器會生成默認的。如果編譯器生成默認的運算符滿足你的需求,那麼不用寫。前提是你清楚知道編譯器會生成一個怎麼樣的運算符。


如果類成員有指針的話就需要重載,否則基本不需要,再或者如果你有一個類成員是一個有指針的Obj且該Obj的類定義里沒有重載=,如此遞歸。
推薦閱讀:
相关文章