ใน C Language Struct Variables รองรับ Assignment Operator (=) เท่านั้น** สำหรับ Built-in Operations ไม่รองรับ ==, !=, <, > และ Operators อื่นๆ โดยตรง
สิ่งที่ทำได้: Assignment
#include <stdio.h>
typedef struct {
int real;
int imag;
} Complex;
void display(Complex c) {
printf("(%d + %di)\n", c.real, c.imag);
}
int main() {
Complex c1 = {5, 2};
Complex c2 = {8, 6};
// Assignment: OK - Member-wise Copy
Complex c3 = c1; // Copy Initialization
c2 = c1; // Copy Assignment
display(c1); // (5 + 2i)
display(c2); // (5 + 2i) - เปลี่ยนแล้ว
display(c3); // (5 + 2i)
return 0;
}
สิ่งที่ทำไม่ได้: Comparison (Compile Error)
Complex c1 = {5, 2};
Complex c2 = {5, 2};
if (c1 == c2) { } // Error: invalid operands to binary == (have 'Complex' and 'Complex')
วิธีแก้: เขียนฟังก์ชันเปรียบเทียบเอง
// Equality Check
int complex_equal(Complex a, Complex b) {
return a.real == b.real && a.imag == b.imag;
}
// Usage
if (complex_equal(c1, c2)) {
printf("Equal\n");
}
C++: รองรับ Operator Overloading
ใน C++ สามารถ Overload Operator ได้:
struct Complex {
int real, imag;
// Member Operator==
bool operator==(const Complex& other) const {
return real == other.real && imag == other.imag;
}
// Non-member (Symmetric)
friend bool operator!=(const Complex& a, const Complex& b) {
return !(a == b);
}
};
// Usage
Complex c1{5,2}, c2{5,2};
if (c1 == c2) { /* OK */ }
Struct Assignment: Shallow Copy Semantics
Struct Assignment ทำ Member-wise Copy (Shallow Copy)
- Value Members: Copy ค่า
- Pointer Members: Copy Address (Shared Pointer!) → ต้องระวัง Double Free
- Array Members: Copy Element-wise (Fixed Array ใน Struct)
typedef struct {
int* data;
size_t size;
} Buffer;
Buffer a = {malloc(100), 100};
Buffer b = a; // Shallow Copy! a.data == b.data
free(a.data); // b.data เป็น Dangling Pointer!
free(b.data); // Double Free!
สรุป
- C Struct: Assignment OK (Member-wise), Comparison ไม่ได้ (ต้องเขียนเอง)
- C++ Struct/Class: สามารถ Overload Operators ได้ (
==,<,=Custom) - Pointer ใน Struct ต้องจัดการ Deep Copy เอง (หรือใช้ Smart Pointer ใน C++)
- C++20:
= defaultสำหรับoperator==Auto-generate ได้