Chồng toán tử là gì làm thế nào để chồng được toán tử

404

Không tìm thấy trang

Có vẻ như không thể tìm thấy trang bạn đang tìm kiếm.

Nạp chồng toán tử trong C++ là các hàm có tên đặc biệt. Tên hàm gồm từ khóa operator và theo sau là ký hiệu của toán tử đang được định nghĩa.

Nạp chồng toán tử được dùng để định nghĩa lại các toán tử có sẵn như ++, – -, +, -, *, /,… cho kiểu dữ liệu (class) do người lập trình tự định nghĩa. Nhằm tạo ra toán tử cùng tên nhưng thực hiện trên các lớp khác nhau chứ không phải trên các kiểu dữ liệu nguyên thủy.

Để dễ hiểu, các bạn xem ví dụ cộng (+) 2 đối tượng phân số bên dưới. Khi cộng (+) sẽ bị lỗi, bởi vì chưa có định nghĩa toán tử cộng (+) cho đối tượng phân số.

#include using namespace std; class Phanso{ private: int tuso;//tử số của phân số int mauso;//mẫu số của phân số public: Phanso(){ tuso = 0; mauso = 1; } Phanso(int tuso, int mauso){ this->tuso = tuso; this->mauso = mauso; } int getTuso(){ return tuso; } int getMauso(){ return mauso; } int setTuso(int tuso){ this->tuso = tuso; } int setMauso(int mauso){ this->mauso = mauso; } }; void main() { Phanso ps1(5, 9); Phanso ps2(7, 10); Phanso ps3; ps3 = ps1 + ps2;//lỗi toán tử + chưa định nghĩa system("pause"); }

Kết quả lỗi
no operator "+" matches these operands

Lưu ý: Ví dụ có khai báo int x=0, y=1; int tong = x + y; không bị lỗi bởi C++ đã định nghĩa sẵn toán tử cộng (+) cho các biến kiểu int rồi.

Cú pháp định nghĩa một toán tử nạp chồng:

Kiểu_trả_về operator (danh_sách_đối_số){ //Định nghĩa toán tử }

Trong đó:
Kiểu_trả_về là kiểu dữ liệu của hàm nạp chồng toán tử.

là tên toán tử cần nạp chồng (+, -, *, /,…)

operator gọi là hàm nạp chồng toán tử. Nó có thể là hàm thành phần hoặc là hàm bạn của lớp (class) nhưng không thể là hàm tĩnh.

Ví dụ:

Diem operator++();//Toán tử ++: toán tử 1 ngôi PhanSo operator+(PhanSo ps);//Toán tử +: toán tử 2 ngôi

Nếu hàm nạp chồng toán tử là hàm bạn (friend function) thì có một đối số cho toán tử một ngôi và hai đối số cho toán tử hai ngôi.

friend PhanSo operator++(PhanSo b); friend PhanSo operator+(PhanSo a, PhanSo b);

Toán tử một ngôi là toán tử chỉ có một toán hạng. Ví dụ: x++, toán tử ++ chỉ có một toán hạng là x. Toán tử hai ngôi là toán tử có hai toán hạng. Ví dụ: a + b, toán tử + phải có đủ 2 số a và b thì mới cộng (+) được.

Trong C++, ta có thể nạp chồng cho hầu hết các toán tử:

+*/%^&
|~!=< > +=
-=*=/=%=^=&=|=
<< >> >>=<<===!=<=
>=&&||++– –->*,
->[]()newnew[]deletedelete[]

Nhưng ngoại trừ những toán tử sau đây:

    • Toán tử xác định thành phần của lớp (‘.’, ‘->’).
    • Toán tử phân giải miền xác định (‘::’).
      Toán tử điều kiện (‘? :’).
    • Toán tử lấy kích thước (‘sizeof’).
    • Toán tử lấy kiểu dữ liệu (‘typeid’)

Lưu ý: Không thể thay đổi các toán tử đã định nghĩa trước trong C++. Ví dụ, không thể định nghĩa lại các phép toán +, -, *, /,… đối với các số kiểu int, float.

Các toán tử một ngôi là các toán tử chỉ có một toán hạng tham gia vào phép toán, như toán tử tăng (++) và toán tử giảm (- -).

#include using namespace std; class Counter{ private: int count; public: Counter(){ count=0; } int getCount(){ return count; } Counter operator ++(){//hàm nạp chồng toán tử count = count + 1; Counter temp; temp.count = count; return temp; } }; void main() { Counter c1, c2; cout << "count of c1 = " << c1.getCount(); cout << "\ncount of c2 = " << c2.getCount() << endl; ++c1; c2 = ++c1; cout << "count of c1 = " << c1.getCount(); cout << "\ncount of c2 = " << c2.getCount() << endl; system("pause"); }

Kết quả
count of c1 = 0 count of c2 = 0 count of c1 = 2 count of c2 = 2

Các toán tử hai ngôi có hai toán hạng như toán tử cộng (+), toán tử trừ (-), toán tử nhân (*), toán tử chia (/),…

#include using namespace std; class Distance{ private: int feet; float inches; public: Distance(){ feet = 0; inches = 0; } Distance(int ft, float in){ feet = ft; inches = in; } void getdist(){ cout << "Enter feet : "; cin >> feet; cout << "Enter inches : "; cin >> inches; } void showdist(){ cout << feet << "\' - " << inches << '\"'; } Distance operator + (Distance d2){//hàm nạp chồng toán tử int f = feet + d2.feet; float i = inches + d2.inches; if (i >= 12.0){ i -= 12.0; f++; } return Distance(f, i); } }; void main() { Distance dist1, dist3, dist4; dist1.getdist(); Distance dist2(11, 6.25); dist3 = dist1 + dist2; dist4 = dist1 + dist2 + dist3; //display all lengths cout << "dist1 = "; dist1.showdist(); cout << endl; cout << "dist2 = "; dist2.showdist(); cout << endl; cout << "dist3 = "; dist3.showdist(); cout << endl; cout << "dist4 = "; dist4.showdist(); cout << endl; system("pause"); }

Kết quả
Enter feet : 5 Enter inches : 3 dist1 = 5' - 3" dist2 = 11' - 6.25" dist3 = 16' - 9.25" dist4 = 33' - 6.5"

Các bạn hãy thử viết hàm nạp chồng các toán tử khác như -, *, /, %,…

Bài trước và bài sau trong môn học

Trong C++, hoàn toàn có thể thay đổi cách toán tử hoạt động (đối với các kiểu người dùng định nghĩa). Trong bài này, bạn sẽ được học cách lập trình tính năng nạp chồng toán tử.

Chồng toán tử là gì làm thế nào để chồng được toán tử

Ý nghĩa của một toán tử luôn luôn là như nhau đối với các biến thuộc kiểu cơ bản như int, float, double…Ví dụ khi cộng hai số nguyên, toán tử + được sử dụng.

Tuy nhiên, đối với kiểu người dùng định nghĩa (như đối tượng), bạn có thể định nghĩa lại cách toán tử hoạt động. Ví dụ:

Nếu có hai đối tượng của một lớp chứa chuỗi là dữ liệu thành viên. Bạn có thể định nghĩa lại ý nghĩa của toán tử + và dùng nó để nối các chuỗi đó.

Tính năng trong lập trình C++ cho phép lập trình viên định nghĩa lại ý nghĩa của một toán tử (khi họ thao tác trên các đối tượng lớp) được gọi là nạp chồng toán tử.

Tại sao nạp chồng toán tử được sử dụng?

Bạn có thể viết bất kỳ chương trình C++ nào mà không cần biết nạp chồng toán tử. Tuy nhiên, nạp chồng toán tử được các lập trình viên rất hay sử dụng để khiến chương trình trở nên có nghĩa hơn. Ví dụ:

Bạn có thể thay thế đoạn mã nguồn dưới đây:

calculation = add(multiply(a, b),divide(a, b));

thành

calculation = (a*b)+(a/b);

Làm thế nào để nạp chồng toán tử trong lập trình C++?

Để nạp chồng một toán tử, một hàm toán tử đặc biệt cần được định nghĩa trong lớp như sau:

class tên_lớp { ... .. ... public kiểu_trả_về operator ký_hiệu (đối_số) { ... .. ... } ... .. ... };
  • Ở đây, kiểu_trả_về là kiểu giá trị hàm sẽ trả về
  • kiểu_trả_về của hàm được theo sau bởi từ khóa operator
  • ký_hiệu là ký hiệu của toán tử bạn muốn nạp chồng. Ví dụ: +, <, -, ++
  • Bạn có thể truyền vào tham số cho hàm toán tử tương tự như với các hàm khác.

Ví dụ: Nạp chồng toán tử trong lập trình C++

#include using namespace std; class Test { private: int count; public: Test(): count(5){} void operator ++() { count = count+1; } void Display() { cout<<"Count: "<Đầu ra

Hàm này được gọi khi toán tử ++ thao tác trên các đối tượng của lớp Test(đối tượng t trong trường hợp này).

Trong chương trình, hàm toán tử void operator ++ () được định nghĩa (trong lớp Test).

Hàm này sẽ tăng giá trị của count lên 1 cho đối tượng t.

Những điều cần ghi nhớ

  1. Nạp chồng toán tử cho phép bạn định nghĩa lại cách mà toán tử hoạt động chỉ đối với các kiểu do người dùng định nghĩa (đối tượng, cấu trúc). Nó không thể được sử dụng cho các kiểu dựng sẵn (int, float, char…).
  2. Hai toán tử = và & đã mặc định được nạp chồng trong C++. Ví dụ: để sao chép đối tượng thuộc cùng lớp, bạn có thể trực tiếp sử dụng toán tử =. Bạn không cần tạo một hàm toán tử.
  3. Nạp chồng toán tử không thể thay đổi thứ tự thực hiện và khả năng kết hợp của các toán tử. Tuy nhiên, nếu bạn muốn thay đổi thứ tự của việc đánh giá, bạn có thể sử dụng dấu ngoặc.
  4. Có 4 toán tử không thể bị nạp chồng trong C++. Chúng là :: (phân giải phạm vi), . (lựa chọn thành viên), .* (lựa chọn thành viên thông qua con trỏ tới hàm) và ?: (toán tử tam nguyên).

Những trường hợp khuyến khích sử dụng khi dùng nạp chồng toán tử

Nạp chồng toán tử cho phép bạn định nghĩa cách toán tử hoạt động (theo cách bạn muốn).

Trong ví dụ trên, toán tử ++ sẽ thao tác trên đối tượng để tăng giá trị của dữ liệu thành viên count lên 1.

void operator ++() { count = count+1; }

Tuy nhiên, nếu bạn sử dụng đoạn mã sau. Nó sẽ giảm giá trị của count đi 100 khi toán tử ++ được sử dụng.

void operator ++() { count = count-100; }

Về mặt kỹ thuật, đây là câu lệnh hợp cách. Nhưng đoạn mã này sẽ khiến việc hiểu và gỡ lỗi trở nên rắc rối và phức tạp hơn.

Công việc của lập trình viên đó là sử dụng nạp chồng toán tử một cách hợp lý và đồng nhất.

Trong ví dụ trên, giá trị của count được tăng lên 1 khi toán tử ++ được sử dụng. Tuy nhiên, chương trình này lại không hoàn thiện vì bạn sẽ không thể sử dụng đoạn mã như:

t1 = ++t

Đó là do kiểu trả về của hàm toán tử là void.