Hôm nay tôi đã dạy cho một vài người bạn cách sử dụng C struct
s. Một trong số đó hỏi nếu bạn có thể trả về một struct
từ một chức năng, mà tôi trả lời: "Không Bạn muốn trở gợi ý để tự động malloc
ed struct
. S thay vì"
Đến từ một người chủ yếu làm C ++, tôi đã hy vọng không thể trả về struct
s theo các giá trị. Trong C ++, bạn có thể quá tải operator =
cho các đối tượng của mình và hoàn toàn có ý nghĩa để có một hàm trả về đối tượng của bạn theo giá trị. Tuy nhiên, trong C, bạn không có tùy chọn đó và vì vậy nó khiến tôi suy nghĩ trình biên dịch đang thực sự làm gì. Hãy xem xét những điều sau đây:
struct MyObj{
double x, y;
};
struct MyObj foo(){
struct MyObj a;
a.x = 10;
a.y = 10;
return a;
}
int main () {
struct MyObj a;
a = foo(); // This DOES work
struct b = a; // This does not work
return 0;
}
Tôi hiểu tại sao struct b = a;
không nên hoạt động - bạn không thể quá tải operator =
cho loại dữ liệu của mình. Làm thế nào mà nó a = foo();
biên dịch tốt? Nó có nghĩa gì khác struct b = a;
không? Có lẽ câu hỏi cần đặt ra là: Chính xác thì return
tuyên bố kết hợp để =
ký là gì?
[sửa]: Ok, tôi chỉ là struct b = a
là một lỗi cú pháp - điều đó đúng và tôi là một thằng ngốc! Nhưng điều đó làm cho nó thậm chí còn phức tạp hơn! Sử dụng struct MyObj b = a
thực sự làm việc! Tôi đang thiếu gì ở đây?
struct MyObj b = a;
dường như không hoạt động :)
struct b = a;
là một lỗi cú pháp. Nếu bạn cố gắngstruct MyObj b = a;
thì sao?