C++Primer : 第十四章 :下标运算符

表示容器的类通常可以通过元素在容器中的位置访问元素,这些类一般会定义下标运算符operator[]。
下标运算符必须是成员函数
为了与下标的原始定义兼容,下标运算符通常以访问元素的引用作为返回值,这样的好处是下标可以出现在赋值运算符的任意一端。进一步,我们最好同时定义下标运算符的常量版本和非常量版本,当作用于一个常量对象时,下标运算符返回常量引用以确保我们不会给返回的对象赋值。

如果一个类包含下标运算符,则它通常会定义两个版本:一个返回普通引用,另一个是类的常量成员并返回常量的引用。

class StrVec {
public:
	string& operator[](size_t n) {
		return elements[n];
	}
	const string& operator[](size_t n) const {
		return elements[n];
	}
private:
	string* elements;       //指向数组首元素的指针
};

当StrVec是非常量时,可以给元素赋值,当对常量对象取下标时,不能为其赋值:

//假设svec是一个StrVec对象
const StrVec cvec = svec;      //把svec的元素拷贝到cvec中
//如果svec中含有元素,对第一个元素运行string的empty函数
if (svec.size() && svec[0].empty()){
	svec[0] = "zero";   //正确:下标运算符返回string的引用
	cvec[0] = "Zip";    //错误:对cvec取下标返回的是常量引用
}

为你的StrBlob类、StrBlobPtr类、StrVec类和String类定义下标运算符

class StrBlob {
public:
	string& operator[](size_t n) {
		return data[n];
	}
	const string& operator[](size_t n) const {
		return data[n];
	}
};
class StrBlobPtr {
public:
	string& operator[](size_t n) {
		return (*wptr.lock())[n];
	}
	const string& operator[](size_t n) const {
		return (*wptr.lock())[n];
	}
};
class String {
public:
	char& operator[](size_t n) {
		return (char)str[n];
	}
	const char& operator[](size_t n) const {
		return (char)str[n];
	}
private:
	char* str;
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值