返回类的内部数据带来的问题
2016-01-21 13:01
369 查看
如果一个成员函数返回类的内部数据,那么这个数据就可能被其他程序修改,比如下面这个类:
定义一个String对象a,然后将它赋值给b,对b进行修改也会影响对象a中的私有成员data。导致a输出结果为"12",原因出在这段代码:
这段代码返回类内部的私有成员data,这给了程序自由访问类内部私有成员的机会,所以导致对b的修改作用在a的成员data上。
解决方法一:
不反回data,而是返回一个副本:
解决方法二:
#include<iostream> #include<cstring> using namespace std; class String{ public: String(){ data=new char[1]; data=NULL; } String(const char* ch){ data=new char[strlen(ch)+1]; strcpy(data,ch); } operator char*() const; ~String(){ delete []data; } private: char* data; friend ostream& operator<<(ostream& out,const String& str){ out<<str.data; } }; String::operator char*() const{ return data; } int main(){ const String a("123"); char *b=a; strcpy(b,"12"); cout<<a; }
定义一个String对象a,然后将它赋值给b,对b进行修改也会影响对象a中的私有成员data。导致a输出结果为"12",原因出在这段代码:
String::operator char*() const{ return data; }
这段代码返回类内部的私有成员data,这给了程序自由访问类内部私有成员的机会,所以导致对b的修改作用在a的成员data上。
解决方法一:
不反回data,而是返回一个副本:
String::operator char*() const{ char *temp=new char[strlen(data)+1]; strcpy(temp,data); return temp; }不过这个方法实现起来,速度慢而且涉及到释放在堆上申请的内存,每次使用完这个转换都要记得手动释放内存,很不方便。
解决方法二:
String::operator const char*() const{ return data; }返回一个const指针,这样和C++中string类的c_str()返回类型一致(都是返回cons char*),此时就不能将类型转换后的结果赋予给char*变量,而只能赋予给const char*变量。
const String a("123"); const char *b=a;
相关文章推荐
- ios remote control
- 映射表操作中的常用数组
- shell按行处理文件
- core graphics path
- hdu 2571 命运(dp)
- javascript函数的声明,及返回值
- uva 10994 - Simple Addition
- BZOJ 1491: [NOI2007]社交网络( floyd )
- 欢迎使用CSDN-markdown编辑器
- Android系统架构
- linux 批量删除 svn文件
- 【常用工具类】SharedPreferences封装类SPUtils
- oracle自动添加数据文件
- SQLServer2008 突然用不了搜索文本了,就是Ctrl+F这个功能
- 清华梦的粉碎—写给清华大学的退学申请(转自王垠Blog)
- jenkins+git+android studio自动化构建(持续集成)
- 自定义Cell的Button无法点击
- Spark和Hadoop作业之间的区别
- OPENCV常用小代码
- 计数排序Counting sort