返回类的内部数据带来的问题
来源:互联网 发布:淘宝如何申请分销 编辑:程序博客网 时间:2024/05/22 21:15
如果一个成员函数返回类的内部数据,那么这个数据就可能被其他程序修改,比如下面这个类:
#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;
0 0
- 返回类的内部数据带来的问题
- 【学习】避免返回内部数据的句柄
- 避免返回内部数据的句柄
- c++ 避免返回内部数据的句柄
- 避免返回内部数据的句柄
- GHOST带来的数据恢复问题
- 大数据时代带来的伦理问题
- 解决网页重定向带来的无法返回的问题
- 数据共享之共享数据带来的问题
- Spring带来的问题
- 脚本带来的问题
- java泛型 泛型的内部原理:类型擦除以及类型擦除带来的问题
- java 泛型的内部原理:类型擦除以及类型擦除带来的问题
- java泛型、泛型的内部原理:类型擦除以及类型擦除带来的问题
- java泛型的内部原理:类型擦除以及类型擦除带来的问题
- java泛型的内部原理、类型擦除以及类型擦除带来的问题
- 泛型的内部原理:类型擦除以及类型擦除带来的问题
- 泛型的内部原理:类型擦除以及类型擦除带来的问题
- 升级python之后,yum下载东西时出现File "/usr/bin/yum", line 30
- What is Docker and why is it so darn popular?
- 下一轮WiFi革命来临:详解高通MU-MIMO技术(Multi-User Multiple-Input Multiple-Output多用户多入多出技术)
- linux-0.12/boot/setup.S`
- 安卓加载外部数据库
- 返回类的内部数据带来的问题
- TencentApiInterfaceDelegate 是这个找不到的原因
- 唯品会峰值系统架构演变
- 冒泡排序
- JSON和XML:不可同日而语
- 带引用计数智能指针
- 计数排序Counting sort
- 在IDE myeclipse中启动tomcat后,项目和tomcat都访问不了
- HDOJ 2141 Can you find it?