Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การดำเนินการกับ Struct Variables ใน C: Assignment ได้ แต่ Comparison ไม่ได้

ใน 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 ได้