1、关于成员函数operator[]的备注
Unfortunately, there is no way for C++ compilers to tell us whether a particular use of operator[] is for a read or a write, so we must be pessimistic and assume that all calls to the non-const operator[] are for writes. 不幸的是,C++编译器没有办法告诉我们一个特定的operator[]是用作读的还是写的,所以我们必须保守地假设“所有”调用非const operator[]的行为都是为了写操作。
Unfortunately, there is no way for C++ compilers to tell us whether a particular use of operator[] is for a read or a write, so we must be pessimistic and assume that all calls to the non-const operator[] are for writes.
不幸的是,C++编译器没有办法告诉我们一个特定的operator[]是用作读的还是写的,所以我们必须保守地假设“所有”调用非const operator[]的行为都是为了写操作。
2、这个版本未能解决的问题
只有一个挥之不去的问题。看一下这样的代码: String s1 = "Hello"; char *p = &s1[1]; 现在看增加一条语句: String s2 = s1; String的拷贝构造函数使得s2共享s1的StringValue对象, 下面这样的语句将有不受欢迎的结果: *p = 'x'; // modifies both s1 and s2! String的拷贝构造函数没有办法检测这样的问题,因为它不知道指向s1拥有的StringValue对象的指针的存在,这样就导致了s1和s2同时被修改了。 并且,这个问题不局限于指针:它同样存在于有人保存了一个String的非const operator[]的返回值的引用的情况下。
只有一个挥之不去的问题。看一下这样的代码:
String s1 = "Hello";
char *p = &s1[1];
现在看增加一条语句:
String s2 = s1;
String的拷贝构造函数使得s2共享s1的StringValue对象,
下面这样的语句将有不受欢迎的结果:
*p = 'x'; // modifies both s1 and s2!
String的拷贝构造函数没有办法检测这样的问题,因为它不知道指向s1拥有的StringValue对象的指针的存在,这样就导致了s1和s2同时被修改了。
并且,这个问题不局限于指针:它同样存在于有人保存了一个String的非const operator[]的返回值的引用的情况下。