【问题标题】:What is the right way of copying string set (in copy constructor and assignment operator)?复制字符串集的正确方法是什么(在复制构造函数和赋值运算符中)?
【发布时间】:2015-02-26 03:26:04
【问题描述】:

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

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

如果复制是在复制构造函数/赋值运算符中,它会有所不同吗?如果有,为什么?

【问题讨论】:

  • typedef 的使用尴尬且无用,全大写标识符通常用于宏,将其用于类型可能会让其他人感到惊讶,并且可能与您可能包含的标题中的宏定义发生冲突.如今,匈牙利符号也越来越少见......
  • 对于你类中的成员变量,你可以让编译器为你生成拷贝构造函数和拷贝赋值运算符。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-10-12
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    相关资源
    最近更新 更多