c++编写成员函数GetString,使其能返回该类的字符串,但不能通过外部变量修改该类内部的字符串。
发布网友
发布时间:2022-05-10 20:18
我来回答
共2个回答
热心网友
时间:2023-10-28 12:29
问题是在字符串作为函数参数的传值问题。
C没有string类,但是C++有,如果依赖于字符数组管理字符串必须理解字符串、字符数组、指针之类的概念。
char a[]定义了一个数组,a的类型是char [],有自己的空间存储字符。
当a作为参数传递给函数是,参数类型会变为char *,仅仅传递了a的首地址。如果在函数里对a进行操作,也会影响函数外的数组。
因此该类的设计应该是:
类必须有自己的字符数组空间,来存储char *参数指向的字符串。
在构造函数里KeepString(char s[]),调用strcpy将s所指向的字符串赋值给对象的成员变量。也就是说,成员变量也必须是一个有自己空间的数组,而不是一个char *指针。
通过函数来返回该字符串,必定不能将该成员变量的地址返回,不然通过地址是可以更改字符串的。而且局部变量的内存空间在跳出代码块后会被释放,所以不能返回一个字符数组。因此需要设计一个成员函数,来接受一个char *外部参数,在函数内部同样调用strcpy将字符串内容拷贝一份至该外部参数。该外部参数需要有自己的内存空间。
伪代码:
class A
{
char s[100];//足够大的数组
A(char *t); //将t指向的字符串拷贝至成员变量s;
getString(char *t); //将s拷贝至参数t指向的内存空间
}
main()
{
char t[];
A a(t);
char str[]
a.getString(str);
}
具体代码自己完善
热心网友
时间:2023-10-28 12:30
#include<iostream>
#include<string.h>
using namespace std;
class KeepString{
private:
char *str;
public:
KeepString(const char s[]);
char* GetString();
};
KeepString::KeepString(const char s[]){
str = new char[strlen(s)+1];
strcpy(str,s);
}
char* KeepString::GetString(){
char *s = new char[strlen(str)+1];
strcpy(s,str);
return s;
}
int main(){
KeepString KS("Internal String");
char *p = KS.GetString();
p[0] = 'i';
p[9] = 's';
cout << p << endl;
cout << KS.GetString() << endl;
}