可能重复:
How are C array members handled in copy control functions?
我猜测隐式复制构造函数(由编译器生成)会在成员变量声明为指针时复制指针。
我不确定数组成员变量会发生什么。
隐式复制构造函数是否正确复制数组成员?赋值运算符怎么样?
例如:
char mCharArray[100];
int mIntArray[100];
mCharArray mIntArray会被正确复制吗?
答案 0 :(得分:56)
是的,答案是肯定的。对于C中的结构也是如此。
typedef struct {
int a[100];
} S;
S s1;
s1.a[0] = 42;
S s2;
s2 = s1; // array copied
答案 1 :(得分:8)
尽量让它尽可能清晰:
struct X
{
char data_[100];
};
X a, b;
a.data_[10] = 'x';
b = a;
// here, b.data_[n] == a.data_[n] for 0 <= n < 100, so b.data_[10] == 'x'
但是,可能令人讨厌的情况是指针和引用:
struct X
{
char* data_[100];
};
X a, b;
a.data_[10] = new char[6]; // a character array on the heap
strcpy(a.data_[10], "hello"); // put some text into it...
b = a;
// here, b.data_[n] == a.data_[n] for 0 <= n < 100
// so b.data_[10] == a.data_[10] == same character array containing "hello"
// BUT...
b.data_[10][2] = 'L'; // change text to "heLlo" via b.data_[10] pointer...
// here, a.data_[10][2] will be 'L' too, as a.data_[10] and b.data_[10] both point
// to the same underlying heap memory returned by new above...
delete[] a.data_[10]; // ok...
std::cout << b.data_[10]; // NOT ok - this memory's been deallocated!
delete[] b.data_[10]; // NOT ok - this memory's (already) been deallocated!
希望这有助于说明问题。
考虑一种使结构更“安全”的方法:
struct X
{
X(const X& rhs)
{
for (int i = 0; i < 100; ++i)
if (rhs.data_[i])
{
// deep copy of pointed-to text...
data_[i] = new char[strlen(rhs.data_[i]) + 1];
strcpy(data_[i], rhs.data_[i]);
}
else
data_[i] = NULL;
}
char* data_[100];
};
这里,复制构造函数使X b = a
更安全,更直观,因为它自己创建了所有字符串数据的副本,并且没有对复制的X
对象的进一步依赖或连接,但是这个更慢,可能更浪费内存。
答案 2 :(得分:0)
“隐式复制构造函数(由编译器生成)” - 为所有变量执行浅表复制。
答案 3 :(得分:-2)
是。复制构造函数和赋值运算符是C / C ++中提供的内置函数。它们逐字节复制(这对较大的数组不利,因为它会导致代码膨胀)。它还复制指针,但这将是浅拷贝(如果指针指向某个位置,复制的指针也将指向相同的位置)。