Nạp chồng toán tử truy cập thành viên lớp (->) trong C++
Nạp chồng toán tử truy cập thành viên lớp (->) trong C++ là gì? Hoạt động như thế nào? Cú pháp ra sao? Mời bạn đọc cùng tham khảo bài viết dưới đây của eLib.VN để hiểu rõ hơn về nạp chồng toán tử truy cập thành viên lớp (->) nhé!
Mục lục nội dung
1. Nạp chồng toán tử truy cập thành viên lớp (->) trong C++
Toán tử truy cập thành viên lớp (->) có thể được nạp chồng, nhưng nó khá là phức tạp. Nó được định nghĩa để cung cấp một kiểu lớp một hành vi "pointer-like". Toán tử -> phải là một hàm thành viên. Nếu được sử dụng, kiểu trả về của nó phải là một con trỏ hoặc một đối tượng của một lớp để bạn có thể áp dụng.
Toán tử -> thường được sử dụng kết hợp với toán tử * để triển khai "smart pointer". Những con trỏ này là các đối tượng mà vận hành như các con trỏ thông thường, ngoại trừ việc chúng thực hiện các tác vụ khi bạn truy cập một đối tượng thông qua chúng, ví dụ: xóa đối tượng tự động hoặc khi con trỏ bị hủy hoặc khi con trỏ được sử dụng để trỏ tới đối tượng khác.
Toán tử -> có thể được định nghĩa như là một toán tử hậu tố một ngôi.
class Ptr{
//...
X * operator->();
};
Các đối tượng của lớp Ptr có thể được sử dụng để truy cập các thành viên của lớp X ở trên theo phương thức giống như cách các con trỏ được sử dụng. Ví dụ:
void f(Ptr p )
{
p->m = 10 ; // la tuong tu (p.operator->())->m = 10
}
Lệnh p->m được thông dịch thành (p.operator->())->m.
2. Ví dụ Nạp chồng toán tử truy cập thành viên lớp (->) trong C++
Sử dụng cùng khái niệm trên, ví dụ sau sẽ giải thích cách một toán tử truy cập lớp -> trong C++ có thể được nạp chồng.
#include <iostream>
#include <vector>
using namespace std;
// gia su co mot lop eLib sau.
class eLib {
static int i, j;
public:
// cac smart pointer de hien thi
void f() const { cout << i++ << endl; }
void g() const { cout << j++ << endl; }
void h() const { cout << "--------" << endl; }
};// phan dinh nghia cac thanh vien Static:
int eLib::i = 5;
int eLib::j = 20;
// Trien khai mot container cho lop tren
class VTContainer {
vector<eLib*> a;
public:
void add(eLib* vj)
{
a.push_back(vj); // goi phuong thuc chuan cua vector.
}
friend class SmartPointer;
};
// trien khai smart pointer de truy cap thanh vien cua lop eLib.
class SmartPointer {
VTContainer vc;
int index;
public:
SmartPointer(VTContainer& vjc)
{
vc = vjc;
index = 0;
}
// tra ve gia tri de chi phan cuoi cua danh sach:
bool operator++() // phien ban toan tu ++ (tien to)
{
if (index >= vc.a.size()) return false;
if (vc.a[++index] == 0) return false;
return true;
}
bool operator++(int) // phien ban toan tu ++ (hau to)
{
return operator++();
}
// nap chong operator->
eLib* operator->() const
{
if (!vc.a[index])
{
cout << "Gia tri 0!!";
return (eLib*)0;
}
return vc.a[index];
}
};int main() {
// so vong lap la 5 (ban thiet lap gia tri khac de xem ket qua)
const int sz = 5;
eLib o[sz];
VTContainer vc;
for (int i = 0; i < sz; i++)
{
vc.add(&o[i]);
}
SmartPointer sp(vc); // tao mot iterator
do {
sp->f(); // goi smart pointer
sp->g();
sp->h();
} while (sp++);
return 0;
}
Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:
Trên đây là bài viết của eLib.VN về Nạp chồng toán tử truy cập thành viên lớp (->) trong C++. Hy vọng qua bài này bạn sẽ hiểu và vận dụng trong quá trình học tập và làm việc với C++. Chúc các bạn thành công!
CNhư vậy là chúng ta đã hoàn thành nội dung "Nạp chồng toán tử trong C++ ". Để củng cố và nắm vững nội dung đã học, mời bạn cùng thử sức với "Bộ Câu hỏi Trắc Nghiệm C++ có đáp án chi tiết"
Tham khảo thêm
- doc Nạp chồng toán tử và Nạp chồng hàm trong C++
- doc Nạp chồng toán tử một ngôi trong C++
- doc Nạp chồng toán tử nhị phân trong C++
- doc Nạp chồng toán tử quan hệ trong C++
- doc Nạp chồng toán tử Input/Output trong C++
- doc Nạp chồng toán tử ++ và -- trong C++
- doc Nạp chồng toán tử gán trong C++
- doc Nạp chồng toán tử gọi hàm () trong C++
- doc Nạp chồng toán tử subscript [] trong C++