Để cho bạn thấy sức mạnh của việc nạp chồng toán tử, chúng tôi sẽ chỉ cho bạn một ví dụ về việc triển khai một toán tử rất hay ho. Chúng ta sẽ định nghĩa lại toán tử chỉ mục.
Yes, chúng ta biết rằng nó được thiết kế cho các mảng hoặc kiểu dữ liệu tương tự như mảng và có vẻ như là ngăn xếp không liên quan gì đến nó. Tuy nhiên, ở một khía cạnh nào đó thì ngăn xếp là một mảng – một mảng rất đặc biệt, nhưng vẫn là một mảng.
Việc lập chỉ mục sẽ hoạt động như sau:
- Stack [0] trả về một tham chiếu đến phần tử nằm ở trên cùng của ngăn xếp
- Stack [-1] trả về một tham chiếu đến phần tử nằm dưới phần tử trên đầu ngăn xếp
- … và cứ tiếp tục như vậy
Lưu ý rằng nó trả về tham chiếu chứ không phải giá trị vì chúng ta muốn sử dụng giá trị trả về của toán tử đó với vai trò l-value trong các biểu thức.
Một nỗ lực truy cập đến một phần tử ngăn xếp không tồn tại sẽ gây ra một ngoại lệ được ném ra. Có vẻ như std :: range_error là ứng cử viên tốt nhất cho mục đích này. (trong phạm vi phần C++ cơ bản thì ae chưa cần quan tâm nhiều đến xử lý ngoại lệ nhé, tuy nhiên vẫn cứ phải đưa vào đây để đảm bảo tính hợp lý và thực tế)
OK. Chúng ta khai báo cho toán tử cho lớp Stack như sau →
1 |
int& operator[] (int index) throw(std::range_error); |
Lưu ý:
- Toán tử này trả về kiểu int& bởi vì kiểu dữ liệu của phần tử của Stack là int.
- Toán tử có một tham số là index, nó được truyền bằng giá trị bởi vì index của một mảng thì không nhất thiết phải chứa trong một biến, nó cũng có thể được biểu diễn bằng một biểu thức.