复制字符串集的正确方法是什么(在复制构造函数和赋值运算符中)?

时间:2015-02-26 03:26:05

标签: c++ string copy-constructor deep-copy shallow-copy

代码块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&amp; B,字符串集的复制是不同的。

复制字符串集的正确方法是什么?为什么呢?

如果复制在复制构造函数/赋值运算符中,它是否不同?如果是这样,为什么?

1 个答案:

答案 0 :(得分:1)

你应该信任赋值,它是在类型中实现的,并且知道最有效的方法。除此之外,第二个版本的赋值运算符是错误的,因为它将合并集合中从右侧到左侧的值。也许你想先clear呢?

除此之外,复制构造函数通常拼写为:

NAMEOFTHESTRUCT(const NAMEOFTHESTRUCT& src)
   : lNumber(src. lNumber), szStrings(src. szStrings)
{}