【发布时间】:2011-08-31 11:40:35
【问题描述】:
这可能是一个非常基本的问题,但不知何故它让我上当了……当我编写测试代码时,它似乎可以工作,但在生产中出现了问题。
// Header file
#define length 100
typedef struct testStr_t {
int a;
char b;
char t1[length];
char t2[length];
} test;
void populateTest(test*);
// source file
test test1;
test test2;
populateTest(&test1);
test2 = test1;
test2 会是test1 的深层副本吗?还是这里有陷阱?代码是用C编译器还是C++编译器编译有关系吗?
【问题讨论】:
-
C++ 中并没有真正意义上的深拷贝和浅拷贝。一切都是值,而值只是被复制。
-
@jalf:嗯? 绝对有深拷贝和浅拷贝的概念。好吧,不是语言,如果您明智并使用 RAII,则不是;但是虽然需要区分是可以避免的,但这绝不意味着没有。
-
我和 jalf 在一起。深与浅或(也许是中等?)的想法总是让我觉得很荒谬。不同的概念可能适用于 smalltalk(但我认为 ST 从未流行的原因之一是您必须考虑这些事情),但它不适用于 C++ - 副本就是副本。
-
@Chris 那么我们应该强加 UFO 的概念吗?有些东西(比如迭代器)很适合 C++ 做事的方式,而有些东西(比如深/浅拷贝)则不适合。
-
浅拷贝与深拷贝在 C++ 中是错误的二分法。只有“正确复制”、“损坏的复制代码”和“不可复制”。添加数据成员可能会破坏某些方法(例如复制 ctor 和 op=),但添加数据成员总是会破坏这些方法(包括默认 ctor、析构函数等)。