![](/img/trans.png)
[英]What's wrong, why is the "copy assignment operator" invoked right after "copy constructor"?
[英]What is the right way of copying string set (in copy constructor and assignment operator)?
代碼塊A:
typedef struct NAMEOFTHESTRUCT {
long lNumber;
std::set<wstring> szStrings;
NAMEOFTHESTRUCT() {
lNumber = -1L;
};
NAMEOFTHESTRUCT(const NAMEOFTHESTRUCT& src) {
lNumber = src.lNumber;
szStrings = src.szStrings; //COPY THIS WAY
};
NAMEOFTHESTRUCT& operator =(const NAMEOFTHESTRUCT& src) {
lNumber = src.lNumber;
szStrings. = src.szStrings; //COPY THIS WAY
return *this;
};
}
代碼塊B:
typedef struct NAMEOFTHESTRUCT {
long lNumber;
std::set<wstring> szStrings;
NAMEOFTHESTRUCT() {
lNumber = -1L;
};
NAMEOFTHESTRUCT(const NAMEOFTHESTRUCT& src) {
lNumber = src.lNumber;
if (!src.szStrings.empty()) // COPY THIS WAY
szStrings.insert(src.szStrings.begin(), src.szStrings.end());
};
NAMEOFTHESTRUCT& operator =(const NAMEOFTHESTRUCT& src) {
lNumber = src.lNumber;
if (!src.szStrings.empty()) // COPY THIS WAY
szStrings.insert(src.szStrings.begin(), src.szStrings.end());
return *this;
};
}
在代碼塊A和B中,字符串集的復制是不同的。
哪個是復制字符串集的正確方法? 為什么?
如果復制是在復制構造函數/賦值運算符中進行的,是否有所不同? 如果是這樣,為什么?
您應該信任分配,它是在類型中實現的,並且知道最有效的方式。 除此之外,第二個版本的賦值運算符是錯誤的,因為它將合並集合中的值,從右手到左手。 也許您打算先clear
它?
除此之外,副本構造函數通常被拼寫為:
NAMEOFTHESTRUCT(const NAMEOFTHESTRUCT& src)
: lNumber(src. lNumber), szStrings(src. szStrings)
{}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.