`
bcyy
  • 浏览: 1825734 次
文章分类
社区版块
存档分类
最新评论

重载下标运算符[]

 
阅读更多

看了bitset的源码,发现要重载下标运算符[]内容还挺多的,作右值时相对简单,只用来测试。作左值时就比较麻烦,因为要修改它的值。

1、作右值

举个例子:

const bitset<10> b;
bool tag;
tag = b.test(2);
tag = b[2];

上面第三句和第四句效果一样,都是测试b的下标为2的位是否为1。
当bitset为const时,operator[]执行的是:

bool operator[](size_t _Pos) const
{	// subscript nonmutable sequence
	return (test(_Pos));
}

可以看到,内部还是调用了test。

2、作左值

举个例子:

bitset<10> b;
b.set(2);
b[2] = 1;  // 或b.operator[](2) = 1; // 或(b.operator[](2)).operator=(1);

上面的第二句和第三句效果一样,都是将b的下标为2的位设置为1,其实执行第三句时内部还是要调用set()的。

下面详细介绍:

#include <iostream>
#include <bitset>
using namespace std;

int main(int argc, char **argv)
{
	bitset<10> b;

	// 第1步
	bitset<10>::reference r = b.operator[](2);  
	// 函数名是operator[],实参是2,返回reference对象

	// 第2步
	r.operator=(1);
	// 这里r._Pbitset与&b相等(原理就是r用_Pbitset记住了b的地址),故改变了*_Pbitset也就改变了b
	// r无任何改变

	// 最后结果
	// r._Pbitset:[bitset]	[10](0,0,1,0,0,0,0,0,0,0)	类型:std::bitset<10> *
	// b:					[10](0,0,1,0,0,0,0,0,0,0)	类型:std::bitset<10>
	// 两者是一致的
	return 0;
}

关于bitset类的定义,下面是个简化版:

// bitset类的简化版
// 为了与库bitset区别,这里首字母大写
class Bitset
{
public:
	class Reference
	{
		friend class Bitset; // 为了Reference外Bitset内的operator[]能访问Reference构造函数(private)

	public:
		Reference& operator=(bool _Val)		// 第2步,还是要调用set
		{
			_PBitset->set(_Mypos, _Val);	// r没变,但(*_PBitset)即b改变了
			return (*this);
		}

	private:
		Bitset *_PBitset;	//  Key
		size_t _Mypos;
		Reference(Bitset& _Bitset, size_t _Pos) : _PBitset(&_Bitset), _Mypos(_Pos)
		{
			// 构造函数
		}
	};

	Reference operator[](size_t _Pos)  // 第1步
	{
		return (Reference(*this, _Pos));
		// 这个地方用法很怪!直接调用构造函数,创建一个无名的临时对象
	}

	Bitset& set(size_t _Pos, bool _Val = true)
	{
		// 略
	}
};

下面摘录自《C++ Primer》(李师贤译)P94:

下标操作返回左值,因此可将下标操作作为赋值操作的左操作数。对下标操作的结果赋值是赋一个新值到相应的元素。

但我认为这是有前提的!如第一种情况,读const bitset时调用的operator[]返回的就是bool类型,而非reference类型。

关于bitset的源码,可以在VC\include\bitset中找到。

最后一个问题:

bitset<10> b;
bool tag;
tag = b[2];

这个测试又跟第一种不同了,其实这种情况比const那种测试常见地多,下次再介绍了。

分享到:
评论

相关推荐

    重载双下标运算符

    Mat() { for(int i=0;i;i++) { data[i]=i; } } Mat operator[](int i) //搜索二维组行标 { return Data[i]; }

    C++运算符重载 详细介绍PPT

    详细介绍 C++运算符重载 的PPT 文中部分内容: 下标运算符“[ ]”重载 C++把下标运算符[ ]看成一个双目运算符,其操作数为...重载下标运算符“[]”时,返回一个int的引用,所以可使重载“[]”用在赋值语句的左边。

    C++运算符重载的思维导图

    运算符重载 、运算符重载规则 1.重载运算符的限制 2.运算符重载的语法形 ...②重载下标运算符[ ③重载函数调用符 0④重载流插入和流提取运算符 a.前提 四、类类型转换 1.构造函数构造 2.类型转换函数

    C++实验报告

    面向对象程序设计 全面,完整实验报告 实验一

    函数型指针的定义及使用

    函数型指针,认真学习指针,掌握函数型指针的用法及定义

    利用C++仿照string设计实现自己的字符串类型课程设计实验报告

    1、 仿照标准字符串类string ,设计一个自己的字符串类String。 主要完成以下任务: 1)数据成员是字符指针,可...5)重载下标运算符[]。 6)串比较。重载 “==”和“&lt;”。 7)字符串输入和输出。重载“&gt;&gt;”和“”。

    C++ 课程作业 群体类和群体数据的组织(模板数组类(支持分数和浮点数的求和计算))

    3. 重载下标运算符,返回数组的元素。 封装一个分数类Fract,用来处理分数功能和运算,能支持你的Array类使用。 1. 构造:传入两个参数n和m,表示n/m;分数在构造时立即转化成最简分数。 提示:分数化简有专门的...

    jiancha.rar_数组 越界 检查

    设计一个用于检查数组在使用时下标是否越界的类,如越界给出提示。(知识点:下标运算符的重载)。

    模板数组类(支持分数和浮点数的求和计算) .cpp

    3. 重载下标运算符,返回数组的元素。 封装一个分数类Fract,用来处理分数功能和运算,能支持你的Array类使用。 1. 构造:传入两个参数n和m,表示n/m;分数在构造时立即转化成最简分数。 提示:分数化简有专门...

    一维动态数组实现的矩阵类

    具体用法与测试用例Main.cpp里有3个测试用例,分别是针对构造函数属性计算与运算符重载的 内已包含测试工程xp\vc6.0\上亲测通过,并经过BoundsChecker测试没有内存泄漏。有兴趣的童鞋可以下作参考。 注意: 1、...

    自定义的矩阵类,内含源码与测试工程

    具体用法与测试用例Main.cpp里有3个测试用例,分别是针对构造函数属性计算与运算符重载的 内已包含测试工程xp\vc6.0\上亲测通过,并经过BoundsChecker测试没有内存泄漏。有兴趣的童鞋可以下作参考。 注意: 1、...

    C++入门指南-v2.4.pdf

    这是DS小龙哥编写整理的C++入门指南PDF文档,适合C++初学者,C语言转C++工程师当做入门工具书学习。...6.8 重载[ ](下标运算符) 107 七、C++模板和泛型程序设计 108 7.1 函数模板 108 7.2 类模板 110

    C++实验1代码1.4

    1.4 设计一个圆类包含周长和面积计算成员函数在主函数中输入圆的半径输出圆的周长和面积

    详解C++中的函数调用和下标以及成员访问运算符的重载

    主要介绍了详解C++中的函数调用和下标以及成员访问运算符,讲到了这些二元运算符使用的语法及重载,需要的朋友可以参考下

    C++实验4代码4.3

    4.3 设计一个一维的int数组类IntArray(属性:下标下 限、下标上限、int型指针),可以任意指定下标范围(初始化时要判断下标是否正确),并重载下标访问运算符“[]”实现数组类的下标访问。在主函数中(创建一个...

    动态数组-模仿vector

    模拟vector所写的线性表。通过模板类,可以保存任意类型数据。需要数据类型具有赋值运算符和默认构造函数以及比较运算符。线性表提供向末尾添加,向表中插入,删除等接口函数...重载了下标运算符,赋值已经比较运算符等

    C++程序设计实验6.doc

    实验6 运算符重载 实验目的 掌握运算符重载的规则; 掌握运算符成员函数与运算符友元函数的实现及应用; 学会定义类中单目和双目运算符的重载函数; 理解重载运算符的作用,学会对典型的运算符进行重载。 实验学时 ...

    4-1一维数组的基本操作1

    一维数组基本操作的 C++代码一维数组类// 数组的初始构造函数// 数组的复制构造函数// 为复制数组申请空间// 复制数组元素// 重载下标符运算符 []/

Global site tag (gtag.js) - Google Analytics