亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中為什么要保證拷貝賦值對自我賦值安全

發布時間:2021-11-29 13:44:37 來源:億速云 閱讀:131 作者:iii 欄目:大數據

本篇內容介紹了“C++中為什么要保證拷貝賦值對自我賦值安全”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

C.62:保證拷貝賦值對自我賦值安全
Reason(原因)

如果x=x改變了x的值,人們會覺得很奇怪,同時也會發生很不好的錯誤。(通常會包含泄露)

Example(示例)

標準庫容器處理自我賦值的方式優雅且高效:

std::vector<int> v = {3, 1, 4, 1, 5, 9};
v = v;
// the value of v is still {3, 1, 4, 1, 5, 9}
Note(注意)

產生于正確處理了自我賦值的成員的默認的賦值操作會處理自我賦值問題。

struct Bar {
   vector<pair<int, int>> v;
   map<string, int> m;
   string s;
};

Bar b;
// ...
b = b;   // correct and efficient
Note(注意)

你可以通過明確地對自我賦值進行檢查的方式防止自我賦值,但是通常不使用上述檢查的處理方式(例如使用swap)的方式更快,更優雅。

class Foo {
   string s;
   int i;
public:
   Foo& operator=(const Foo& a);
   // ...
};

Foo& Foo::operator=(const Foo& a)   // OK, but there is a cost
{
   if (this == &a) return *this;
   s = a.s;
   i = a.i;
   return *this;
}

這種做法看起來安全并且高效。但是如果在一百萬次賦值中只發生一次自我賦值的情況下會怎么樣呢?大概有一百萬次多余的檢查(但是由于本質上結果總是一樣的,計算機的分支預測會每次都猜對)。考慮下面的代碼:

Foo& Foo::operator=(const Foo& a)   // simpler, and probably much better
{
   s = a.s;
   i = a.i;
   return *this;
}

std::string對自我賦值安全,int也是。所有的代價都來自(極少)發生的自我賦值。

Enforcement(實施建議)

(簡單)賦值運算符不應該包含以下的檢查:if (this == &a) return *this;

“C++中為什么要保證拷貝賦值對自我賦值安全”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

儋州市| 札达县| 呼和浩特市| 萍乡市| 孝感市| 浑源县| 中山市| 樟树市| 卢龙县| 嘉善县| 象州县| 武强县| 泗洪县| 新绛县| 浦县| 志丹县| 天祝| 康定县| 凤翔县| 桓仁| 辽宁省| 安福县| 益阳市| 金阳县| 桃源县| 洛宁县| 北安市| 含山县| 柳林县| 建水县| 高唐县| 房产| 双柏县| 龙南县| 松江区| 米脂县| 泰和县| 开远市| 罗城| 三门县| 德昌县|