【M30】代理类

时间:2023-03-09 14:40:15
【M30】代理类

1、考虑二维数组,在栈上分配,必须在编译时确定大小,也就是大小是常量。另外一点,C++不支持在堆上分配二维数组。怎么解决这个问题?

  二维数组可以看成,一维数组的数组。因此,可以使用代理类,Array2D的元素是Array1D,Array1D是一维数组,为了支持[][]操作,Array2D重载操作符[],Array1D重载操作符[]。

2、区分operator[]的读写操作,考虑string,基于引用计数的string,赋值是浅拷贝,两个指针指向同一块内存。通过[]获取string中的字符,如果只是读取,没有关系,还可以共享。如果是写操作,必须做一个副本。因此,对于[],需要想办法区分是读操作还是写操作。

3、string中的字符不再使用char,使用代理类CharProxy,为了让CharProxy和char在使用效果上保持一致,提供隐式类型转换(char转换为CharProxy)和隐式类型转换操作符(CharProxy转化为char),CharProxy的copy赋值是写操作,CharProxy的隐式类型转换操作符是读操作。

4、代理类还有一个典型用处,那就是禁止隐式类型转换。隐式类型转换只能进行一次,增加一个代理类,就能禁止隐式类型转换。