在类中使用重载的const_iterator可以通过以下步骤实现:
以下是一个示例代码:
class MyClass {
private:
int data[5] = {1, 2, 3, 4, 5};
public:
class iterator {
private:
int* ptr;
public:
iterator(int* p) : ptr(p) {}
iterator& operator++() {
++ptr;
return *this;
}
iterator& operator--() {
--ptr;
return *this;
}
int& operator*() const {
return *ptr;
}
};
iterator begin() {
return iterator(data);
}
iterator end() {
return iterator(data + 5);
}
class const_iterator : public iterator {
public:
const_iterator(int* p) : iterator(p) {}
const int& operator*() const {
return *iterator::ptr;
}
};
const_iterator cbegin() const {
return const_iterator(data);
}
const_iterator cend() const {
return const_iterator(data + 5);
}
};
int main() {
MyClass obj;
// 使用iterator遍历
for (auto it = obj.begin(); it != obj.end(); ++it) {
*it = 0; // 修改值
std::cout << *it << " "; // 输出值
}
std::cout << std::endl;
// 使用const_iterator只读遍历
for (auto it = obj.cbegin(); it != obj.cend(); ++it) {
// *it = 0; // 错误,只读访问无法修改值
std::cout << *it << " "; // 输出值
}
std::cout << std::endl;
return 0;
}
在上述示例代码中,MyClass类定义了一个iterator内部类,用于遍历data数组。iterator类重载了operator++、operator--、operator*等运算符,以实现迭代器的移动和取值操作。MyClass类还定义了begin()和end()函数,分别返回iterator类的对象,表示data数组的起始和结束位置。
MyClass类还定义了一个const_iterator类,继承自iterator类,并重载了operator*运算符,以实现只读访问。MyClass类还定义了cbegin()和cend()函数,分别返回const_iterator类的对象,表示data数组的起始和结束位置的只读访问。
在main函数中,使用iterator遍历data数组,并可以修改其中的值。使用const_iterator只读遍历data数组,无法修改其中的值。
这种使用重载的const_iterator的方式可以提供类的成员变量的遍历和只读访问的能力,方便在类中使用迭代器进行操作。
领取专属 10元无门槛券
手把手带您无忧上云