这些天在研究标准C++ operator的重载,当研究到如何实现CString 变量直接赋值给Char* 变量时碰到了重载 char* 类型转换,发现了一个需要注意的约束。
使用下面的方式可以实现上述直接赋值的功能:
- class CSting {
- ...
- char * p;
- ...
- char * operator char* () ;
- ...
- };
- char * CString::operator char* ()
- {
- return p;
- }
- ...
- int main()
- {
- char * a;
- CString b;
- }
但是这里问题也就诞生了,首先我们需要考虑以下几种情况:
1 )当被赋值的变量char * a 没有分配一个有效的存储空间,会发生当CString b被删除后,导致a指向了一个不存在的空间,产生一个空指针异常,可能导致系统崩溃。
2 )当被赋值的变量char* a 已经分配了一个有效的存储空间,会发生当CString b赋值后,原先的空间丢失,内存内存泄露,而且当CString b被删除后,发生和上面1提到的一样的问题
3 )我们修改CString 的重载代码如下:
- operator char* (char * left,CString right)
- {
- strcpy(left,right);
- }
这样看来我们似乎可以解决空指针的问题和上面第2点提到的内存丢失问题,但是这样一来又有新的问题诞生,这个问题时显而易见的,当char *a 没有分配有效存储空间时,这样的赋值无疑是致命的。
因此通过上述的情况发现重载类型转换操作符时如果遇到需要重载含有指针类型时要格外小心,并制定一定的约束。通过我在实际中的使用我个人认为这样的类型转换重载可以使用return p的方式来传递指针,但是必须保证被赋值的a是一个拥有有效存储空间的指针,如果不确定被赋值对象的有效性,因在类内部提供一定的public方法,通过方法传递值。
这些是本人的一点心得,如果哪里又写的不对的地方希望高人们指点。帮助我进步。