Nạp chồng toán tử C++ – Codefly.Vn

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về nạp chồng toán tử với sự trợ giúp của các ví dụ.

Trong C ++, chúng ta có thể thay đổi cách thức hoạt động của các toán tử đối với các kiểu do người dùng định nghĩa như đối tượng và cấu trúc. Điều này được gọi là quá tải toán tử . Ví dụ,

Giả sử chúng ta đã tạo ba đối tượng c1 , c2 và kết quả từ một lớp có tên Complexđại diện cho các số phức.

Vì nạp chồng toán tử cho phép chúng ta thay đổi cách hoạt động của toán tử, chúng ta có thể xác định lại cách +hoạt động của toán tử và sử dụng nó để thêm các số phức c1 và c2 bằng cách viết đoạn mã sau:

result = c1 + c2;

thay vì một cái gì đó như

result = c1.addNumbers(c2);

Điều này làm cho mã của chúng tôi trực quan và dễ hiểu.

Lưu ý: Chúng tôi không thể sử dụng toán tử quá tải cho các kiểu dữ liệu cơ bản như intfloatcharvà vân vân.

Cú pháp nạp chồng toán tử C ++

Để nạp chồng một toán tử, chúng ta sử dụng một operatorhàm đặc biệt . Chúng tôi xác định hàm bên trong lớp hoặc cấu trúc có các đối tượng / biến mà chúng tôi muốn toán tử nạp chồng hoạt động.

class className {
    ... .. ...
    public
       returnType operator symbol (arguments) {
           ... .. ...
       } 
    ... .. ...
};

Đây,

  • returnType is the return type of the function.
  • operator is a keyword.
  • symbol is the operator we want to overload. Like: +<-++, etc.
  • arguments is the arguments passed to the function.

Quá tải toán tử trong các toán tử đơn lẻ

Toán tử đơn nguyên chỉ hoạt động trên một toán hạng. Toán tử tăng ++và toán tử giảm --là các ví dụ về toán tử một ngôi.

Ví dụ1: Toán tử ++ (Toán tử đơn nhất) Nạp chồng

// Overload ++ when used as prefix

#include <iostream>
using namespace std;

class Count {
   private:
    int value;

   public:

    // Constructor to initialize count to 5
    Count() : value(5) {}

    // Overload ++ when used as prefix
    void operator ++ () {
        ++value;
    }

    void display() {
        cout << "Count: " << value << endl;
    }
};

int main() {
    Count count1;

    // Call the "void operator ++ ()" function
    ++count1;

    count1.display();
    return 0;
}

Đầu ra

Count: 6

Ở đây, khi chúng ta sử dụng ++count1;, cái void operator ++ ()được gọi là. Điều này làm tăng thuộc tính giá trị của đối tượng count1 lên 1.

Lưu ý: Khi chúng ta nạp chồng các toán tử, chúng ta có thể sử dụng nó để làm việc theo bất kỳ cách nào chúng ta muốn. Ví dụ, chúng tôi có thể đã sử dụng ++để tăng giá trị lên 100.

Tuy nhiên, điều này làm cho mã của chúng tôi khó hiểu và khó hiểu. Công việc của chúng tôi với tư cách là một lập trình viên là sử dụng nạp chồng toán tử một cách đúng đắn và theo cách nhất quán và trực quan.

Ví dụ trên chỉ hoạt động khi ++được sử dụng làm tiền tố. Để thực hiện ++công việc như một hậu tố, chúng tôi sử dụng cú pháp này.

void operator ++ (int) {
    // code
}

Chú ý intbên trong dấu ngoặc đơn. Đó là cú pháp được sử dụng để sử dụng các toán tử một ngôi làm hậu tố; nó không phải là một tham số hàm.

Ví dụ 2: Toán tử ++ (Toán tử đơn vị) Nạp chồng

// Overload ++ when used as prefix and postfix

#include <iostream>
using namespace std;

class Count {
   private:
    int value;

   public:

    // Constructor to initialize count to 5
    Count() : value(5) {}


    // Overload ++ when used as prefix
    void operator ++ () {
        ++value;
    }


    // Overload ++ when used as postfix
    void operator ++ (int) {
        value++;
    }

    void display() {
        cout << "Count: " << value << endl;
    }
};

int main() {
    Count count1;

    // Call the "void operator ++ (int)" function
    count1++;
    count1.display();

    // Call the "void operator ++ ()" function
    ++count1;

    count1.display();
    return 0;
}

Đầu ra

Count: 6
Count: 7

Các Ví dụ 2 hoạt động khi ++được sử dụng như cả tiền tố và hậu tố. Tuy nhiên, nó không hoạt động nếu chúng tôi cố gắng làm điều gì đó như sau:

Count count1, result;

// Error
result = ++count1;

Điều này là do kiểu trả về của hàm toán tử của chúng ta là void. Chúng ta có thể giải quyết vấn đề này bằng cách đặt làm Countkiểu trả về của hàm toán tử.

// return Count when ++ used as prefix

Count operator ++ () {
    // code
}

// return Count when ++ used as postfix

Count operator ++ (int) {
   // code
}

Ví dụ 3: Giá trị trả về từ Hàm toán tử (Toán tử ++)

#include <iostream>
using namespace std;

class Count {
   private:
    int value;

   public
       :
    // Constructor to initialize count to 5
    Count() : value(5) {}

    // Overload ++ when used as prefix
    Count operator ++ () {
        Count temp;

        // Here, value is the value attribute of the calling object
        temp.value = ++value;

        return temp;
    }

    // Overload ++ when used as postfix
    Count operator ++ (int) {
        Count temp;

        // Here, value is the value attribute of the calling object
        temp.value = value++;

        return temp;
    }

    void display() {
        cout << "Count: " << value << endl;
    }
};

int main() {
    Count count1, result;

    // Call the "Count operator ++ ()" function
    result = ++count1;
    result.display();

    // Call the "Count operator ++ (int)" function
    result = count1++;
    result.display();

    return 0;
}

Đầu ra

Count: 6
Count: 6

Ở đây, chúng tôi đã sử dụng mã sau để nạp chồng toán tử tiền tố:

// Overload ++ when used as prefix
Count operator ++ () {
    Count temp;

    // Here, value is the value attribute of the calling object
    temp.value = ++value;

    return temp;
}

Mã cho quá trình nạp chồng toán tử postfix cũng tương tự. Lưu ý rằng chúng ta đã tạo một đối tượng tạm thời và trả về giá trị của nó cho hàm toán tử.

Ngoài ra, hãy để ý mã

temp.value = ++value; 

Giá trị biến thuộc về đối tượng count1main() vì count1 đang gọi hàm, trong khi temp.value thuộc đối tượng tạm thời .

Quá tải toán tử trong toán tử nhị phân

Toán tử nhị phân hoạt động trên hai toán hạng. Ví dụ,

result = num + 9;

Đây, +là một toán tử nhị phân hoạt động trên các toán hạng num và 9.

Khi chúng tôi nạp chồng toán tử nhị phân cho các kiểu do người dùng xác định bằng cách sử dụng mã:

obj3 = obj1 + obj2;

Hàm toán tử được gọi bằng cách sử dụng đối tượng obj1 và obj2 được truyền như một đối số cho hàm.

Ví dụ 4: Nạp chồng toán tử nhị phân trong C ++

// C++ program to overload the binary operator +
// This program adds two complex numbers

#include <iostream>
using namespace std;

class Complex {
   private:
    float real;
    float imag;

   public:
    // Constructor to initialize real and imag to 0
    Complex() : real(0), imag(0) {}

    void input() {
        cout << "Enter real and imaginary parts respectively: ";
        cin >> real;
        cin >> imag;
    }

    // Overload the + operator
    Complex operator + (const Complex& obj) {
        Complex temp;
        temp.real = real + obj.real;
        temp.imag = imag + obj.imag;
        return temp;
    }

    void output() {
        if (imag < 0)
            cout << "Output Complex number: " << real << imag << "i";
        else
            cout << "Output Complex number: " << real << "+" << imag << "i";
    }
};

int main() {
    Complex complex1, complex2, result;

    cout << "Enter first complex number:\n";
    complex1.input();

    cout << "Enter second complex number:\n";
    complex2.input();

   // complex1 calls the operator function
   // complex2 is passed as an argument to the function
    result = complex1 + complex2;
    result.output();

    return 0;
}

Đầu ra

Enter first complex number:
Enter real and imaginary parts respectively: 9 5
Enter second complex number:
Enter real and imaginary parts respectively: 7 6
Output Complex number: 16+11i

Trong chương trình này, hàm toán tử là:

Complex operator + (const Complex& obj) {
    // code
}

Thay vì điều này, chúng tôi cũng có thể viết hàm này như:

Complex operator + (Complex obj) {
    // code
}

Tuy nhiên,

  • using & makes our code efficient by referencing the complex2 object instead of making a duplicate object inside the operator function.
  • using const is considered a good practice because it prevents the operator function from modifying complex2.

Nạp chồng toán tử nhị phân trong C ++

Những điều cần nhớ khi Nạp chồng toán tử C ++

  1. Hai toán tử =và &đã được nạp chồng theo mặc định trong C ++. Ví dụ, để sao chép các đối tượng của cùng một lớp , chúng ta có thể sử dụng trực tiếp =toán tử. Chúng ta không cần tạo một hàm toán tử.
  2. Việc nạp chồng toán tử không thể thay đổi mức độ ưu tiên và tính liên kết của các toán tử . Tuy nhiên, nếu chúng ta muốn thay đổi thứ tự đánh giá, nên sử dụng dấu ngoặc đơn.
  3. Có 4 toán tử không thể được nạp chồng trong C ++. Họ đang:
    1. :: (giải quyết phạm vi)
    2. . (lựa chọn thành viên)
    3. .* (lựa chọn thành viên thông qua con trỏ đến chức năng)
    4. ?: (toán tử bậc ba)