OK. Chúng tôi biết mã sau không thể được biên dịch.Trong hàm vận hành gán, mảng là memcpy hoàn toàn
char source[1024];
char dest[1024];
// Fail. Use memcpy(dest, source, sizeof(source)); instead.
dest = source;
Nhưng, mã sau có thể được biên dịch và hoạt động chính xác.
class A {
char data[1024];
};
A source;
B dest;
dest = source;
Tôi đã tự hỏi, trong chức năng gán toán tử, mảng có được ghi nhớ ngầm không?
Sau đây là mã kiểm tra hoàn chỉnh.
#include <cstdio>
#include <memory>
class A {
public:
char data[1024];
};
int main() {
{
A source;
A dest;
// Initialization
char *data = "hello world";
memcpy (source.data, data, strlen(data) + 1);
printf ("source.data = %s\n", source.data);
printf ("address source.data = %x\n", source.data);
// Works! Does this in the operator assignment function, memcpy is
// being performed implicitly on array.
dest = source;
printf ("dest.data = %s\n", dest.data);
printf ("address dest.data = %x\n", dest.data);
}
{
char source[1024];
char dest[1024];
// Initialization
char *data = "hello world";
memcpy (source, data, strlen(data) + 1);
printf ("source = %s\n", source);
printf ("address source = %x\n", source);
// '=' : left operand must be l-value
// dest = source;
// Works with memcpy.
memcpy(dest, source, sizeof(source));
printf ("dest = %s\n", dest);
printf ("address dest = %x\n", dest);
}
getchar();
}
//RESULT :
//source.data = hello world
//address source.data = 12fb60
//dest.data = hello world
//address dest.data = 12f758
//source = hello world
//address source = 12f344
//dest = hello world
//address dest = 12ef3c
Đã có rất nhiều cuộc thảo luận về lý do tại sao trường hợp này xảy ra trong [Tại sao C++ hỗ trợ phân bổ thành viên theo mảng trong cấu trúc nhưng không thường?] (Http://stackoverflow.com/questions/3437110/why-does -c-support-memberwise-assignment-of-mảng-trong-structs-nhưng-không-gen) –
Trái ngược với std :: string, eh? –