【发布时间】: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