|
引用方式处理数组(原创) |
我们知道c++中不能建立数引用的数组,因为数组名只是代表数组的首地址,而不是一个变量(显然它是常数嘛),所以不能建立引用的数组。当用数组作为参数进行传递时,一般相到指针方式的值传递。而有了C++的引用,它的优点使得有时候可能想这样做,就是形参用引用方式来进行处理。由于不能用引用形的数组(int &arr[2][3])作为形参,所以象我等初学者认为这是不可能的。今天没事我就自己弄弄看,居然可以用引用。思路大体如下:因可以建立指针的引用,所以想到中间代换,即先用一指针指向数组的首地址,然后再建立该指针的引用,这就相当于有了中间指针的别名,当改变别名的值时,就改变了中间指针变量中的值,而中间指针变量又是指向数组元数的,自然就改变了数组的值了。例如:int a[2];先建立指向数组的指针int *p=a;然后就可建立指针的引用:int *&pt=p;这是pt 其实就是指针p的别名了,也就是p和pt是同一个变量了,改变pt就等于改变p,而改变指针p就是改变了p指向的变量的值了。
下面是一个二行三列矩阵的加法运算,并输出结果,由于需要重载了<<和+,数据成员data是数据成员,一个二行三列的数组。多的就不说了,好多地方都标出来了,仔细看一下就知道了。
#include <iostream.h>
/*====================声明矩阵类=========================*/class Rect{public: Rect();//声明无参构造函数 Rect(int *&p); //带一个参数的构造函数,用于二维数组的引用算法 friend ostream & operator<<(ostream &,Rect &); //友元重载<<运算符 Rect operator+ (Rect &other); //成员重载+运算符private: int data[2][3]; //二行三列矩阵
};
/*===============类体外相关定义=======================*/Rect::Rect(){for(int i=0;i<2;i++) for(int j=0;j<3;j++) { data[i][j]=0; }}
Rect::Rect(int *&p){ int *pt=data[0]; int *&p1=pt; for(int i=0;i<6;i++) *(p1++)=*(p++);
}Rect Rect::operator+(Rect &other) //定义成员重载+运算符{ Rect ret; for(int i=0;i<2;i++) for(int j=0;j<3;j++) { ret.data[i][j]=data[i][j]+other.data[i][j]; } return ret;}
ostream &operator<<(ostream & output, Rect &rect)//定义友元重载<<运算符{ for(int i=0;i<2;i++) { for(int j=0;j<3;j++) output<<rect.data[i][j]<<" "; output<<endl; } return output;}
/*==================主函数=====================*/void main(){ int data1[2][3];//等待输入 int data2[2][3]={{1,1,1},{2,2,2}};
//int *pt=data1[0]; for(int i=0,*pt=data1[0];i<sizeof(data1)/sizeof(int);i++) { cin>>*(pt++); }
int *p2=data1[0];//先用一指针得到数组首地址 Rect re1(p2);//此时调用指针引用 p2=data2[0]; Rect re2(p2); Rect re3;
re3=re2+re1; cout<<re3<<endl;}
输入:1 2 3 4 5 6
结果:1 2 3 4 5 6 2 3 4 6 7 8
Press any key to continue说明:二维数组:a[2][3]; a=a[0];但是a+1 != a[0]+1;因a+1=a[1]=&a[1][0],而a[0]+1=&a[0][1]
另外这是个人所得,不知是否孤陋寡闻,因不才看的c++书中没有介绍这种方法,如果有人看到相关的书,告知小弟一声!还有如果有误请指出,谢谢! | |
|
|
|
|