C++下标运算符重载的一些理解

重载二维数组时,调用时如a[1][2], 其实质应该是:(假设数组类型为int)

a.operator[](1)返回int*,int*作为行指针调用(int*)[2],达到目的。

分享mooc郭炜老师的一道题目:(关于三维数组下标符重载)


#include <iostream>
#include <iomanip> 
#include <cstring>
using namespace std;
template <class T>
class CArray3D
{
//your code starts here	
 	  public:
	  		T * p;
	  		int L,r,c; //���鹲L�㣬ÿ��r��,ÿ��c��

	  class Aid {
	  public:
		  T * lp; // lp��ijһ���Ԫ�ص���ʼ��ַ
		  int c; //���鹲L�㣬ÿ��r��,ÿ��c��
	
		  Aid( T * p_,int c_):lp(p_),c(c_) { }
		  T * operator[]( int r ) {
				return lp + r * c; //����ֵ���DZ���ĵ� r�е�Ԫ�ص���ʼ��ַ		  
		  }
		  
		  operator T * () {
		  	return lp ; //����ֵ���DZ����Ԫ�ص���ʼ��ַ		  
		  	
		  }
		  
	  };
	 CArray3D(int l_,int r_,int c_ ):L(l_),r(r_),c(c_) {
	  			 p = new T [L * r * c];
	 }		 
	 Aid operator[](int L) { //���صĶ������p��¼�˵�L��Ԫ�ص���ʼ��ַ
		  T * lp = p + L * r * c;
		  return Aid(lp,c);
	 }
	 ~CArray3D() { delete [] p; }
	 //your code ends here
};

CArray3D<int> a(3,4,5);
CArray3D<double> b(3,2,2);
void PrintA()
{
	for(int i = 0;i < 3; ++i) {
		cout << "layer " << i << ":" << endl;
		for(int j = 0; j < 4; ++j) {
			for(int k = 0; k < 5; ++k) 
				cout << a[i][j][k] << "," ;
			cout << endl;
		}
	}
}
void PrintB()
{
	for(int i = 0;i < 3; ++i) {
		cout << "layer " << i << ":" << endl;
		for(int j = 0; j < 2; ++j) {
			for(int k = 0; k < 2; ++k) 
				cout << b[i][j][k] << "," ;
			cout << endl;
		}
	}
}

int main()
{

	int No = 0;
	for( int i = 0; i < 3; ++ i ) {
		a[i];
		for( int j = 0; j < 4; ++j ) {
			a[j][i];
			for( int k = 0; k < 5; ++k )
				a[i][j][k] = No ++;
			a[j][i][i];	
		}
	}
	PrintA();
	memset(a[1],-1 ,20*sizeof(int));	
	memset(a[1],-1 ,20*sizeof(int));
	PrintA(); 
	memset(a[1][1],0 ,5*sizeof(int));	
	PrintA();

	for( int i = 0; i < 3; ++ i )
		for( int j = 0; j < 2; ++j )
			for( int k = 0; k < 2; ++k )
				b[i][j][k] = 10.0/(i+j+k+1);
	PrintB();
	int n = a[0][1][2];
	double f = b[0][1][1];
	cout << "****" << endl;
	cout << n << "," << f << endl;
		
	return 0;
}

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值