ISO C++ operator 重载类型转换时对指针的重要约束!
2008-08-08 10:30
381 查看
这些天在研究标准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方法,通过方法传递值。
这些是本人的一点心得,如果哪里又写的不对的地方希望高人们指点。帮助我进步。
使用下面的方式可以实现上述直接赋值的功能:
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方法,通过方法传递值。
这些是本人的一点心得,如果哪里又写的不对的地方希望高人们指点。帮助我进步。
相关文章推荐
- C++重载类型转换操作符(type cast operator
- C++多重继承下的指针类型转换
- More Effective C++ 条款21 利用重载技术避免隐式类型转换
- C++的指针类型转换
- C++ 操作符重载之 类型转换 重载
- 关于C中字符数组,字符指针以及C++中string类型的两两转换及排序
- C++ 对象或指针类型转换
- C++重载类型转换操作符
- C++类型转换与this指针调整
- 从零开始学C++之从C到C++(二):引用、数组引用与指针引用、内联函数inline、四种类型转换运算符
- C++强制转换不同声明或类型的函数指针隐患
- C++类型转换操作符(type conversion operator)
- C++输出时指针类型自动转换为bool类型输出的一个小疑问
- ISO C++ operator= 重载的一点经验
- C++ 智能指针类型转换(父类->子类,子类->父类)
- C++ 转换类型运算符 通过operator关键字进行转换
- operator 类型转换及重载
- More Effective C++----(21)通过重载避免隐式类型转换
- C++函数重载过程中的二义性和类型转换
- C++多重继承下的指针类型转换