C+中的C风格字符串实现+; 我正在试用C++中的C风格字符串实现。 我为类字符串创建了一个对象和一个指针,并将该对象分配给指针。当我试图通过指针修改对象而不是修改现有对象时,我想创建一个新对象并使指针指向它
因此,我重载了“=”操作符,并在操作符重载方法中创建了一个新对象。为了反映变化,我需要使用C+中的C风格字符串实现+; 我正在试用C++中的C风格字符串实现。 我为类字符串创建了一个对象和一个指针,并将该对象分配给指针。当我试图通过指针修改对象而不是修改现有对象时,我想创建一个新对象并使指针指向它,c++,operator-overloading,this,C++,Operator Overloading,This,因此,我重载了“=”操作符,并在操作符重载方法中创建了一个新对象。为了反映变化,我需要使用ss=*ss=“name” 任何改进此代码的建议 下面是我的示例代码 class String { char *str; public: String(char* str_in) { str = new char[strlen(str_in)]; strcpy(str, str_in); } String* operator=(char
ss=*ss=“name”代码>
任何改进此代码的建议
下面是我的示例代码
class String
{
char *str;
public:
String(char* str_in)
{
str = new char[strlen(str_in)];
strcpy(str, str_in);
}
String* operator=(char* s)
{
return new String(s);
}
};
int main()
{
String s="sample";
String *ss;
ss = &s;
ss=*ss = "name";
return 0;
}
我还试图修改this指针,但没有按预期工作
String *ptr;
ptr = const_cast<String*>(this);
ptr = new String(s);
String*ptr;
ptr=常数(本);
ptr=新字符串;
我建议进行如下更改:
#include <string.h>
class String
{
char *str;
public:
String(const char* str_in)
{
str = new char[strlen(str_in)];
strcpy(str, str_in);
}
~String()
{
delete [] str;
}
String& operator=(const char* s)
{
char* tmp = new char[strlen(s)];
strcpy(tmp, s);
delete [] str;
str = tmp;
return *this;
}
};
int main()
{
String s("sample");
String *ss;
ss = &s;
ss = new String("name");
delete ss;
return 0;
}
#包括
类字符串
{
char*str;
公众:
字符串(常量字符*str_in)
{
str=新字符[strlen(str_in)];
strcpy(str,stru-in);
}
~String()
{
删除[]str;
}
字符串和运算符=(常量字符*s)
{
char*tmp=新字符[strlen];
strcpy(tmp,s);
删除[]str;
str=tmp;
归还*这个;
}
};
int main()
{
字符串s(“样本”);
字符串*ss;
ss=&s;
ss=新字符串(“名称”);
删除ss;
返回0;
}
首先,您需要一个合适的析构函数,否则当字符串被销毁时,您将出现内存泄漏。删除char*可以解决这个问题(因为它是一个数组,所以我们使用数组删除)
第二,在C++中,我们几乎总是返回操作符=(不是指针)的引用。所以这个修改后的operator=函数可能更好——它删除旧字符串,为新字符串分配内存,复制新字符串,并返回*this
第三,您可以对构造函数和赋值运算符使用const char*而不是char*,因为您没有编辑它
在main()中,我还为指向的指针创建了一个新对象,因为您在原始帖子中请求了该对象(随后将其删除以避免内存泄漏)
如果您对这些更改有任何疑问,请告诉我。这是一种练习吗?std::string
在您的情况下不可用吗?是的,这只是一个练习。ss=*ss=“name”代码>不编译。它编译并按预期工作。在运算符=,可能建议将new&strcopy放入临时变量,然后删除&replace str。这样,如果new抛出异常,对象将保持不变。这一点很好。我刚刚编辑了它。如果你觉得好看就告诉我。看起来好多了。如能就muh的原始评论进行投票,将不胜感激。谢谢!