实际上,我对字符串操作有很多疑问。首先, 关于使用复制构造函数进行字符串连接,我很困惑。是否需要复制构造函数,或者只需使用参数化构造函数,就可以完成。我的意思是
class string{
char*p;
int size;
public: string(char *a){
size= strlen(a);
p=new char[size];
strcpy(p,a);
}
上面的代码,动态地启动对象 如果在上面的代码中作为参数传递,指针如何工作,如果我传递char数组a [] 此外,strcpy复制string.now如果我使用运算符重载,即
string operator+(string c) // i'm defining the function in class definition.
{
string t;
t.size=size + c.size;
t.p=new char[t.size];
strcat(t.p,c.p);
return t;
}
我需要复制构造函数吗?为什么? 任何人都可以解释我在使用指向char的指针时实际发生的情况 其次,在main()中如果我声明了对象。写
是不对的string ob1("Hello world");
或者我应该继续
char *str;
str="Hello world";
Plz也指出了我的代码片段中的错误,如果有的话。当我运行程序时,它会在两者之间停止并且它承诺程序已经停止工作。
为什么这样?
答案 0 :(得分:2)
我需要复制构造函数吗?
通常,管理资源的类确实存在,并且您应该提供一个(以及构造函数和复制赋值运算符)以使该类有用。
但是,你不应该只为这个运营商;但你的实施确实......
为什么?
因为您的运算符通过值获取其左侧参数,这需要将其复制。取而代之的是参考:
string operator+(string const & c) const
(两个操作数都是const
是一个好主意,既可以防止意外修改,也可以允许操作符应用于常量值。
但是,如果要修复内存泄漏(通过删除析构函数中的数组),则应提供或删除复制构造函数和复制赋值运算符以避免双重删除。有关制作类型可复制的详细信息,请参阅this question。
string ob1("Hello world");
这可能会失败(使用现代编译器),因为构造函数采用非const char*
,而字符串文字会衰减到const char*
。您应该将构造函数参数更改为const char*
以匹配(并且通常在您不需要使用它们进行修改时始终生成指针和引用const
。