返回类的内部数据带来的问题

如果一个成员函数返回类的内部数据,那么这个数据就可能被其他程序修改,比如下面这个类:

#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;



你可能感兴趣的:(返回类的内部数据带来的问题)